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_TRUE(decoder.decompressImage(mYuvImage.buffer.get(), mYuvImage.size));
105 ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
106 EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
107 ULTRAHDR_COLORGAMUT_UNSPECIFIED);
108 }
109
TEST_F(JpegDecoderHelperTest,decodeYuvImageToRgba)110 TEST_F(JpegDecoderHelperTest, decodeYuvImageToRgba) {
111 JpegDecoderHelper decoder;
112 EXPECT_TRUE(decoder.decompressImage(mYuvImage.buffer.get(), mYuvImage.size, DECODE_TO_RGB_CS));
113 ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
114 EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
115 ULTRAHDR_COLORGAMUT_UNSPECIFIED);
116 }
117
TEST_F(JpegDecoderHelperTest,decodeYuvIccImage)118 TEST_F(JpegDecoderHelperTest, decodeYuvIccImage) {
119 JpegDecoderHelper decoder;
120 EXPECT_TRUE(decoder.decompressImage(mYuvIccImage.buffer.get(), mYuvIccImage.size));
121 ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
122 EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
123 ULTRAHDR_COLORGAMUT_BT709);
124 }
125
TEST_F(JpegDecoderHelperTest,decodeGreyImage)126 TEST_F(JpegDecoderHelperTest, decodeGreyImage) {
127 JpegDecoderHelper decoder;
128 EXPECT_TRUE(decoder.decompressImage(mGreyImage.buffer.get(), mGreyImage.size));
129 ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
130 EXPECT_TRUE(decoder.decompressImage(mGreyImage.buffer.get(), mGreyImage.size, DECODE_STREAM));
131 ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
132 }
133
TEST_F(JpegDecoderHelperTest,decodeRgbImageToRgba)134 TEST_F(JpegDecoderHelperTest, decodeRgbImageToRgba) {
135 JpegDecoderHelper decoder;
136 EXPECT_TRUE(decoder.decompressImage(mRgbImage.buffer.get(), mRgbImage.size, DECODE_STREAM));
137 ASSERT_GT(decoder.getDecompressedImageSize(), static_cast<uint32_t>(0));
138 EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
139 ULTRAHDR_COLORGAMUT_UNSPECIFIED);
140 }
141
TEST_F(JpegDecoderHelperTest,getCompressedImageParameters)142 TEST_F(JpegDecoderHelperTest, getCompressedImageParameters) {
143 JpegDecoderHelper decoder;
144 EXPECT_TRUE(decoder.parseImage(mYuvImage.buffer.get(), mYuvImage.size));
145 EXPECT_EQ(IMAGE_WIDTH, decoder.getDecompressedImageWidth());
146 EXPECT_EQ(IMAGE_HEIGHT, decoder.getDecompressedImageHeight());
147 EXPECT_EQ(decoder.getICCSize(), 0);
148 EXPECT_EQ(decoder.getEXIFSize(), 0);
149 }
150
TEST_F(JpegDecoderHelperTest,getCompressedImageParametersIcc)151 TEST_F(JpegDecoderHelperTest, getCompressedImageParametersIcc) {
152 JpegDecoderHelper decoder;
153 EXPECT_TRUE(decoder.parseImage(mYuvIccImage.buffer.get(), mYuvIccImage.size));
154 EXPECT_EQ(IMAGE_WIDTH, decoder.getDecompressedImageWidth());
155 EXPECT_EQ(IMAGE_HEIGHT, decoder.getDecompressedImageHeight());
156 EXPECT_GT(decoder.getICCSize(), 0);
157 EXPECT_GT(decoder.getEXIFSize(), 0);
158 EXPECT_EQ(IccHelper::readIccColorGamut(decoder.getICCPtr(), decoder.getICCSize()),
159 ULTRAHDR_COLORGAMUT_BT709);
160 }
161
162 } // namespace ultrahdr
163