1*89a0ef05SAndroid Build Coastguard Worker /*
2*89a0ef05SAndroid Build Coastguard Worker * Copyright 2022 The Android Open Source Project
3*89a0ef05SAndroid Build Coastguard Worker *
4*89a0ef05SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*89a0ef05SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*89a0ef05SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*89a0ef05SAndroid Build Coastguard Worker *
8*89a0ef05SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*89a0ef05SAndroid Build Coastguard Worker *
10*89a0ef05SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*89a0ef05SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*89a0ef05SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*89a0ef05SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*89a0ef05SAndroid Build Coastguard Worker * limitations under the License.
15*89a0ef05SAndroid Build Coastguard Worker */
16*89a0ef05SAndroid Build Coastguard Worker
17*89a0ef05SAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*89a0ef05SAndroid Build Coastguard Worker
19*89a0ef05SAndroid Build Coastguard Worker #include <fstream>
20*89a0ef05SAndroid Build Coastguard Worker #include <iostream>
21*89a0ef05SAndroid Build Coastguard Worker
22*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/ultrahdrcommon.h"
23*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/jpegdecoderhelper.h"
24*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/icc.h"
25*89a0ef05SAndroid Build Coastguard Worker
26*89a0ef05SAndroid Build Coastguard Worker namespace ultrahdr {
27*89a0ef05SAndroid Build Coastguard Worker
28*89a0ef05SAndroid Build Coastguard Worker // minnie-320x240-yuv.jpg & minnie-320x240-y.jpg has no icc or exif
29*89a0ef05SAndroid Build Coastguard Worker // minnie-320x240-yuv-icc.jpg has icc
30*89a0ef05SAndroid Build Coastguard Worker #ifdef __ANDROID__
31*89a0ef05SAndroid Build Coastguard Worker #define YUV_IMAGE "/data/local/tmp/minnie-320x240-yuv.jpg"
32*89a0ef05SAndroid Build Coastguard Worker #define RGB_IMAGE "/data/local/tmp/minnie-320x240-rgb.jpg"
33*89a0ef05SAndroid Build Coastguard Worker #define YUV_ICC_IMAGE "/data/local/tmp/minnie-320x240-yuv-icc.jpg"
34*89a0ef05SAndroid Build Coastguard Worker #define GREY_IMAGE "/data/local/tmp/minnie-320x240-y.jpg"
35*89a0ef05SAndroid Build Coastguard Worker #else
36*89a0ef05SAndroid Build Coastguard Worker #define YUV_IMAGE "./data/minnie-320x240-yuv.jpg"
37*89a0ef05SAndroid Build Coastguard Worker #define RGB_IMAGE "./data/minnie-320x240-rgb.jpg"
38*89a0ef05SAndroid Build Coastguard Worker #define YUV_ICC_IMAGE "./data/minnie-320x240-yuv-icc.jpg"
39*89a0ef05SAndroid Build Coastguard Worker #define GREY_IMAGE "./data/minnie-320x240-y.jpg"
40*89a0ef05SAndroid Build Coastguard Worker #endif
41*89a0ef05SAndroid Build Coastguard Worker #define YUV_IMAGE_SIZE 20193
42*89a0ef05SAndroid Build Coastguard Worker #define RGB_IMAGE_SIZE 20200
43*89a0ef05SAndroid Build Coastguard Worker #define YUV_ICC_IMAGE_SIZE 34266
44*89a0ef05SAndroid Build Coastguard Worker #define GREY_IMAGE_SIZE 20193
45*89a0ef05SAndroid Build Coastguard Worker #define IMAGE_WIDTH 320
46*89a0ef05SAndroid Build Coastguard Worker #define IMAGE_HEIGHT 240
47*89a0ef05SAndroid Build Coastguard Worker
48*89a0ef05SAndroid Build Coastguard Worker class JpegDecoderHelperTest : public testing::Test {
49*89a0ef05SAndroid Build Coastguard Worker public:
50*89a0ef05SAndroid Build Coastguard Worker struct Image {
51*89a0ef05SAndroid Build Coastguard Worker std::unique_ptr<uint8_t[]> buffer;
52*89a0ef05SAndroid Build Coastguard Worker size_t size;
53*89a0ef05SAndroid Build Coastguard Worker };
54*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelperTest();
55*89a0ef05SAndroid Build Coastguard Worker ~JpegDecoderHelperTest();
56*89a0ef05SAndroid Build Coastguard Worker
57*89a0ef05SAndroid Build Coastguard Worker protected:
58*89a0ef05SAndroid Build Coastguard Worker virtual void SetUp();
59*89a0ef05SAndroid Build Coastguard Worker virtual void TearDown();
60*89a0ef05SAndroid Build Coastguard Worker
61*89a0ef05SAndroid Build Coastguard Worker Image mYuvImage, mYuvIccImage, mGreyImage, mRgbImage;
62*89a0ef05SAndroid Build Coastguard Worker };
63*89a0ef05SAndroid Build Coastguard Worker
JpegDecoderHelperTest()64*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelperTest::JpegDecoderHelperTest() {}
65*89a0ef05SAndroid Build Coastguard Worker
~JpegDecoderHelperTest()66*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelperTest::~JpegDecoderHelperTest() {}
67*89a0ef05SAndroid Build Coastguard Worker
loadFile(const char filename[],JpegDecoderHelperTest::Image * result)68*89a0ef05SAndroid Build Coastguard Worker static bool loadFile(const char filename[], JpegDecoderHelperTest::Image* result) {
69*89a0ef05SAndroid Build Coastguard Worker std::ifstream ifd(filename, std::ios::binary | std::ios::ate);
70*89a0ef05SAndroid Build Coastguard Worker if (ifd.good()) {
71*89a0ef05SAndroid Build Coastguard Worker int size = ifd.tellg();
72*89a0ef05SAndroid Build Coastguard Worker ifd.seekg(0, std::ios::beg);
73*89a0ef05SAndroid Build Coastguard Worker result->buffer.reset(new uint8_t[size]);
74*89a0ef05SAndroid Build Coastguard Worker ifd.read(reinterpret_cast<char*>(result->buffer.get()), size);
75*89a0ef05SAndroid Build Coastguard Worker ifd.close();
76*89a0ef05SAndroid Build Coastguard Worker return true;
77*89a0ef05SAndroid Build Coastguard Worker }
78*89a0ef05SAndroid Build Coastguard Worker return false;
79*89a0ef05SAndroid Build Coastguard Worker }
80*89a0ef05SAndroid Build Coastguard Worker
SetUp()81*89a0ef05SAndroid Build Coastguard Worker void JpegDecoderHelperTest::SetUp() {
82*89a0ef05SAndroid Build Coastguard Worker if (!loadFile(YUV_IMAGE, &mYuvImage)) {
83*89a0ef05SAndroid Build Coastguard Worker FAIL() << "Load file " << YUV_IMAGE << " failed";
84*89a0ef05SAndroid Build Coastguard Worker }
85*89a0ef05SAndroid Build Coastguard Worker mYuvImage.size = YUV_IMAGE_SIZE;
86*89a0ef05SAndroid Build Coastguard Worker if (!loadFile(YUV_ICC_IMAGE, &mYuvIccImage)) {
87*89a0ef05SAndroid Build Coastguard Worker FAIL() << "Load file " << YUV_ICC_IMAGE << " failed";
88*89a0ef05SAndroid Build Coastguard Worker }
89*89a0ef05SAndroid Build Coastguard Worker mYuvIccImage.size = YUV_ICC_IMAGE_SIZE;
90*89a0ef05SAndroid Build Coastguard Worker if (!loadFile(GREY_IMAGE, &mGreyImage)) {
91*89a0ef05SAndroid Build Coastguard Worker FAIL() << "Load file " << GREY_IMAGE << " failed";
92*89a0ef05SAndroid Build Coastguard Worker }
93*89a0ef05SAndroid Build Coastguard Worker mGreyImage.size = GREY_IMAGE_SIZE;
94*89a0ef05SAndroid Build Coastguard Worker if (!loadFile(RGB_IMAGE, &mRgbImage)) {
95*89a0ef05SAndroid Build Coastguard Worker FAIL() << "Load file " << RGB_IMAGE << " failed";
96*89a0ef05SAndroid Build Coastguard Worker }
97*89a0ef05SAndroid Build Coastguard Worker mRgbImage.size = RGB_IMAGE_SIZE;
98*89a0ef05SAndroid Build Coastguard Worker }
99*89a0ef05SAndroid Build Coastguard Worker
TearDown()100*89a0ef05SAndroid Build Coastguard Worker void JpegDecoderHelperTest::TearDown() {}
101*89a0ef05SAndroid Build Coastguard Worker
TEST_F(JpegDecoderHelperTest,decodeYuvImage)102*89a0ef05SAndroid Build Coastguard Worker TEST_F(JpegDecoderHelperTest, decodeYuvImage) {
103*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelper decoder;
104*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(decoder.decompressImage(mYuvImage.buffer.get(), mYuvImage.size).error_code,
105*89a0ef05SAndroid Build Coastguard Worker UHDR_CODEC_OK);
106*89a0ef05SAndroid Build Coastguard Worker ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
107*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
108*89a0ef05SAndroid Build Coastguard Worker UHDR_CG_UNSPECIFIED);
109*89a0ef05SAndroid Build Coastguard Worker }
110*89a0ef05SAndroid Build Coastguard Worker
TEST_F(JpegDecoderHelperTest,decodeYuvImageToRgba)111*89a0ef05SAndroid Build Coastguard Worker TEST_F(JpegDecoderHelperTest, decodeYuvImageToRgba) {
112*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelper decoder;
113*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(
114*89a0ef05SAndroid Build Coastguard Worker decoder.decompressImage(mYuvImage.buffer.get(), mYuvImage.size, DECODE_TO_RGB_CS).error_code,
115*89a0ef05SAndroid Build Coastguard Worker UHDR_CODEC_OK);
116*89a0ef05SAndroid Build Coastguard Worker ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
117*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
118*89a0ef05SAndroid Build Coastguard Worker UHDR_CG_UNSPECIFIED);
119*89a0ef05SAndroid Build Coastguard Worker }
120*89a0ef05SAndroid Build Coastguard Worker
TEST_F(JpegDecoderHelperTest,decodeYuvIccImage)121*89a0ef05SAndroid Build Coastguard Worker TEST_F(JpegDecoderHelperTest, decodeYuvIccImage) {
122*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelper decoder;
123*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(decoder.decompressImage(mYuvIccImage.buffer.get(), mYuvIccImage.size).error_code,
124*89a0ef05SAndroid Build Coastguard Worker UHDR_CODEC_OK);
125*89a0ef05SAndroid Build Coastguard Worker ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
126*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
127*89a0ef05SAndroid Build Coastguard Worker UHDR_CG_BT_709);
128*89a0ef05SAndroid Build Coastguard Worker }
129*89a0ef05SAndroid Build Coastguard Worker
TEST_F(JpegDecoderHelperTest,decodeGreyImage)130*89a0ef05SAndroid Build Coastguard Worker TEST_F(JpegDecoderHelperTest, decodeGreyImage) {
131*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelper decoder;
132*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(decoder.decompressImage(mGreyImage.buffer.get(), mGreyImage.size).error_code,
133*89a0ef05SAndroid Build Coastguard Worker UHDR_CODEC_OK);
134*89a0ef05SAndroid Build Coastguard Worker ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
135*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(
136*89a0ef05SAndroid Build Coastguard Worker decoder.decompressImage(mGreyImage.buffer.get(), mGreyImage.size, DECODE_STREAM).error_code,
137*89a0ef05SAndroid Build Coastguard Worker UHDR_CODEC_OK);
138*89a0ef05SAndroid Build Coastguard Worker ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
139*89a0ef05SAndroid Build Coastguard Worker }
140*89a0ef05SAndroid Build Coastguard Worker
TEST_F(JpegDecoderHelperTest,decodeRgbImageToRgba)141*89a0ef05SAndroid Build Coastguard Worker TEST_F(JpegDecoderHelperTest, decodeRgbImageToRgba) {
142*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelper decoder;
143*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(
144*89a0ef05SAndroid Build Coastguard Worker decoder.decompressImage(mRgbImage.buffer.get(), mRgbImage.size, DECODE_STREAM).error_code,
145*89a0ef05SAndroid Build Coastguard Worker UHDR_CODEC_OK);
146*89a0ef05SAndroid Build Coastguard Worker ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
147*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
148*89a0ef05SAndroid Build Coastguard Worker UHDR_CG_UNSPECIFIED);
149*89a0ef05SAndroid Build Coastguard Worker }
150*89a0ef05SAndroid Build Coastguard Worker
TEST_F(JpegDecoderHelperTest,getCompressedImageParameters)151*89a0ef05SAndroid Build Coastguard Worker TEST_F(JpegDecoderHelperTest, getCompressedImageParameters) {
152*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelper decoder;
153*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(decoder.parseImage(mYuvImage.buffer.get(), mYuvImage.size).error_code, UHDR_CODEC_OK);
154*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IMAGE_WIDTH, decoder.getDecompressedImageWidth());
155*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IMAGE_HEIGHT, decoder.getDecompressedImageHeight());
156*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(decoder.getICCSize(), 0);
157*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(decoder.getEXIFSize(), 0);
158*89a0ef05SAndroid Build Coastguard Worker }
159*89a0ef05SAndroid Build Coastguard Worker
TEST_F(JpegDecoderHelperTest,getCompressedImageParametersIcc)160*89a0ef05SAndroid Build Coastguard Worker TEST_F(JpegDecoderHelperTest, getCompressedImageParametersIcc) {
161*89a0ef05SAndroid Build Coastguard Worker JpegDecoderHelper decoder;
162*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(decoder.parseImage(mYuvIccImage.buffer.get(), mYuvIccImage.size).error_code,
163*89a0ef05SAndroid Build Coastguard Worker UHDR_CODEC_OK);
164*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IMAGE_WIDTH, decoder.getDecompressedImageWidth());
165*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IMAGE_HEIGHT, decoder.getDecompressedImageHeight());
166*89a0ef05SAndroid Build Coastguard Worker EXPECT_GT(decoder.getICCSize(), 0);
167*89a0ef05SAndroid Build Coastguard Worker EXPECT_GT(decoder.getEXIFSize(), 0);
168*89a0ef05SAndroid Build Coastguard Worker EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
169*89a0ef05SAndroid Build Coastguard Worker UHDR_CG_BT_709);
170*89a0ef05SAndroid Build Coastguard Worker }
171*89a0ef05SAndroid Build Coastguard Worker
172*89a0ef05SAndroid Build Coastguard Worker } // namespace ultrahdr
173