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