xref: /aosp_15_r20/external/libultrahdr/tests/jpegdecoderhelper_test.cpp (revision 89a0ef05262152531a00a15832a2d3b1e3990773)
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