xref: /aosp_15_r20/external/libultrahdr/tests/jpegr_test.cpp (revision 89a0ef05262152531a00a15832a2d3b1e3990773)
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 #ifdef _WIN32
18*89a0ef05SAndroid Build Coastguard Worker #include <windows.h>
19*89a0ef05SAndroid Build Coastguard Worker #else
20*89a0ef05SAndroid Build Coastguard Worker #include <sys/time.h>
21*89a0ef05SAndroid Build Coastguard Worker #endif
22*89a0ef05SAndroid Build Coastguard Worker #include <gtest/gtest.h>
23*89a0ef05SAndroid Build Coastguard Worker 
24*89a0ef05SAndroid Build Coastguard Worker #include <fstream>
25*89a0ef05SAndroid Build Coastguard Worker #include <iostream>
26*89a0ef05SAndroid Build Coastguard Worker 
27*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr_api.h"
28*89a0ef05SAndroid Build Coastguard Worker 
29*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/ultrahdrcommon.h"
30*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/jpegr.h"
31*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/jpegrutils.h"
32*89a0ef05SAndroid Build Coastguard Worker 
33*89a0ef05SAndroid Build Coastguard Worker //#define DUMP_OUTPUT
34*89a0ef05SAndroid Build Coastguard Worker 
35*89a0ef05SAndroid Build Coastguard Worker namespace ultrahdr {
36*89a0ef05SAndroid Build Coastguard Worker 
37*89a0ef05SAndroid Build Coastguard Worker // resources used by unit tests
38*89a0ef05SAndroid Build Coastguard Worker #ifdef __ANDROID__
39*89a0ef05SAndroid Build Coastguard Worker const char* kYCbCrP010FileName = "/data/local/tmp/raw_p010_image.p010";
40*89a0ef05SAndroid Build Coastguard Worker const char* kYCbCr420FileName = "/data/local/tmp/raw_yuv420_image.yuv420";
41*89a0ef05SAndroid Build Coastguard Worker const char* kSdrJpgFileName = "/data/local/tmp/jpeg_image.jpg";
42*89a0ef05SAndroid Build Coastguard Worker #else
43*89a0ef05SAndroid Build Coastguard Worker const char* kYCbCrP010FileName = "./data/raw_p010_image.p010";
44*89a0ef05SAndroid Build Coastguard Worker const char* kYCbCr420FileName = "./data/raw_yuv420_image.yuv420";
45*89a0ef05SAndroid Build Coastguard Worker const char* kSdrJpgFileName = "./data/jpeg_image.jpg";
46*89a0ef05SAndroid Build Coastguard Worker #endif
47*89a0ef05SAndroid Build Coastguard Worker const size_t kImageWidth = 1280;
48*89a0ef05SAndroid Build Coastguard Worker const size_t kImageHeight = 720;
49*89a0ef05SAndroid Build Coastguard Worker const int kQuality = 90;
50*89a0ef05SAndroid Build Coastguard Worker 
51*89a0ef05SAndroid Build Coastguard Worker // Wrapper to describe the input type
52*89a0ef05SAndroid Build Coastguard Worker typedef enum {
53*89a0ef05SAndroid Build Coastguard Worker   YCbCr_p010 = 0,
54*89a0ef05SAndroid Build Coastguard Worker   YCbCr_420 = 1,
55*89a0ef05SAndroid Build Coastguard Worker } UhdrInputFormat;
56*89a0ef05SAndroid Build Coastguard Worker 
57*89a0ef05SAndroid Build Coastguard Worker /**
58*89a0ef05SAndroid Build Coastguard Worker  * Wrapper class for raw resource
59*89a0ef05SAndroid Build Coastguard Worker  * Sample usage:
60*89a0ef05SAndroid Build Coastguard Worker  *   UhdrUnCompressedStructWrapper rawImg(width, height, YCbCr_p010);
61*89a0ef05SAndroid Build Coastguard Worker  *   rawImg.setImageColorGamut(colorGamut));
62*89a0ef05SAndroid Build Coastguard Worker  *   rawImg.setImageStride(strideLuma, strideChroma); // optional
63*89a0ef05SAndroid Build Coastguard Worker  *   rawImg.setChromaMode(false); // optional
64*89a0ef05SAndroid Build Coastguard Worker  *   rawImg.allocateMemory();
65*89a0ef05SAndroid Build Coastguard Worker  *   rawImg.loadRawResource(kYCbCrP010FileName);
66*89a0ef05SAndroid Build Coastguard Worker  */
67*89a0ef05SAndroid Build Coastguard Worker class UhdrUnCompressedStructWrapper {
68*89a0ef05SAndroid Build Coastguard Worker  public:
69*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper(unsigned int width, unsigned int height, UhdrInputFormat format);
70*89a0ef05SAndroid Build Coastguard Worker   ~UhdrUnCompressedStructWrapper() = default;
71*89a0ef05SAndroid Build Coastguard Worker 
72*89a0ef05SAndroid Build Coastguard Worker   bool setChromaMode(bool isChromaContiguous);
73*89a0ef05SAndroid Build Coastguard Worker   bool setImageStride(unsigned int lumaStride, unsigned int chromaStride);
74*89a0ef05SAndroid Build Coastguard Worker   bool setImageColorGamut(ultrahdr_color_gamut colorGamut);
75*89a0ef05SAndroid Build Coastguard Worker   bool allocateMemory();
76*89a0ef05SAndroid Build Coastguard Worker   bool loadRawResource(const char* fileName);
77*89a0ef05SAndroid Build Coastguard Worker   jr_uncompressed_ptr getImageHandle();
78*89a0ef05SAndroid Build Coastguard Worker 
79*89a0ef05SAndroid Build Coastguard Worker  private:
80*89a0ef05SAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> mLumaData;
81*89a0ef05SAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> mChromaData;
82*89a0ef05SAndroid Build Coastguard Worker   jpegr_uncompressed_struct mImg;
83*89a0ef05SAndroid Build Coastguard Worker   UhdrInputFormat mFormat;
84*89a0ef05SAndroid Build Coastguard Worker   bool mIsChromaContiguous;
85*89a0ef05SAndroid Build Coastguard Worker };
86*89a0ef05SAndroid Build Coastguard Worker 
87*89a0ef05SAndroid Build Coastguard Worker /**
88*89a0ef05SAndroid Build Coastguard Worker  * Wrapper class for compressed resource
89*89a0ef05SAndroid Build Coastguard Worker  * Sample usage:
90*89a0ef05SAndroid Build Coastguard Worker  *   UhdrCompressedStructWrapper jpgImg(width, height);
91*89a0ef05SAndroid Build Coastguard Worker  *   rawImg.allocateMemory();
92*89a0ef05SAndroid Build Coastguard Worker  */
93*89a0ef05SAndroid Build Coastguard Worker class UhdrCompressedStructWrapper {
94*89a0ef05SAndroid Build Coastguard Worker  public:
95*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper(unsigned int width, unsigned int height);
96*89a0ef05SAndroid Build Coastguard Worker   ~UhdrCompressedStructWrapper() = default;
97*89a0ef05SAndroid Build Coastguard Worker 
98*89a0ef05SAndroid Build Coastguard Worker   bool allocateMemory();
99*89a0ef05SAndroid Build Coastguard Worker   jr_compressed_ptr getImageHandle();
100*89a0ef05SAndroid Build Coastguard Worker 
101*89a0ef05SAndroid Build Coastguard Worker  private:
102*89a0ef05SAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> mData;
103*89a0ef05SAndroid Build Coastguard Worker   jpegr_compressed_struct mImg{};
104*89a0ef05SAndroid Build Coastguard Worker   unsigned int mWidth;
105*89a0ef05SAndroid Build Coastguard Worker   unsigned int mHeight;
106*89a0ef05SAndroid Build Coastguard Worker };
107*89a0ef05SAndroid Build Coastguard Worker 
UhdrUnCompressedStructWrapper(unsigned int width,unsigned int height,UhdrInputFormat format)108*89a0ef05SAndroid Build Coastguard Worker UhdrUnCompressedStructWrapper::UhdrUnCompressedStructWrapper(unsigned int width,
109*89a0ef05SAndroid Build Coastguard Worker                                                              unsigned int height,
110*89a0ef05SAndroid Build Coastguard Worker                                                              UhdrInputFormat format) {
111*89a0ef05SAndroid Build Coastguard Worker   mImg.data = nullptr;
112*89a0ef05SAndroid Build Coastguard Worker   mImg.width = width;
113*89a0ef05SAndroid Build Coastguard Worker   mImg.height = height;
114*89a0ef05SAndroid Build Coastguard Worker   mImg.colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED;
115*89a0ef05SAndroid Build Coastguard Worker   mImg.chroma_data = nullptr;
116*89a0ef05SAndroid Build Coastguard Worker   mImg.luma_stride = 0;
117*89a0ef05SAndroid Build Coastguard Worker   mImg.chroma_stride = 0;
118*89a0ef05SAndroid Build Coastguard Worker   mFormat = format;
119*89a0ef05SAndroid Build Coastguard Worker   mIsChromaContiguous = true;
120*89a0ef05SAndroid Build Coastguard Worker }
121*89a0ef05SAndroid Build Coastguard Worker 
setChromaMode(bool isChromaContiguous)122*89a0ef05SAndroid Build Coastguard Worker bool UhdrUnCompressedStructWrapper::setChromaMode(bool isChromaContiguous) {
123*89a0ef05SAndroid Build Coastguard Worker   if (mLumaData.get() != nullptr) {
124*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
125*89a0ef05SAndroid Build Coastguard Worker     return false;
126*89a0ef05SAndroid Build Coastguard Worker   }
127*89a0ef05SAndroid Build Coastguard Worker   mIsChromaContiguous = isChromaContiguous;
128*89a0ef05SAndroid Build Coastguard Worker   return true;
129*89a0ef05SAndroid Build Coastguard Worker }
130*89a0ef05SAndroid Build Coastguard Worker 
setImageStride(unsigned int lumaStride,unsigned int chromaStride)131*89a0ef05SAndroid Build Coastguard Worker bool UhdrUnCompressedStructWrapper::setImageStride(unsigned int lumaStride,
132*89a0ef05SAndroid Build Coastguard Worker                                                    unsigned int chromaStride) {
133*89a0ef05SAndroid Build Coastguard Worker   if (mLumaData.get() != nullptr) {
134*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
135*89a0ef05SAndroid Build Coastguard Worker     return false;
136*89a0ef05SAndroid Build Coastguard Worker   }
137*89a0ef05SAndroid Build Coastguard Worker   if (lumaStride != 0) {
138*89a0ef05SAndroid Build Coastguard Worker     if (lumaStride < mImg.width) {
139*89a0ef05SAndroid Build Coastguard Worker       std::cerr << "Bad luma stride received" << std::endl;
140*89a0ef05SAndroid Build Coastguard Worker       return false;
141*89a0ef05SAndroid Build Coastguard Worker     }
142*89a0ef05SAndroid Build Coastguard Worker     mImg.luma_stride = lumaStride;
143*89a0ef05SAndroid Build Coastguard Worker   }
144*89a0ef05SAndroid Build Coastguard Worker   if (chromaStride != 0) {
145*89a0ef05SAndroid Build Coastguard Worker     if (mFormat == YCbCr_p010 && chromaStride < mImg.width) {
146*89a0ef05SAndroid Build Coastguard Worker       std::cerr << "Bad chroma stride received for format YCbCrP010" << std::endl;
147*89a0ef05SAndroid Build Coastguard Worker       return false;
148*89a0ef05SAndroid Build Coastguard Worker     }
149*89a0ef05SAndroid Build Coastguard Worker     if (mFormat == YCbCr_420 && chromaStride < (mImg.width >> 1)) {
150*89a0ef05SAndroid Build Coastguard Worker       std::cerr << "Bad chroma stride received for format YCbCr420" << std::endl;
151*89a0ef05SAndroid Build Coastguard Worker       return false;
152*89a0ef05SAndroid Build Coastguard Worker     }
153*89a0ef05SAndroid Build Coastguard Worker     mImg.chroma_stride = chromaStride;
154*89a0ef05SAndroid Build Coastguard Worker   }
155*89a0ef05SAndroid Build Coastguard Worker   return true;
156*89a0ef05SAndroid Build Coastguard Worker }
157*89a0ef05SAndroid Build Coastguard Worker 
setImageColorGamut(ultrahdr_color_gamut colorGamut)158*89a0ef05SAndroid Build Coastguard Worker bool UhdrUnCompressedStructWrapper::setImageColorGamut(ultrahdr_color_gamut colorGamut) {
159*89a0ef05SAndroid Build Coastguard Worker   if (mLumaData.get() != nullptr) {
160*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
161*89a0ef05SAndroid Build Coastguard Worker     return false;
162*89a0ef05SAndroid Build Coastguard Worker   }
163*89a0ef05SAndroid Build Coastguard Worker   mImg.colorGamut = colorGamut;
164*89a0ef05SAndroid Build Coastguard Worker   return true;
165*89a0ef05SAndroid Build Coastguard Worker }
166*89a0ef05SAndroid Build Coastguard Worker 
allocateMemory()167*89a0ef05SAndroid Build Coastguard Worker bool UhdrUnCompressedStructWrapper::allocateMemory() {
168*89a0ef05SAndroid Build Coastguard Worker   if (mImg.width == 0 || (mImg.width % 2 != 0) || mImg.height == 0 || (mImg.height % 2 != 0) ||
169*89a0ef05SAndroid Build Coastguard Worker       (mFormat != YCbCr_p010 && mFormat != YCbCr_420)) {
170*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "Object in bad state, mem alloc failed" << std::endl;
171*89a0ef05SAndroid Build Coastguard Worker     return false;
172*89a0ef05SAndroid Build Coastguard Worker   }
173*89a0ef05SAndroid Build Coastguard Worker   int lumaStride = mImg.luma_stride == 0 ? mImg.width : mImg.luma_stride;
174*89a0ef05SAndroid Build Coastguard Worker   int lumaSize = lumaStride * mImg.height * (mFormat == YCbCr_p010 ? 2 : 1);
175*89a0ef05SAndroid Build Coastguard Worker   int chromaSize = (mImg.height >> 1) * (mFormat == YCbCr_p010 ? 2 : 1);
176*89a0ef05SAndroid Build Coastguard Worker   if (mIsChromaContiguous) {
177*89a0ef05SAndroid Build Coastguard Worker     chromaSize *= lumaStride;
178*89a0ef05SAndroid Build Coastguard Worker   } else {
179*89a0ef05SAndroid Build Coastguard Worker     if (mImg.chroma_stride == 0) {
180*89a0ef05SAndroid Build Coastguard Worker       std::cerr << "Object in bad state, mem alloc failed" << std::endl;
181*89a0ef05SAndroid Build Coastguard Worker       return false;
182*89a0ef05SAndroid Build Coastguard Worker     }
183*89a0ef05SAndroid Build Coastguard Worker     if (mFormat == YCbCr_p010) {
184*89a0ef05SAndroid Build Coastguard Worker       chromaSize *= mImg.chroma_stride;
185*89a0ef05SAndroid Build Coastguard Worker     } else {
186*89a0ef05SAndroid Build Coastguard Worker       chromaSize *= (mImg.chroma_stride * 2);
187*89a0ef05SAndroid Build Coastguard Worker     }
188*89a0ef05SAndroid Build Coastguard Worker   }
189*89a0ef05SAndroid Build Coastguard Worker   if (mIsChromaContiguous) {
190*89a0ef05SAndroid Build Coastguard Worker     mLumaData = std::make_unique<uint8_t[]>(lumaSize + chromaSize);
191*89a0ef05SAndroid Build Coastguard Worker     mImg.data = mLumaData.get();
192*89a0ef05SAndroid Build Coastguard Worker     mImg.chroma_data = nullptr;
193*89a0ef05SAndroid Build Coastguard Worker   } else {
194*89a0ef05SAndroid Build Coastguard Worker     mLumaData = std::make_unique<uint8_t[]>(lumaSize);
195*89a0ef05SAndroid Build Coastguard Worker     mImg.data = mLumaData.get();
196*89a0ef05SAndroid Build Coastguard Worker     mChromaData = std::make_unique<uint8_t[]>(chromaSize);
197*89a0ef05SAndroid Build Coastguard Worker     mImg.chroma_data = mChromaData.get();
198*89a0ef05SAndroid Build Coastguard Worker   }
199*89a0ef05SAndroid Build Coastguard Worker   return true;
200*89a0ef05SAndroid Build Coastguard Worker }
201*89a0ef05SAndroid Build Coastguard Worker 
loadRawResource(const char * fileName)202*89a0ef05SAndroid Build Coastguard Worker bool UhdrUnCompressedStructWrapper::loadRawResource(const char* fileName) {
203*89a0ef05SAndroid Build Coastguard Worker   if (!mImg.data) {
204*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "memory is not allocated, read not possible" << std::endl;
205*89a0ef05SAndroid Build Coastguard Worker     return false;
206*89a0ef05SAndroid Build Coastguard Worker   }
207*89a0ef05SAndroid Build Coastguard Worker   std::ifstream ifd(fileName, std::ios::binary | std::ios::ate);
208*89a0ef05SAndroid Build Coastguard Worker   if (ifd.good()) {
209*89a0ef05SAndroid Build Coastguard Worker     int bpp = mFormat == YCbCr_p010 ? 2 : 1;
210*89a0ef05SAndroid Build Coastguard Worker     int size = ifd.tellg();
211*89a0ef05SAndroid Build Coastguard Worker     int length = mImg.width * mImg.height * bpp * 3 / 2;  // 2x2 subsampling
212*89a0ef05SAndroid Build Coastguard Worker     if (size < length) {
213*89a0ef05SAndroid Build Coastguard Worker       std::cerr << "requested to read " << length << " bytes from file : " << fileName
214*89a0ef05SAndroid Build Coastguard Worker                 << ", file contains only " << length << " bytes" << std::endl;
215*89a0ef05SAndroid Build Coastguard Worker       return false;
216*89a0ef05SAndroid Build Coastguard Worker     }
217*89a0ef05SAndroid Build Coastguard Worker     ifd.seekg(0, std::ios::beg);
218*89a0ef05SAndroid Build Coastguard Worker     size_t lumaStride = mImg.luma_stride == 0 ? mImg.width : mImg.luma_stride;
219*89a0ef05SAndroid Build Coastguard Worker     char* mem = static_cast<char*>(mImg.data);
220*89a0ef05SAndroid Build Coastguard Worker     for (size_t i = 0; i < mImg.height; i++) {
221*89a0ef05SAndroid Build Coastguard Worker       ifd.read(mem, mImg.width * bpp);
222*89a0ef05SAndroid Build Coastguard Worker       mem += lumaStride * bpp;
223*89a0ef05SAndroid Build Coastguard Worker     }
224*89a0ef05SAndroid Build Coastguard Worker     if (!mIsChromaContiguous) {
225*89a0ef05SAndroid Build Coastguard Worker       mem = static_cast<char*>(mImg.chroma_data);
226*89a0ef05SAndroid Build Coastguard Worker     }
227*89a0ef05SAndroid Build Coastguard Worker     size_t chromaStride;
228*89a0ef05SAndroid Build Coastguard Worker     if (mIsChromaContiguous) {
229*89a0ef05SAndroid Build Coastguard Worker       chromaStride = mFormat == YCbCr_p010 ? lumaStride : lumaStride / 2;
230*89a0ef05SAndroid Build Coastguard Worker     } else {
231*89a0ef05SAndroid Build Coastguard Worker       if (mFormat == YCbCr_p010) {
232*89a0ef05SAndroid Build Coastguard Worker         chromaStride = mImg.chroma_stride == 0 ? lumaStride : mImg.chroma_stride;
233*89a0ef05SAndroid Build Coastguard Worker       } else {
234*89a0ef05SAndroid Build Coastguard Worker         chromaStride = mImg.chroma_stride == 0 ? (lumaStride / 2) : mImg.chroma_stride;
235*89a0ef05SAndroid Build Coastguard Worker       }
236*89a0ef05SAndroid Build Coastguard Worker     }
237*89a0ef05SAndroid Build Coastguard Worker     if (mFormat == YCbCr_p010) {
238*89a0ef05SAndroid Build Coastguard Worker       for (size_t i = 0; i < mImg.height / 2; i++) {
239*89a0ef05SAndroid Build Coastguard Worker         ifd.read(mem, mImg.width * 2);
240*89a0ef05SAndroid Build Coastguard Worker         mem += chromaStride * 2;
241*89a0ef05SAndroid Build Coastguard Worker       }
242*89a0ef05SAndroid Build Coastguard Worker     } else {
243*89a0ef05SAndroid Build Coastguard Worker       for (size_t i = 0; i < mImg.height / 2; i++) {
244*89a0ef05SAndroid Build Coastguard Worker         ifd.read(mem, (mImg.width / 2));
245*89a0ef05SAndroid Build Coastguard Worker         mem += chromaStride;
246*89a0ef05SAndroid Build Coastguard Worker       }
247*89a0ef05SAndroid Build Coastguard Worker       for (size_t i = 0; i < mImg.height / 2; i++) {
248*89a0ef05SAndroid Build Coastguard Worker         ifd.read(mem, (mImg.width / 2));
249*89a0ef05SAndroid Build Coastguard Worker         mem += chromaStride;
250*89a0ef05SAndroid Build Coastguard Worker       }
251*89a0ef05SAndroid Build Coastguard Worker     }
252*89a0ef05SAndroid Build Coastguard Worker     return true;
253*89a0ef05SAndroid Build Coastguard Worker   }
254*89a0ef05SAndroid Build Coastguard Worker   std::cerr << "unable to open file : " << fileName << std::endl;
255*89a0ef05SAndroid Build Coastguard Worker   return false;
256*89a0ef05SAndroid Build Coastguard Worker }
257*89a0ef05SAndroid Build Coastguard Worker 
getImageHandle()258*89a0ef05SAndroid Build Coastguard Worker jr_uncompressed_ptr UhdrUnCompressedStructWrapper::getImageHandle() { return &mImg; }
259*89a0ef05SAndroid Build Coastguard Worker 
UhdrCompressedStructWrapper(unsigned int width,unsigned int height)260*89a0ef05SAndroid Build Coastguard Worker UhdrCompressedStructWrapper::UhdrCompressedStructWrapper(unsigned int width, unsigned int height) {
261*89a0ef05SAndroid Build Coastguard Worker   mWidth = width;
262*89a0ef05SAndroid Build Coastguard Worker   mHeight = height;
263*89a0ef05SAndroid Build Coastguard Worker }
264*89a0ef05SAndroid Build Coastguard Worker 
allocateMemory()265*89a0ef05SAndroid Build Coastguard Worker bool UhdrCompressedStructWrapper::allocateMemory() {
266*89a0ef05SAndroid Build Coastguard Worker   if (mWidth == 0 || (mWidth % 2 != 0) || mHeight == 0 || (mHeight % 2 != 0)) {
267*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "Object in bad state, mem alloc failed" << std::endl;
268*89a0ef05SAndroid Build Coastguard Worker     return false;
269*89a0ef05SAndroid Build Coastguard Worker   }
270*89a0ef05SAndroid Build Coastguard Worker   int maxLength = (std::max)(8 * 1024 /* min size 8kb */, (int)(mWidth * mHeight * 3 * 2));
271*89a0ef05SAndroid Build Coastguard Worker   mData = std::make_unique<uint8_t[]>(maxLength);
272*89a0ef05SAndroid Build Coastguard Worker   mImg.data = mData.get();
273*89a0ef05SAndroid Build Coastguard Worker   mImg.length = 0;
274*89a0ef05SAndroid Build Coastguard Worker   mImg.maxLength = maxLength;
275*89a0ef05SAndroid Build Coastguard Worker   return true;
276*89a0ef05SAndroid Build Coastguard Worker }
277*89a0ef05SAndroid Build Coastguard Worker 
getImageHandle()278*89a0ef05SAndroid Build Coastguard Worker jr_compressed_ptr UhdrCompressedStructWrapper::getImageHandle() { return &mImg; }
279*89a0ef05SAndroid Build Coastguard Worker 
280*89a0ef05SAndroid Build Coastguard Worker #ifdef DUMP_OUTPUT
writeFile(const char * filename,void * & result,int length)281*89a0ef05SAndroid Build Coastguard Worker static bool writeFile(const char* filename, void*& result, int length) {
282*89a0ef05SAndroid Build Coastguard Worker   std::ofstream ofd(filename, std::ios::binary);
283*89a0ef05SAndroid Build Coastguard Worker   if (ofd.is_open()) {
284*89a0ef05SAndroid Build Coastguard Worker     ofd.write(static_cast<char*>(result), length);
285*89a0ef05SAndroid Build Coastguard Worker     return true;
286*89a0ef05SAndroid Build Coastguard Worker   }
287*89a0ef05SAndroid Build Coastguard Worker   std::cerr << "unable to write to file : " << filename << std::endl;
288*89a0ef05SAndroid Build Coastguard Worker   return false;
289*89a0ef05SAndroid Build Coastguard Worker }
290*89a0ef05SAndroid Build Coastguard Worker #endif
291*89a0ef05SAndroid Build Coastguard Worker 
readFile(const char * fileName,void * & result,size_t maxLength,size_t & length)292*89a0ef05SAndroid Build Coastguard Worker static bool readFile(const char* fileName, void*& result, size_t maxLength, size_t& length) {
293*89a0ef05SAndroid Build Coastguard Worker   std::ifstream ifd(fileName, std::ios::binary | std::ios::ate);
294*89a0ef05SAndroid Build Coastguard Worker   if (ifd.good()) {
295*89a0ef05SAndroid Build Coastguard Worker     length = ifd.tellg();
296*89a0ef05SAndroid Build Coastguard Worker     if (length > maxLength) {
297*89a0ef05SAndroid Build Coastguard Worker       std::cerr << "not enough space to read file" << std::endl;
298*89a0ef05SAndroid Build Coastguard Worker       return false;
299*89a0ef05SAndroid Build Coastguard Worker     }
300*89a0ef05SAndroid Build Coastguard Worker     ifd.seekg(0, std::ios::beg);
301*89a0ef05SAndroid Build Coastguard Worker     ifd.read(static_cast<char*>(result), length);
302*89a0ef05SAndroid Build Coastguard Worker     return true;
303*89a0ef05SAndroid Build Coastguard Worker   }
304*89a0ef05SAndroid Build Coastguard Worker   std::cerr << "unable to read file : " << fileName << std::endl;
305*89a0ef05SAndroid Build Coastguard Worker   return false;
306*89a0ef05SAndroid Build Coastguard Worker }
307*89a0ef05SAndroid Build Coastguard Worker 
map_internal_cg_to_cg(ultrahdr::ultrahdr_color_gamut cg)308*89a0ef05SAndroid Build Coastguard Worker uhdr_color_gamut_t map_internal_cg_to_cg(ultrahdr::ultrahdr_color_gamut cg) {
309*89a0ef05SAndroid Build Coastguard Worker   switch (cg) {
310*89a0ef05SAndroid Build Coastguard Worker     case ultrahdr::ULTRAHDR_COLORGAMUT_BT2100:
311*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CG_BT_2100;
312*89a0ef05SAndroid Build Coastguard Worker     case ultrahdr::ULTRAHDR_COLORGAMUT_BT709:
313*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CG_BT_709;
314*89a0ef05SAndroid Build Coastguard Worker     case ultrahdr::ULTRAHDR_COLORGAMUT_P3:
315*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CG_DISPLAY_P3;
316*89a0ef05SAndroid Build Coastguard Worker     default:
317*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CG_UNSPECIFIED;
318*89a0ef05SAndroid Build Coastguard Worker   }
319*89a0ef05SAndroid Build Coastguard Worker }
320*89a0ef05SAndroid Build Coastguard Worker 
map_internal_ct_to_ct(ultrahdr::ultrahdr_transfer_function ct)321*89a0ef05SAndroid Build Coastguard Worker uhdr_color_transfer_t map_internal_ct_to_ct(ultrahdr::ultrahdr_transfer_function ct) {
322*89a0ef05SAndroid Build Coastguard Worker   switch (ct) {
323*89a0ef05SAndroid Build Coastguard Worker     case ultrahdr::ULTRAHDR_TF_HLG:
324*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CT_HLG;
325*89a0ef05SAndroid Build Coastguard Worker     case ultrahdr::ULTRAHDR_TF_PQ:
326*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CT_PQ;
327*89a0ef05SAndroid Build Coastguard Worker     case ultrahdr::ULTRAHDR_TF_LINEAR:
328*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CT_LINEAR;
329*89a0ef05SAndroid Build Coastguard Worker     case ultrahdr::ULTRAHDR_TF_SRGB:
330*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CT_SRGB;
331*89a0ef05SAndroid Build Coastguard Worker     default:
332*89a0ef05SAndroid Build Coastguard Worker       return UHDR_CT_UNSPECIFIED;
333*89a0ef05SAndroid Build Coastguard Worker   }
334*89a0ef05SAndroid Build Coastguard Worker }
335*89a0ef05SAndroid Build Coastguard Worker 
decodeJpegRImg(jr_compressed_ptr img,const char * outFileName)336*89a0ef05SAndroid Build Coastguard Worker void decodeJpegRImg(jr_compressed_ptr img, [[maybe_unused]] const char* outFileName) {
337*89a0ef05SAndroid Build Coastguard Worker   jpegr_info_struct info{};
338*89a0ef05SAndroid Build Coastguard Worker   JpegR jpegHdr;
339*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(JPEGR_NO_ERROR, jpegHdr.getJPEGRInfo(img, &info));
340*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(kImageWidth, info.width);
341*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(kImageHeight, info.height);
342*89a0ef05SAndroid Build Coastguard Worker   size_t outSize = info.width * info.height * 8;
343*89a0ef05SAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t[]>(outSize);
344*89a0ef05SAndroid Build Coastguard Worker   jpegr_uncompressed_struct destImage{};
345*89a0ef05SAndroid Build Coastguard Worker   destImage.data = data.get();
346*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(JPEGR_NO_ERROR, jpegHdr.decodeJPEGR(img, &destImage));
347*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(kImageWidth, destImage.width);
348*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(kImageHeight, destImage.height);
349*89a0ef05SAndroid Build Coastguard Worker #ifdef DUMP_OUTPUT
350*89a0ef05SAndroid Build Coastguard Worker   if (!writeFile(outFileName, destImage.data, outSize)) {
351*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "unable to write output file" << std::endl;
352*89a0ef05SAndroid Build Coastguard Worker   }
353*89a0ef05SAndroid Build Coastguard Worker #endif
354*89a0ef05SAndroid Build Coastguard Worker   uhdr_codec_private_t* obj = uhdr_create_decoder();
355*89a0ef05SAndroid Build Coastguard Worker   uhdr_compressed_image_t uhdr_image{};
356*89a0ef05SAndroid Build Coastguard Worker   uhdr_image.data = img->data;
357*89a0ef05SAndroid Build Coastguard Worker   uhdr_image.data_sz = img->length;
358*89a0ef05SAndroid Build Coastguard Worker   uhdr_image.capacity = img->length;
359*89a0ef05SAndroid Build Coastguard Worker   uhdr_image.cg = UHDR_CG_UNSPECIFIED;
360*89a0ef05SAndroid Build Coastguard Worker   uhdr_image.ct = UHDR_CT_UNSPECIFIED;
361*89a0ef05SAndroid Build Coastguard Worker   uhdr_image.range = UHDR_CR_UNSPECIFIED;
362*89a0ef05SAndroid Build Coastguard Worker   uhdr_error_info_t status = uhdr_dec_set_image(obj, &uhdr_image);
363*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
364*89a0ef05SAndroid Build Coastguard Worker   status = uhdr_decode(obj);
365*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
366*89a0ef05SAndroid Build Coastguard Worker   uhdr_raw_image_t* raw_image = uhdr_get_decoded_image(obj);
367*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, raw_image);
368*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(map_internal_cg_to_cg(destImage.colorGamut), raw_image->cg);
369*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(destImage.width, raw_image->w);
370*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(destImage.height, raw_image->h);
371*89a0ef05SAndroid Build Coastguard Worker   char* testData = static_cast<char*>(raw_image->planes[UHDR_PLANE_PACKED]);
372*89a0ef05SAndroid Build Coastguard Worker   char* refData = static_cast<char*>(destImage.data);
373*89a0ef05SAndroid Build Coastguard Worker   int bpp = (raw_image->fmt == UHDR_IMG_FMT_64bppRGBAHalfFloat) ? 8 : 4;
374*89a0ef05SAndroid Build Coastguard Worker   const size_t testStride = raw_image->stride[UHDR_PLANE_PACKED] * bpp;
375*89a0ef05SAndroid Build Coastguard Worker   const size_t refStride = destImage.width * bpp;
376*89a0ef05SAndroid Build Coastguard Worker   const size_t length = destImage.width * bpp;
377*89a0ef05SAndroid Build Coastguard Worker   for (unsigned i = 0; i < destImage.height; i++, testData += testStride, refData += refStride) {
378*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(testData, refData, length));
379*89a0ef05SAndroid Build Coastguard Worker   }
380*89a0ef05SAndroid Build Coastguard Worker   uhdr_release_decoder(obj);
381*89a0ef05SAndroid Build Coastguard Worker }
382*89a0ef05SAndroid Build Coastguard Worker 
383*89a0ef05SAndroid Build Coastguard Worker // ============================================================================
384*89a0ef05SAndroid Build Coastguard Worker // Unit Tests
385*89a0ef05SAndroid Build Coastguard Worker // ============================================================================
386*89a0ef05SAndroid Build Coastguard Worker 
387*89a0ef05SAndroid Build Coastguard Worker // Test Encode API-0 invalid arguments
TEST(JpegRTest,EncodeAPI0WithInvalidArgs)388*89a0ef05SAndroid Build Coastguard Worker TEST(JpegRTest, EncodeAPI0WithInvalidArgs) {
389*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
390*89a0ef05SAndroid Build Coastguard Worker 
391*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(16, 16);
392*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
393*89a0ef05SAndroid Build Coastguard Worker 
394*89a0ef05SAndroid Build Coastguard Worker   // test quality factor and transfer function
395*89a0ef05SAndroid Build Coastguard Worker   {
396*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
397*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
398*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
399*89a0ef05SAndroid Build Coastguard Worker 
400*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
401*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
402*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), -1, nullptr),
403*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
404*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad jpeg quality factor";
405*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
406*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
407*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), 101, nullptr),
408*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
409*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad jpeg quality factor";
410*89a0ef05SAndroid Build Coastguard Worker 
411*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
412*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
413*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
414*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
415*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
416*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
417*89a0ef05SAndroid Build Coastguard Worker                                   static_cast<ultrahdr_transfer_function>(
418*89a0ef05SAndroid Build Coastguard Worker                                       ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
419*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
420*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
421*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
422*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
423*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), static_cast<ultrahdr_transfer_function>(-10),
424*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
425*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
426*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
427*89a0ef05SAndroid Build Coastguard Worker   }
428*89a0ef05SAndroid Build Coastguard Worker 
429*89a0ef05SAndroid Build Coastguard Worker   // test dest
430*89a0ef05SAndroid Build Coastguard Worker   {
431*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
432*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
433*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
434*89a0ef05SAndroid Build Coastguard Worker 
435*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
436*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
437*89a0ef05SAndroid Build Coastguard Worker                             nullptr, kQuality, nullptr),
438*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
439*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr dest";
440*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(16, 16);
441*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
442*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
443*89a0ef05SAndroid Build Coastguard Worker                             jpgImg2.getImageHandle(), kQuality, nullptr),
444*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
445*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr dest";
446*89a0ef05SAndroid Build Coastguard Worker   }
447*89a0ef05SAndroid Build Coastguard Worker 
448*89a0ef05SAndroid Build Coastguard Worker   // test p010 input
449*89a0ef05SAndroid Build Coastguard Worker   {
450*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
451*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
452*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
453*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr p010 image";
454*89a0ef05SAndroid Build Coastguard Worker 
455*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
456*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
457*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
458*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
459*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
460*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
461*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr p010 image";
462*89a0ef05SAndroid Build Coastguard Worker   }
463*89a0ef05SAndroid Build Coastguard Worker 
464*89a0ef05SAndroid Build Coastguard Worker   {
465*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
466*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED));
467*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
468*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
469*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
470*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
471*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
472*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad p010 color gamut";
473*89a0ef05SAndroid Build Coastguard Worker 
474*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_p010);
475*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(
476*89a0ef05SAndroid Build Coastguard Worker         static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1)));
477*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
478*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
479*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
480*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
481*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
482*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad p010 color gamut";
483*89a0ef05SAndroid Build Coastguard Worker   }
484*89a0ef05SAndroid Build Coastguard Worker 
485*89a0ef05SAndroid Build Coastguard Worker   {
486*89a0ef05SAndroid Build Coastguard Worker     const int kWidth = 32, kHeight = 32;
487*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
488*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
489*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
490*89a0ef05SAndroid Build Coastguard Worker     auto rawImgP010 = rawImg.getImageHandle();
491*89a0ef05SAndroid Build Coastguard Worker 
492*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth - 1;
493*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
494*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
495*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
496*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
497*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width";
498*89a0ef05SAndroid Build Coastguard Worker 
499*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
500*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight - 1;
501*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
502*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
503*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
504*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height";
505*89a0ef05SAndroid Build Coastguard Worker 
506*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = 0;
507*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
508*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
509*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
510*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
511*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width";
512*89a0ef05SAndroid Build Coastguard Worker 
513*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
514*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = 0;
515*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
516*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
517*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
518*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height";
519*89a0ef05SAndroid Build Coastguard Worker 
520*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
521*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
522*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->luma_stride = kWidth - 2;
523*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
524*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
525*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
526*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad luma stride";
527*89a0ef05SAndroid Build Coastguard Worker 
528*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
529*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
530*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->luma_stride = kWidth + 64;
531*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->chroma_data = rawImgP010->data;
532*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->chroma_stride = kWidth - 2;
533*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
534*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
535*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
536*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad chroma stride";
537*89a0ef05SAndroid Build Coastguard Worker   }
538*89a0ef05SAndroid Build Coastguard Worker }
539*89a0ef05SAndroid Build Coastguard Worker 
540*89a0ef05SAndroid Build Coastguard Worker /* Test Encode API-1 invalid arguments */
TEST(JpegRTest,EncodeAPI1WithInvalidArgs)541*89a0ef05SAndroid Build Coastguard Worker TEST(JpegRTest, EncodeAPI1WithInvalidArgs) {
542*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
543*89a0ef05SAndroid Build Coastguard Worker 
544*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(16, 16);
545*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
546*89a0ef05SAndroid Build Coastguard Worker 
547*89a0ef05SAndroid Build Coastguard Worker   // test quality factor and transfer function
548*89a0ef05SAndroid Build Coastguard Worker   {
549*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
550*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
551*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
552*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
553*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
554*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
555*89a0ef05SAndroid Build Coastguard Worker 
556*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
557*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
558*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), -1, nullptr),
559*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
560*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad jpeg quality factor";
561*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
562*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
563*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), 101, nullptr),
564*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
565*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad jpeg quality factor";
566*89a0ef05SAndroid Build Coastguard Worker 
567*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
568*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
569*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
570*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
571*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
572*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
573*89a0ef05SAndroid Build Coastguard Worker                                   static_cast<ultrahdr_transfer_function>(
574*89a0ef05SAndroid Build Coastguard Worker                                       ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
575*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
576*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
577*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
578*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
579*89a0ef05SAndroid Build Coastguard Worker                                   static_cast<ultrahdr_transfer_function>(-10),
580*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
581*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
582*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
583*89a0ef05SAndroid Build Coastguard Worker   }
584*89a0ef05SAndroid Build Coastguard Worker 
585*89a0ef05SAndroid Build Coastguard Worker   // test dest
586*89a0ef05SAndroid Build Coastguard Worker   {
587*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
588*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
589*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
590*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
591*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
592*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
593*89a0ef05SAndroid Build Coastguard Worker 
594*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
595*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr, kQuality,
596*89a0ef05SAndroid Build Coastguard Worker                                   nullptr),
597*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
598*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr dest";
599*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(16, 16);
600*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
601*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
602*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
603*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
604*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr dest";
605*89a0ef05SAndroid Build Coastguard Worker   }
606*89a0ef05SAndroid Build Coastguard Worker 
607*89a0ef05SAndroid Build Coastguard Worker   // test p010 input
608*89a0ef05SAndroid Build Coastguard Worker   {
609*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
610*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
611*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
612*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, rawImg2.getImageHandle(),
613*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
614*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
615*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
616*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr p010 image";
617*89a0ef05SAndroid Build Coastguard Worker 
618*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
619*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
620*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
621*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
622*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
623*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
624*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr p010 image";
625*89a0ef05SAndroid Build Coastguard Worker   }
626*89a0ef05SAndroid Build Coastguard Worker 
627*89a0ef05SAndroid Build Coastguard Worker   {
628*89a0ef05SAndroid Build Coastguard Worker     const int kWidth = 32, kHeight = 32;
629*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
630*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
631*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
632*89a0ef05SAndroid Build Coastguard Worker     auto rawImgP010 = rawImg.getImageHandle();
633*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
634*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
635*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
636*89a0ef05SAndroid Build Coastguard Worker     auto rawImg420 = rawImg2.getImageHandle();
637*89a0ef05SAndroid Build Coastguard Worker 
638*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
639*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
640*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
641*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
642*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
643*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
644*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
645*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad p010 color gamut";
646*89a0ef05SAndroid Build Coastguard Worker 
647*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
648*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
649*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut =
650*89a0ef05SAndroid Build Coastguard Worker         static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
651*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
652*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
653*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
654*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
655*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad p010 color gamut";
656*89a0ef05SAndroid Build Coastguard Worker 
657*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth - 1;
658*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
659*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
660*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
661*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
662*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
663*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
664*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width";
665*89a0ef05SAndroid Build Coastguard Worker 
666*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
667*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight - 1;
668*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
669*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
670*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
671*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
672*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height";
673*89a0ef05SAndroid Build Coastguard Worker 
674*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = 0;
675*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
676*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
677*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
678*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
679*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
680*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width";
681*89a0ef05SAndroid Build Coastguard Worker 
682*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
683*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = 0;
684*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
685*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
686*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
687*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
688*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height";
689*89a0ef05SAndroid Build Coastguard Worker 
690*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
691*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
692*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->luma_stride = kWidth - 2;
693*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
694*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
695*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
696*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
697*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad luma stride";
698*89a0ef05SAndroid Build Coastguard Worker 
699*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
700*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
701*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->luma_stride = kWidth + 64;
702*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->chroma_data = rawImgP010->data;
703*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->chroma_stride = kWidth - 2;
704*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
705*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
706*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
707*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
708*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad chroma stride";
709*89a0ef05SAndroid Build Coastguard Worker   }
710*89a0ef05SAndroid Build Coastguard Worker 
711*89a0ef05SAndroid Build Coastguard Worker   // test 420 input
712*89a0ef05SAndroid Build Coastguard Worker   {
713*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
714*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
715*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
716*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr,
717*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
718*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
719*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
720*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr 420 image";
721*89a0ef05SAndroid Build Coastguard Worker 
722*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
723*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
724*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
725*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
726*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(), kQuality, nullptr),
727*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
728*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr 420 image";
729*89a0ef05SAndroid Build Coastguard Worker   }
730*89a0ef05SAndroid Build Coastguard Worker   {
731*89a0ef05SAndroid Build Coastguard Worker     const int kWidth = 32, kHeight = 32;
732*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
733*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
734*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
735*89a0ef05SAndroid Build Coastguard Worker     auto rawImgP010 = rawImg.getImageHandle();
736*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
737*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
738*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
739*89a0ef05SAndroid Build Coastguard Worker     auto rawImg420 = rawImg2.getImageHandle();
740*89a0ef05SAndroid Build Coastguard Worker 
741*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
742*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
743*89a0ef05SAndroid Build Coastguard Worker     rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
744*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
745*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
746*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
747*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
748*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad 420 color gamut";
749*89a0ef05SAndroid Build Coastguard Worker 
750*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
751*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
752*89a0ef05SAndroid Build Coastguard Worker     rawImg420->colorGamut =
753*89a0ef05SAndroid Build Coastguard Worker         static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
754*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
755*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
756*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
757*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
758*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad 420 color gamut";
759*89a0ef05SAndroid Build Coastguard Worker 
760*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth - 1;
761*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
762*89a0ef05SAndroid Build Coastguard Worker     rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709;
763*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
764*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
765*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
766*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
767*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width for 420";
768*89a0ef05SAndroid Build Coastguard Worker 
769*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
770*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight - 1;
771*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
772*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
773*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
774*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
775*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height for 420";
776*89a0ef05SAndroid Build Coastguard Worker 
777*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = 0;
778*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
779*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
780*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
781*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
782*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
783*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width for 420";
784*89a0ef05SAndroid Build Coastguard Worker 
785*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
786*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = 0;
787*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
788*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
789*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
790*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
791*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height for 420";
792*89a0ef05SAndroid Build Coastguard Worker 
793*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
794*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
795*89a0ef05SAndroid Build Coastguard Worker     rawImg420->luma_stride = kWidth - 2;
796*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
797*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
798*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
799*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
800*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad luma stride for 420";
801*89a0ef05SAndroid Build Coastguard Worker 
802*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
803*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
804*89a0ef05SAndroid Build Coastguard Worker     rawImg420->luma_stride = 0;
805*89a0ef05SAndroid Build Coastguard Worker     rawImg420->chroma_data = rawImgP010->data;
806*89a0ef05SAndroid Build Coastguard Worker     rawImg420->chroma_stride = kWidth / 2 - 2;
807*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
808*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
809*89a0ef05SAndroid Build Coastguard Worker                             jpgImg.getImageHandle(), kQuality, nullptr),
810*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
811*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad chroma stride for 420";
812*89a0ef05SAndroid Build Coastguard Worker   }
813*89a0ef05SAndroid Build Coastguard Worker }
814*89a0ef05SAndroid Build Coastguard Worker 
815*89a0ef05SAndroid Build Coastguard Worker /* Test Encode API-2 invalid arguments */
TEST(JpegRTest,EncodeAPI2WithInvalidArgs)816*89a0ef05SAndroid Build Coastguard Worker TEST(JpegRTest, EncodeAPI2WithInvalidArgs) {
817*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
818*89a0ef05SAndroid Build Coastguard Worker 
819*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(16, 16);
820*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
821*89a0ef05SAndroid Build Coastguard Worker 
822*89a0ef05SAndroid Build Coastguard Worker   // test quality factor and transfer function
823*89a0ef05SAndroid Build Coastguard Worker   {
824*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
825*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
826*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
827*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
828*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
829*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
830*89a0ef05SAndroid Build Coastguard Worker 
831*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(
832*89a0ef05SAndroid Build Coastguard Worker                   rawImg.getImageHandle(), rawImg2.getImageHandle(), jpgImg.getImageHandle(),
833*89a0ef05SAndroid Build Coastguard Worker                   ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED, jpgImg.getImageHandle()),
834*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
835*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
836*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
837*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(),
838*89a0ef05SAndroid Build Coastguard Worker                                   static_cast<ultrahdr_transfer_function>(
839*89a0ef05SAndroid Build Coastguard Worker                                       ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
840*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle()),
841*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
842*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
843*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(
844*89a0ef05SAndroid Build Coastguard Worker                   rawImg.getImageHandle(), rawImg2.getImageHandle(), jpgImg.getImageHandle(),
845*89a0ef05SAndroid Build Coastguard Worker                   static_cast<ultrahdr_transfer_function>(-10), jpgImg.getImageHandle()),
846*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
847*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
848*89a0ef05SAndroid Build Coastguard Worker   }
849*89a0ef05SAndroid Build Coastguard Worker 
850*89a0ef05SAndroid Build Coastguard Worker   // test dest
851*89a0ef05SAndroid Build Coastguard Worker   {
852*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
853*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
854*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
855*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
856*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
857*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
858*89a0ef05SAndroid Build Coastguard Worker 
859*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
860*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle(),
861*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr),
862*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
863*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr dest";
864*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(16, 16);
865*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(
866*89a0ef05SAndroid Build Coastguard Worker                   rawImg.getImageHandle(), rawImg2.getImageHandle(), jpgImg.getImageHandle(),
867*89a0ef05SAndroid Build Coastguard Worker                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
868*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
869*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr dest";
870*89a0ef05SAndroid Build Coastguard Worker   }
871*89a0ef05SAndroid Build Coastguard Worker 
872*89a0ef05SAndroid Build Coastguard Worker   // test compressed image
873*89a0ef05SAndroid Build Coastguard Worker   {
874*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
875*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
876*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
877*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
878*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
879*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
880*89a0ef05SAndroid Build Coastguard Worker 
881*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
882*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(), nullptr,
883*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
884*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
885*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr for compressed image";
886*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(16, 16);
887*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(
888*89a0ef05SAndroid Build Coastguard Worker                   rawImg.getImageHandle(), rawImg2.getImageHandle(), jpgImg2.getImageHandle(),
889*89a0ef05SAndroid Build Coastguard Worker                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
890*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
891*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr for compressed image";
892*89a0ef05SAndroid Build Coastguard Worker   }
893*89a0ef05SAndroid Build Coastguard Worker 
894*89a0ef05SAndroid Build Coastguard Worker   // test p010 input
895*89a0ef05SAndroid Build Coastguard Worker   {
896*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
897*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
898*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
899*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
900*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(nullptr, rawImg2.getImageHandle(), jpgImg.getImageHandle(),
901*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
902*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
903*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr p010 image";
904*89a0ef05SAndroid Build Coastguard Worker 
905*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
906*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
907*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(
908*89a0ef05SAndroid Build Coastguard Worker                   rawImg.getImageHandle(), rawImg2.getImageHandle(), jpgImg.getImageHandle(),
909*89a0ef05SAndroid Build Coastguard Worker                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
910*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
911*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr p010 image";
912*89a0ef05SAndroid Build Coastguard Worker   }
913*89a0ef05SAndroid Build Coastguard Worker 
914*89a0ef05SAndroid Build Coastguard Worker   {
915*89a0ef05SAndroid Build Coastguard Worker     const int kWidth = 32, kHeight = 32;
916*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
917*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
918*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
919*89a0ef05SAndroid Build Coastguard Worker     auto rawImgP010 = rawImg.getImageHandle();
920*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
921*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
922*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
923*89a0ef05SAndroid Build Coastguard Worker     auto rawImg420 = rawImg2.getImageHandle();
924*89a0ef05SAndroid Build Coastguard Worker 
925*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
926*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
927*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
928*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
929*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
930*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
931*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
932*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad p010 color gamut";
933*89a0ef05SAndroid Build Coastguard Worker 
934*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
935*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
936*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut =
937*89a0ef05SAndroid Build Coastguard Worker         static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
938*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
939*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
940*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
941*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
942*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad p010 color gamut";
943*89a0ef05SAndroid Build Coastguard Worker 
944*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth - 1;
945*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
946*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
947*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
948*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
949*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
950*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
951*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width";
952*89a0ef05SAndroid Build Coastguard Worker 
953*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
954*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight - 1;
955*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
956*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
957*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
958*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
959*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height";
960*89a0ef05SAndroid Build Coastguard Worker 
961*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = 0;
962*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
963*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
964*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
965*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
966*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
967*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width";
968*89a0ef05SAndroid Build Coastguard Worker 
969*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
970*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = 0;
971*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
972*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
973*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
974*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
975*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height";
976*89a0ef05SAndroid Build Coastguard Worker 
977*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
978*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
979*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->luma_stride = kWidth - 2;
980*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
981*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
982*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
983*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
984*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad luma stride";
985*89a0ef05SAndroid Build Coastguard Worker 
986*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
987*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
988*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->luma_stride = kWidth + 64;
989*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->chroma_data = rawImgP010->data;
990*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->chroma_stride = kWidth - 2;
991*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
992*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
993*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
994*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
995*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad chroma stride";
996*89a0ef05SAndroid Build Coastguard Worker   }
997*89a0ef05SAndroid Build Coastguard Worker 
998*89a0ef05SAndroid Build Coastguard Worker   // test 420 input
999*89a0ef05SAndroid Build Coastguard Worker   {
1000*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1001*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1002*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
1003*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1004*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr, jpgImg.getImageHandle(),
1005*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1006*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1007*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr 420 image";
1008*89a0ef05SAndroid Build Coastguard Worker 
1009*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
1010*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1011*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(
1012*89a0ef05SAndroid Build Coastguard Worker                   rawImg.getImageHandle(), rawImg2.getImageHandle(), jpgImg.getImageHandle(),
1013*89a0ef05SAndroid Build Coastguard Worker                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1014*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
1015*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr 420 image";
1016*89a0ef05SAndroid Build Coastguard Worker   }
1017*89a0ef05SAndroid Build Coastguard Worker   {
1018*89a0ef05SAndroid Build Coastguard Worker     const int kWidth = 32, kHeight = 32;
1019*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
1020*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1021*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
1022*89a0ef05SAndroid Build Coastguard Worker     auto rawImgP010 = rawImg.getImageHandle();
1023*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
1024*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
1025*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
1026*89a0ef05SAndroid Build Coastguard Worker     auto rawImg420 = rawImg2.getImageHandle();
1027*89a0ef05SAndroid Build Coastguard Worker 
1028*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
1029*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
1030*89a0ef05SAndroid Build Coastguard Worker     rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
1031*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1032*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1033*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1034*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1035*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad 420 color gamut";
1036*89a0ef05SAndroid Build Coastguard Worker 
1037*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
1038*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
1039*89a0ef05SAndroid Build Coastguard Worker     rawImg420->colorGamut =
1040*89a0ef05SAndroid Build Coastguard Worker         static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
1041*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1042*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1043*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1044*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1045*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad 420 color gamut";
1046*89a0ef05SAndroid Build Coastguard Worker 
1047*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth - 1;
1048*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
1049*89a0ef05SAndroid Build Coastguard Worker     rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709;
1050*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1051*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1052*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1053*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1054*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width for 420";
1055*89a0ef05SAndroid Build Coastguard Worker 
1056*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
1057*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight - 1;
1058*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1059*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1060*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1061*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1062*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height for 420";
1063*89a0ef05SAndroid Build Coastguard Worker 
1064*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = 0;
1065*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
1066*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1067*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1068*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1069*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1070*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width for 420";
1071*89a0ef05SAndroid Build Coastguard Worker 
1072*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
1073*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = 0;
1074*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1075*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1076*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1077*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1078*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height for 420";
1079*89a0ef05SAndroid Build Coastguard Worker 
1080*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
1081*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
1082*89a0ef05SAndroid Build Coastguard Worker     rawImg420->luma_stride = kWidth - 2;
1083*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1084*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1085*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1086*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1087*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad luma stride for 420";
1088*89a0ef05SAndroid Build Coastguard Worker 
1089*89a0ef05SAndroid Build Coastguard Worker     rawImg420->width = kWidth;
1090*89a0ef05SAndroid Build Coastguard Worker     rawImg420->height = kHeight;
1091*89a0ef05SAndroid Build Coastguard Worker     rawImg420->luma_stride = 0;
1092*89a0ef05SAndroid Build Coastguard Worker     rawImg420->chroma_data = rawImgP010->data;
1093*89a0ef05SAndroid Build Coastguard Worker     rawImg420->chroma_stride = kWidth / 2 - 2;
1094*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1095*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1096*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1097*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1098*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad chroma stride for 420";
1099*89a0ef05SAndroid Build Coastguard Worker   }
1100*89a0ef05SAndroid Build Coastguard Worker }
1101*89a0ef05SAndroid Build Coastguard Worker 
1102*89a0ef05SAndroid Build Coastguard Worker /* Test Encode API-3 invalid arguments */
TEST(JpegRTest,EncodeAPI3WithInvalidArgs)1103*89a0ef05SAndroid Build Coastguard Worker TEST(JpegRTest, EncodeAPI3WithInvalidArgs) {
1104*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
1105*89a0ef05SAndroid Build Coastguard Worker 
1106*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(16, 16);
1107*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
1108*89a0ef05SAndroid Build Coastguard Worker 
1109*89a0ef05SAndroid Build Coastguard Worker   // test quality factor and transfer function
1110*89a0ef05SAndroid Build Coastguard Worker   {
1111*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1112*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1113*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
1114*89a0ef05SAndroid Build Coastguard Worker 
1115*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1116*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
1117*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle()),
1118*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
1119*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
1120*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1121*89a0ef05SAndroid Build Coastguard Worker                                   static_cast<ultrahdr_transfer_function>(
1122*89a0ef05SAndroid Build Coastguard Worker                                       ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
1123*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg.getImageHandle()),
1124*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
1125*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
1126*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1127*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1128*89a0ef05SAndroid Build Coastguard Worker                             static_cast<ultrahdr_transfer_function>(-10), jpgImg.getImageHandle()),
1129*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1130*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad hdr transfer function";
1131*89a0ef05SAndroid Build Coastguard Worker   }
1132*89a0ef05SAndroid Build Coastguard Worker 
1133*89a0ef05SAndroid Build Coastguard Worker   // test dest
1134*89a0ef05SAndroid Build Coastguard Worker   {
1135*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1136*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1137*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
1138*89a0ef05SAndroid Build Coastguard Worker 
1139*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1140*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr),
1141*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR)
1142*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr dest";
1143*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(16, 16);
1144*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1145*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1146*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
1147*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1148*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr dest";
1149*89a0ef05SAndroid Build Coastguard Worker   }
1150*89a0ef05SAndroid Build Coastguard Worker 
1151*89a0ef05SAndroid Build Coastguard Worker   // test compressed image
1152*89a0ef05SAndroid Build Coastguard Worker   {
1153*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1154*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1155*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
1156*89a0ef05SAndroid Build Coastguard Worker 
1157*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1158*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr,
1159*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1160*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1161*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr for compressed image";
1162*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(16, 16);
1163*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1164*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg2.getImageHandle(),
1165*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1166*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1167*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr for compressed image";
1168*89a0ef05SAndroid Build Coastguard Worker   }
1169*89a0ef05SAndroid Build Coastguard Worker 
1170*89a0ef05SAndroid Build Coastguard Worker   // test p010 input
1171*89a0ef05SAndroid Build Coastguard Worker   {
1172*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1173*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(nullptr, jpgImg.getImageHandle(),
1174*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1175*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1176*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr p010 image";
1177*89a0ef05SAndroid Build Coastguard Worker 
1178*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1179*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1180*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1181*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1182*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1183*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1184*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows nullptr p010 image";
1185*89a0ef05SAndroid Build Coastguard Worker   }
1186*89a0ef05SAndroid Build Coastguard Worker 
1187*89a0ef05SAndroid Build Coastguard Worker   {
1188*89a0ef05SAndroid Build Coastguard Worker     const int kWidth = 32, kHeight = 32;
1189*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
1190*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1191*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg.allocateMemory());
1192*89a0ef05SAndroid Build Coastguard Worker     auto rawImgP010 = rawImg.getImageHandle();
1193*89a0ef05SAndroid Build Coastguard Worker 
1194*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
1195*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
1196*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
1197*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1198*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1199*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1200*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1201*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad p010 color gamut";
1202*89a0ef05SAndroid Build Coastguard Worker 
1203*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
1204*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
1205*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut =
1206*89a0ef05SAndroid Build Coastguard Worker         static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
1207*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1208*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1209*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1210*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1211*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad p010 color gamut";
1212*89a0ef05SAndroid Build Coastguard Worker 
1213*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth - 1;
1214*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
1215*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
1216*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1217*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1218*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1219*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1220*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width";
1221*89a0ef05SAndroid Build Coastguard Worker 
1222*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
1223*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight - 1;
1224*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1225*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1226*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1227*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1228*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height";
1229*89a0ef05SAndroid Build Coastguard Worker 
1230*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = 0;
1231*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
1232*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1233*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1234*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1235*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1236*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image width";
1237*89a0ef05SAndroid Build Coastguard Worker 
1238*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
1239*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = 0;
1240*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1241*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1242*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1243*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1244*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad image height";
1245*89a0ef05SAndroid Build Coastguard Worker 
1246*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
1247*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
1248*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->luma_stride = kWidth - 2;
1249*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1250*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1251*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1252*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1253*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad luma stride";
1254*89a0ef05SAndroid Build Coastguard Worker 
1255*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->width = kWidth;
1256*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->height = kHeight;
1257*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->luma_stride = kWidth + 64;
1258*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->chroma_data = rawImgP010->data;
1259*89a0ef05SAndroid Build Coastguard Worker     rawImgP010->chroma_stride = kWidth - 2;
1260*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(
1261*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1262*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1263*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR)
1264*89a0ef05SAndroid Build Coastguard Worker         << "fail, API allows bad chroma stride";
1265*89a0ef05SAndroid Build Coastguard Worker   }
1266*89a0ef05SAndroid Build Coastguard Worker }
1267*89a0ef05SAndroid Build Coastguard Worker 
1268*89a0ef05SAndroid Build Coastguard Worker /* Test Encode API-4 invalid arguments */
TEST(JpegRTest,EncodeAPI4WithInvalidArgs)1269*89a0ef05SAndroid Build Coastguard Worker TEST(JpegRTest, EncodeAPI4WithInvalidArgs) {
1270*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(16, 16);
1271*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
1272*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg2(16, 16);
1273*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
1274*89a0ef05SAndroid Build Coastguard Worker 
1275*89a0ef05SAndroid Build Coastguard Worker   // test dest
1276*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), nullptr, nullptr),
1277*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1278*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr dest";
1279*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), nullptr,
1280*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg2.getImageHandle()),
1281*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1282*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr dest";
1283*89a0ef05SAndroid Build Coastguard Worker 
1284*89a0ef05SAndroid Build Coastguard Worker   // test primary image
1285*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, jpgImg.getImageHandle(), nullptr, jpgImg.getImageHandle()),
1286*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1287*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr primary image";
1288*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg2.getImageHandle(), jpgImg.getImageHandle(), nullptr,
1289*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1290*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1291*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr primary image";
1292*89a0ef05SAndroid Build Coastguard Worker 
1293*89a0ef05SAndroid Build Coastguard Worker   // test gain map
1294*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), nullptr, nullptr, jpgImg.getImageHandle()),
1295*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1296*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr gain map image";
1297*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg2.getImageHandle(), nullptr,
1298*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1299*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1300*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr gain map image";
1301*89a0ef05SAndroid Build Coastguard Worker 
1302*89a0ef05SAndroid Build Coastguard Worker   // test metadata
1303*89a0ef05SAndroid Build Coastguard Worker   ultrahdr_metadata_struct good_metadata;
1304*89a0ef05SAndroid Build Coastguard Worker   good_metadata.version = "1.0";
1305*89a0ef05SAndroid Build Coastguard Worker   good_metadata.minContentBoost = 1.0f;
1306*89a0ef05SAndroid Build Coastguard Worker   good_metadata.maxContentBoost = 2.0f;
1307*89a0ef05SAndroid Build Coastguard Worker   good_metadata.gamma = 1.0f;
1308*89a0ef05SAndroid Build Coastguard Worker   good_metadata.offsetSdr = 0.0f;
1309*89a0ef05SAndroid Build Coastguard Worker   good_metadata.offsetHdr = 0.0f;
1310*89a0ef05SAndroid Build Coastguard Worker   good_metadata.hdrCapacityMin = 1.0f;
1311*89a0ef05SAndroid Build Coastguard Worker   good_metadata.hdrCapacityMax = 2.0f;
1312*89a0ef05SAndroid Build Coastguard Worker 
1313*89a0ef05SAndroid Build Coastguard Worker   ultrahdr_metadata_struct metadata = good_metadata;
1314*89a0ef05SAndroid Build Coastguard Worker   metadata.version = "1.1";
1315*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1316*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1317*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1318*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows bad metadata version";
1319*89a0ef05SAndroid Build Coastguard Worker 
1320*89a0ef05SAndroid Build Coastguard Worker   metadata = good_metadata;
1321*89a0ef05SAndroid Build Coastguard Worker   metadata.minContentBoost = 3.0f;
1322*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1323*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1324*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1325*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows bad metadata content boost";
1326*89a0ef05SAndroid Build Coastguard Worker 
1327*89a0ef05SAndroid Build Coastguard Worker   metadata = good_metadata;
1328*89a0ef05SAndroid Build Coastguard Worker   metadata.gamma = -0.1f;
1329*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1330*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1331*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1332*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows bad metadata gamma";
1333*89a0ef05SAndroid Build Coastguard Worker 
1334*89a0ef05SAndroid Build Coastguard Worker   metadata = good_metadata;
1335*89a0ef05SAndroid Build Coastguard Worker   metadata.offsetSdr = -0.1f;
1336*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1337*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1338*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1339*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows bad metadata offset sdr";
1340*89a0ef05SAndroid Build Coastguard Worker 
1341*89a0ef05SAndroid Build Coastguard Worker   metadata = good_metadata;
1342*89a0ef05SAndroid Build Coastguard Worker   metadata.offsetHdr = -0.1f;
1343*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1344*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1345*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1346*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows bad metadata offset hdr";
1347*89a0ef05SAndroid Build Coastguard Worker 
1348*89a0ef05SAndroid Build Coastguard Worker   metadata = good_metadata;
1349*89a0ef05SAndroid Build Coastguard Worker   metadata.hdrCapacityMax = 0.5f;
1350*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1351*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1352*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1353*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows bad metadata hdr capacity max";
1354*89a0ef05SAndroid Build Coastguard Worker 
1355*89a0ef05SAndroid Build Coastguard Worker   metadata = good_metadata;
1356*89a0ef05SAndroid Build Coastguard Worker   metadata.hdrCapacityMin = 0.5f;
1357*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1358*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle()),
1359*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1360*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows bad metadata hdr capacity min";
1361*89a0ef05SAndroid Build Coastguard Worker }
1362*89a0ef05SAndroid Build Coastguard Worker 
1363*89a0ef05SAndroid Build Coastguard Worker /* Test Decode API invalid arguments */
TEST(JpegRTest,DecodeAPIWithInvalidArgs)1364*89a0ef05SAndroid Build Coastguard Worker TEST(JpegRTest, DecodeAPIWithInvalidArgs) {
1365*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
1366*89a0ef05SAndroid Build Coastguard Worker 
1367*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(16, 16);
1368*89a0ef05SAndroid Build Coastguard Worker   jpegr_uncompressed_struct destImage{};
1369*89a0ef05SAndroid Build Coastguard Worker   size_t outSize = 16 * 16 * 8;
1370*89a0ef05SAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t[]>(outSize);
1371*89a0ef05SAndroid Build Coastguard Worker   destImage.data = data.get();
1372*89a0ef05SAndroid Build Coastguard Worker 
1373*89a0ef05SAndroid Build Coastguard Worker   // test jpegr image
1374*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.decodeJPEGR(nullptr, &destImage), JPEGR_NO_ERROR)
1375*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr for jpegr img";
1376*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage), JPEGR_NO_ERROR)
1377*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr for jpegr img";
1378*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
1379*89a0ef05SAndroid Build Coastguard Worker 
1380*89a0ef05SAndroid Build Coastguard Worker   // test dest image
1381*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), nullptr), JPEGR_NO_ERROR)
1382*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr for dest";
1383*89a0ef05SAndroid Build Coastguard Worker   destImage.data = nullptr;
1384*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage), JPEGR_NO_ERROR)
1385*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows nullptr for dest";
1386*89a0ef05SAndroid Build Coastguard Worker   destImage.data = data.get();
1387*89a0ef05SAndroid Build Coastguard Worker 
1388*89a0ef05SAndroid Build Coastguard Worker   // test max display boost
1389*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, 0.5), JPEGR_NO_ERROR)
1390*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows invalid max display boost";
1391*89a0ef05SAndroid Build Coastguard Worker 
1392*89a0ef05SAndroid Build Coastguard Worker   // test output format
1393*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, FLT_MAX, nullptr,
1394*89a0ef05SAndroid Build Coastguard Worker                                 static_cast<ultrahdr_output_format>(-1)),
1395*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1396*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows invalid output format";
1397*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, FLT_MAX, nullptr,
1398*89a0ef05SAndroid Build Coastguard Worker                                 static_cast<ultrahdr_output_format>(ULTRAHDR_OUTPUT_MAX + 1)),
1399*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR)
1400*89a0ef05SAndroid Build Coastguard Worker       << "fail, API allows invalid output format";
1401*89a0ef05SAndroid Build Coastguard Worker }
1402*89a0ef05SAndroid Build Coastguard Worker 
TEST(JpegRTest,writeXmpThenRead)1403*89a0ef05SAndroid Build Coastguard Worker TEST(JpegRTest, writeXmpThenRead) {
1404*89a0ef05SAndroid Build Coastguard Worker   uhdr_gainmap_metadata_ext_t metadata_expected;
1405*89a0ef05SAndroid Build Coastguard Worker   metadata_expected.version = "1.0";
1406*89a0ef05SAndroid Build Coastguard Worker   metadata_expected.max_content_boost = 1.25f;
1407*89a0ef05SAndroid Build Coastguard Worker   metadata_expected.min_content_boost = 0.75f;
1408*89a0ef05SAndroid Build Coastguard Worker   metadata_expected.gamma = 1.0f;
1409*89a0ef05SAndroid Build Coastguard Worker   metadata_expected.offset_sdr = 0.0f;
1410*89a0ef05SAndroid Build Coastguard Worker   metadata_expected.offset_hdr = 0.0f;
1411*89a0ef05SAndroid Build Coastguard Worker   metadata_expected.hdr_capacity_min = 1.0f;
1412*89a0ef05SAndroid Build Coastguard Worker   metadata_expected.hdr_capacity_max = metadata_expected.max_content_boost;
1413*89a0ef05SAndroid Build Coastguard Worker   const std::string nameSpace = "http://ns.adobe.com/xap/1.0/\0";
1414*89a0ef05SAndroid Build Coastguard Worker   const size_t nameSpaceLength = nameSpace.size() + 1;  // need to count the null terminator
1415*89a0ef05SAndroid Build Coastguard Worker 
1416*89a0ef05SAndroid Build Coastguard Worker   std::string xmp = generateXmpForSecondaryImage(metadata_expected);
1417*89a0ef05SAndroid Build Coastguard Worker 
1418*89a0ef05SAndroid Build Coastguard Worker   std::vector<uint8_t> xmpData;
1419*89a0ef05SAndroid Build Coastguard Worker   xmpData.reserve(nameSpaceLength + xmp.size());
1420*89a0ef05SAndroid Build Coastguard Worker   xmpData.insert(xmpData.end(), reinterpret_cast<const uint8_t*>(nameSpace.c_str()),
1421*89a0ef05SAndroid Build Coastguard Worker                  reinterpret_cast<const uint8_t*>(nameSpace.c_str()) + nameSpaceLength);
1422*89a0ef05SAndroid Build Coastguard Worker   xmpData.insert(xmpData.end(), reinterpret_cast<const uint8_t*>(xmp.c_str()),
1423*89a0ef05SAndroid Build Coastguard Worker                  reinterpret_cast<const uint8_t*>(xmp.c_str()) + xmp.size());
1424*89a0ef05SAndroid Build Coastguard Worker 
1425*89a0ef05SAndroid Build Coastguard Worker   uhdr_gainmap_metadata_ext_t metadata_read;
1426*89a0ef05SAndroid Build Coastguard Worker   EXPECT_EQ(getMetadataFromXMP(xmpData.data(), xmpData.size(), &metadata_read).error_code,
1427*89a0ef05SAndroid Build Coastguard Worker             UHDR_CODEC_OK);
1428*89a0ef05SAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(metadata_expected.max_content_boost, metadata_read.max_content_boost);
1429*89a0ef05SAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(metadata_expected.min_content_boost, metadata_read.min_content_boost);
1430*89a0ef05SAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(metadata_expected.gamma, metadata_read.gamma);
1431*89a0ef05SAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(metadata_expected.offset_sdr, metadata_read.offset_sdr);
1432*89a0ef05SAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(metadata_expected.offset_hdr, metadata_read.offset_hdr);
1433*89a0ef05SAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(metadata_expected.hdr_capacity_min, metadata_read.hdr_capacity_min);
1434*89a0ef05SAndroid Build Coastguard Worker   EXPECT_FLOAT_EQ(metadata_expected.hdr_capacity_max, metadata_read.hdr_capacity_max);
1435*89a0ef05SAndroid Build Coastguard Worker }
1436*89a0ef05SAndroid Build Coastguard Worker 
1437*89a0ef05SAndroid Build Coastguard Worker class JpegRAPIEncodeAndDecodeTest
1438*89a0ef05SAndroid Build Coastguard Worker     : public ::testing::TestWithParam<std::tuple<ultrahdr_color_gamut, ultrahdr_color_gamut>> {
1439*89a0ef05SAndroid Build Coastguard Worker  public:
JpegRAPIEncodeAndDecodeTest()1440*89a0ef05SAndroid Build Coastguard Worker   JpegRAPIEncodeAndDecodeTest()
1441*89a0ef05SAndroid Build Coastguard Worker       : mP010ColorGamut(std::get<0>(GetParam())), mYuv420ColorGamut(std::get<1>(GetParam())){};
1442*89a0ef05SAndroid Build Coastguard Worker 
1443*89a0ef05SAndroid Build Coastguard Worker   const ultrahdr_color_gamut mP010ColorGamut;
1444*89a0ef05SAndroid Build Coastguard Worker   const ultrahdr_color_gamut mYuv420ColorGamut;
1445*89a0ef05SAndroid Build Coastguard Worker };
1446*89a0ef05SAndroid Build Coastguard Worker 
1447*89a0ef05SAndroid Build Coastguard Worker /* Test Encode API-0 and Decode */
TEST_P(JpegRAPIEncodeAndDecodeTest,EncodeAPI0AndDecodeTest)1448*89a0ef05SAndroid Build Coastguard Worker TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI0AndDecodeTest) {
1449*89a0ef05SAndroid Build Coastguard Worker   // reference encode
1450*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper rawImg(kImageWidth, kImageHeight, YCbCr_p010);
1451*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg.setImageColorGamut(mP010ColorGamut));
1452*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg.allocateMemory());
1453*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg.loadRawResource(kYCbCrP010FileName));
1454*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
1455*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
1456*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
1457*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(
1458*89a0ef05SAndroid Build Coastguard Worker       uHdrLib.encodeJPEGR(rawImg.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1459*89a0ef05SAndroid Build Coastguard Worker                           jpgImg.getImageHandle(), kQuality, nullptr),
1460*89a0ef05SAndroid Build Coastguard Worker       JPEGR_NO_ERROR);
1461*89a0ef05SAndroid Build Coastguard Worker 
1462*89a0ef05SAndroid Build Coastguard Worker   uhdr_codec_private_t* obj = uhdr_create_encoder();
1463*89a0ef05SAndroid Build Coastguard Worker   uhdr_raw_image_t uhdrRawImg{};
1464*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.fmt = UHDR_IMG_FMT_24bppYCbCrP010;
1465*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.cg = map_internal_cg_to_cg(mP010ColorGamut);
1466*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.ct = map_internal_ct_to_ct(ultrahdr_transfer_function::ULTRAHDR_TF_HLG);
1467*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.range = UHDR_CR_LIMITED_RANGE;
1468*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.w = kImageWidth;
1469*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.h = kImageHeight;
1470*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.planes[UHDR_PLANE_Y] = rawImg.getImageHandle()->data;
1471*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.stride[UHDR_PLANE_Y] = kImageWidth;
1472*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.planes[UHDR_PLANE_UV] =
1473*89a0ef05SAndroid Build Coastguard Worker       ((uint8_t*)(rawImg.getImageHandle()->data)) + kImageWidth * kImageHeight * 2;
1474*89a0ef05SAndroid Build Coastguard Worker   uhdrRawImg.stride[UHDR_PLANE_UV] = kImageWidth;
1475*89a0ef05SAndroid Build Coastguard Worker   uhdr_error_info_t status = uhdr_enc_set_raw_image(obj, &uhdrRawImg, UHDR_HDR_IMG);
1476*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1477*89a0ef05SAndroid Build Coastguard Worker   status = uhdr_enc_set_quality(obj, kQuality, UHDR_BASE_IMG);
1478*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1479*89a0ef05SAndroid Build Coastguard Worker   status = uhdr_enc_set_using_multi_channel_gainmap(obj, false);
1480*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1481*89a0ef05SAndroid Build Coastguard Worker   status = uhdr_enc_set_gainmap_scale_factor(obj, 4);
1482*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1483*89a0ef05SAndroid Build Coastguard Worker   status = uhdr_enc_set_quality(obj, 85, UHDR_GAIN_MAP_IMG);
1484*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1485*89a0ef05SAndroid Build Coastguard Worker   status = uhdr_enc_set_preset(obj, UHDR_USAGE_REALTIME);
1486*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1487*89a0ef05SAndroid Build Coastguard Worker   status = uhdr_encode(obj);
1488*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1489*89a0ef05SAndroid Build Coastguard Worker   uhdr_compressed_image_t* compressedImage = uhdr_get_encoded_stream(obj);
1490*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, compressedImage);
1491*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(jpgImg.getImageHandle()->length, compressedImage->data_sz);
1492*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(0,
1493*89a0ef05SAndroid Build Coastguard Worker             memcmp(jpgImg.getImageHandle()->data, compressedImage->data, compressedImage->data_sz));
1494*89a0ef05SAndroid Build Coastguard Worker   uhdr_release_encoder(obj);
1495*89a0ef05SAndroid Build Coastguard Worker 
1496*89a0ef05SAndroid Build Coastguard Worker   // encode with luma stride set
1497*89a0ef05SAndroid Build Coastguard Worker   {
1498*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
1499*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut));
1500*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageStride(kImageWidth + 18, 0));
1501*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
1502*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
1503*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1504*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1505*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1506*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1507*89a0ef05SAndroid Build Coastguard Worker                             jpgImg2.getImageHandle(), kQuality, nullptr),
1508*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1509*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1510*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1511*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1512*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1513*89a0ef05SAndroid Build Coastguard Worker   }
1514*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set
1515*89a0ef05SAndroid Build Coastguard Worker   {
1516*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
1517*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut));
1518*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageStride(kImageWidth + 18, kImageWidth + 28));
1519*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setChromaMode(false));
1520*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
1521*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
1522*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1523*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1524*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1525*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1526*89a0ef05SAndroid Build Coastguard Worker                             jpgImg2.getImageHandle(), kQuality, nullptr),
1527*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1528*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1529*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1530*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1531*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1532*89a0ef05SAndroid Build Coastguard Worker 
1533*89a0ef05SAndroid Build Coastguard Worker     uhdr_codec_private_t* obj = uhdr_create_encoder();
1534*89a0ef05SAndroid Build Coastguard Worker     uhdr_raw_image_t uhdrRawImg{};
1535*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.fmt = UHDR_IMG_FMT_24bppYCbCrP010;
1536*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.cg = map_internal_cg_to_cg(mP010ColorGamut);
1537*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.ct = map_internal_ct_to_ct(ultrahdr_transfer_function::ULTRAHDR_TF_HLG);
1538*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.range = UHDR_CR_LIMITED_RANGE;
1539*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.w = kImageWidth;
1540*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.h = kImageHeight;
1541*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_Y] = rawImg2.getImageHandle()->data;
1542*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_Y] = rawImg2.getImageHandle()->luma_stride;
1543*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_UV] = rawImg2.getImageHandle()->chroma_data;
1544*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_UV] = rawImg2.getImageHandle()->chroma_stride;
1545*89a0ef05SAndroid Build Coastguard Worker     uhdr_error_info_t status = uhdr_enc_set_raw_image(obj, &uhdrRawImg, UHDR_HDR_IMG);
1546*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1547*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_quality(obj, kQuality, UHDR_BASE_IMG);
1548*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1549*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_using_multi_channel_gainmap(obj, false);
1550*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1551*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_gainmap_scale_factor(obj, 4);
1552*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1553*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_quality(obj, 85, UHDR_GAIN_MAP_IMG);
1554*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1555*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_preset(obj, UHDR_USAGE_REALTIME);
1556*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1557*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_encode(obj);
1558*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1559*89a0ef05SAndroid Build Coastguard Worker     uhdr_compressed_image_t* compressedImage = uhdr_get_encoded_stream(obj);
1560*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, compressedImage);
1561*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, compressedImage->data_sz);
1562*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, compressedImage->data, jpg1->length));
1563*89a0ef05SAndroid Build Coastguard Worker     uhdr_release_encoder(obj);
1564*89a0ef05SAndroid Build Coastguard Worker   }
1565*89a0ef05SAndroid Build Coastguard Worker   // encode with chroma stride set
1566*89a0ef05SAndroid Build Coastguard Worker   {
1567*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
1568*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut));
1569*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageStride(0, kImageWidth + 34));
1570*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setChromaMode(false));
1571*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
1572*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
1573*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1574*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1575*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1576*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1577*89a0ef05SAndroid Build Coastguard Worker                             jpgImg2.getImageHandle(), kQuality, nullptr),
1578*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1579*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1580*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1581*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1582*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1583*89a0ef05SAndroid Build Coastguard Worker   }
1584*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set but no chroma ptr
1585*89a0ef05SAndroid Build Coastguard Worker   {
1586*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
1587*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut));
1588*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.setImageStride(kImageWidth, kImageWidth + 38));
1589*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.allocateMemory());
1590*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
1591*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1592*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1593*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1594*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1595*89a0ef05SAndroid Build Coastguard Worker                             jpgImg2.getImageHandle(), kQuality, nullptr),
1596*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1597*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1598*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1599*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1600*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1601*89a0ef05SAndroid Build Coastguard Worker   }
1602*89a0ef05SAndroid Build Coastguard Worker 
1603*89a0ef05SAndroid Build Coastguard Worker   auto jpg1 = jpgImg.getImageHandle();
1604*89a0ef05SAndroid Build Coastguard Worker #ifdef DUMP_OUTPUT
1605*89a0ef05SAndroid Build Coastguard Worker   if (!writeFile("encode_api0_output.jpeg", jpg1->data, jpg1->length)) {
1606*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "unable to write output file" << std::endl;
1607*89a0ef05SAndroid Build Coastguard Worker   }
1608*89a0ef05SAndroid Build Coastguard Worker #endif
1609*89a0ef05SAndroid Build Coastguard Worker 
1610*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api0_output.rgb"));
1611*89a0ef05SAndroid Build Coastguard Worker }
1612*89a0ef05SAndroid Build Coastguard Worker 
1613*89a0ef05SAndroid Build Coastguard Worker /* Test Encode API-1 and Decode */
TEST_P(JpegRAPIEncodeAndDecodeTest,EncodeAPI1AndDecodeTest)1614*89a0ef05SAndroid Build Coastguard Worker TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI1AndDecodeTest) {
1615*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
1616*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut));
1617*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.allocateMemory());
1618*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
1619*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
1620*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.setImageColorGamut(mYuv420ColorGamut));
1621*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.allocateMemory());
1622*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
1623*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
1624*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
1625*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
1626*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg420.getImageHandle(),
1627*89a0ef05SAndroid Build Coastguard Worker                                 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1628*89a0ef05SAndroid Build Coastguard Worker                                 jpgImg.getImageHandle(), kQuality, nullptr),
1629*89a0ef05SAndroid Build Coastguard Worker             JPEGR_NO_ERROR);
1630*89a0ef05SAndroid Build Coastguard Worker   // encode with luma stride set p010
1631*89a0ef05SAndroid Build Coastguard Worker   {
1632*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1633*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
1634*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
1635*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
1636*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1637*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1638*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1639*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
1640*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1641*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
1642*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR);
1643*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1644*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1645*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1646*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1647*89a0ef05SAndroid Build Coastguard Worker   }
1648*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set p010
1649*89a0ef05SAndroid Build Coastguard Worker   {
1650*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1651*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
1652*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
1653*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1654*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
1655*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1656*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1657*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1658*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
1659*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1660*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
1661*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR);
1662*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1663*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1664*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1665*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1666*89a0ef05SAndroid Build Coastguard Worker   }
1667*89a0ef05SAndroid Build Coastguard Worker   // encode with chroma stride set p010
1668*89a0ef05SAndroid Build Coastguard Worker   {
1669*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1670*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
1671*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
1672*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1673*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
1674*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1675*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1676*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1677*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
1678*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1679*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
1680*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR);
1681*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1682*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1683*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1684*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1685*89a0ef05SAndroid Build Coastguard Worker   }
1686*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set but no chroma ptr p010
1687*89a0ef05SAndroid Build Coastguard Worker   {
1688*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1689*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
1690*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 64, kImageWidth + 256));
1691*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
1692*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1693*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1694*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1695*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
1696*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1697*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
1698*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR);
1699*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1700*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1701*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1702*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1703*89a0ef05SAndroid Build Coastguard Worker   }
1704*89a0ef05SAndroid Build Coastguard Worker   // encode with luma stride set 420
1705*89a0ef05SAndroid Build Coastguard Worker   {
1706*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
1707*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
1708*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 14, 0));
1709*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.allocateMemory());
1710*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
1711*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1712*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1713*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(),
1714*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1715*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
1716*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR);
1717*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1718*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1719*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1720*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1721*89a0ef05SAndroid Build Coastguard Worker   }
1722*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set 420
1723*89a0ef05SAndroid Build Coastguard Worker   {
1724*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
1725*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
1726*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 46, kImageWidth / 2 + 34));
1727*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setChromaMode(false));
1728*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.allocateMemory());
1729*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
1730*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1731*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1732*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(),
1733*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1734*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
1735*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR);
1736*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1737*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1738*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1739*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1740*89a0ef05SAndroid Build Coastguard Worker 
1741*89a0ef05SAndroid Build Coastguard Worker     uhdr_codec_private_t* obj = uhdr_create_encoder();
1742*89a0ef05SAndroid Build Coastguard Worker     uhdr_raw_image_t uhdrRawImg{};
1743*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.fmt = UHDR_IMG_FMT_24bppYCbCrP010;
1744*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.cg = map_internal_cg_to_cg(mP010ColorGamut);
1745*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.ct = map_internal_ct_to_ct(ultrahdr_transfer_function::ULTRAHDR_TF_HLG);
1746*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.range = UHDR_CR_LIMITED_RANGE;
1747*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.w = kImageWidth;
1748*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.h = kImageHeight;
1749*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_Y] = rawImgP010.getImageHandle()->data;
1750*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_Y] = kImageWidth;
1751*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_UV] =
1752*89a0ef05SAndroid Build Coastguard Worker         ((uint8_t*)(rawImgP010.getImageHandle()->data)) + kImageWidth * kImageHeight * 2;
1753*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_UV] = kImageWidth;
1754*89a0ef05SAndroid Build Coastguard Worker     uhdr_error_info_t status = uhdr_enc_set_raw_image(obj, &uhdrRawImg, UHDR_HDR_IMG);
1755*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1756*89a0ef05SAndroid Build Coastguard Worker 
1757*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.fmt = UHDR_IMG_FMT_12bppYCbCr420;
1758*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.cg = map_internal_cg_to_cg(mYuv420ColorGamut);
1759*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.ct = map_internal_ct_to_ct(ultrahdr_transfer_function::ULTRAHDR_TF_SRGB);
1760*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.range = UHDR_CR_FULL_RANGE;
1761*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.w = kImageWidth;
1762*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.h = kImageHeight;
1763*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_Y] = rawImg2420.getImageHandle()->data;
1764*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_Y] = rawImg2420.getImageHandle()->luma_stride;
1765*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_U] = rawImg2420.getImageHandle()->chroma_data;
1766*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_U] = rawImg2420.getImageHandle()->chroma_stride;
1767*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_V] = ((uint8_t*)(rawImg2420.getImageHandle()->chroma_data)) +
1768*89a0ef05SAndroid Build Coastguard Worker                                       rawImg2420.getImageHandle()->chroma_stride * kImageHeight / 2;
1769*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_V] = rawImg2420.getImageHandle()->chroma_stride;
1770*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_raw_image(obj, &uhdrRawImg, UHDR_SDR_IMG);
1771*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1772*89a0ef05SAndroid Build Coastguard Worker 
1773*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_quality(obj, kQuality, UHDR_BASE_IMG);
1774*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1775*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_using_multi_channel_gainmap(obj, false);
1776*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1777*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_gainmap_scale_factor(obj, 4);
1778*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1779*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_quality(obj, 85, UHDR_GAIN_MAP_IMG);
1780*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1781*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_preset(obj, UHDR_USAGE_REALTIME);
1782*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1783*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_encode(obj);
1784*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1785*89a0ef05SAndroid Build Coastguard Worker     uhdr_compressed_image_t* compressedImage = uhdr_get_encoded_stream(obj);
1786*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, compressedImage);
1787*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpgImg.getImageHandle()->length, compressedImage->data_sz);
1788*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1789*89a0ef05SAndroid Build Coastguard Worker         0, memcmp(jpgImg.getImageHandle()->data, compressedImage->data, compressedImage->data_sz));
1790*89a0ef05SAndroid Build Coastguard Worker     uhdr_release_encoder(obj);
1791*89a0ef05SAndroid Build Coastguard Worker   }
1792*89a0ef05SAndroid Build Coastguard Worker   // encode with chroma stride set 420
1793*89a0ef05SAndroid Build Coastguard Worker   {
1794*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
1795*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
1796*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageStride(0, kImageWidth / 2 + 38));
1797*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setChromaMode(false));
1798*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.allocateMemory());
1799*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
1800*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1801*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1802*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(),
1803*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1804*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
1805*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR);
1806*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1807*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1808*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1809*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1810*89a0ef05SAndroid Build Coastguard Worker   }
1811*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set but no chroma ptr 420
1812*89a0ef05SAndroid Build Coastguard Worker   {
1813*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
1814*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
1815*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 26, kImageWidth / 2 + 44));
1816*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.allocateMemory());
1817*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
1818*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1819*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1820*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(),
1821*89a0ef05SAndroid Build Coastguard Worker                                   ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1822*89a0ef05SAndroid Build Coastguard Worker                                   jpgImg2.getImageHandle(), kQuality, nullptr),
1823*89a0ef05SAndroid Build Coastguard Worker               JPEGR_NO_ERROR);
1824*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1825*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1826*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1827*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1828*89a0ef05SAndroid Build Coastguard Worker   }
1829*89a0ef05SAndroid Build Coastguard Worker 
1830*89a0ef05SAndroid Build Coastguard Worker   auto jpg1 = jpgImg.getImageHandle();
1831*89a0ef05SAndroid Build Coastguard Worker 
1832*89a0ef05SAndroid Build Coastguard Worker #ifdef DUMP_OUTPUT
1833*89a0ef05SAndroid Build Coastguard Worker   if (!writeFile("encode_api1_output.jpeg", jpg1->data, jpg1->length)) {
1834*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "unable to write output file" << std::endl;
1835*89a0ef05SAndroid Build Coastguard Worker   }
1836*89a0ef05SAndroid Build Coastguard Worker #endif
1837*89a0ef05SAndroid Build Coastguard Worker 
1838*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api1_output.rgb"));
1839*89a0ef05SAndroid Build Coastguard Worker }
1840*89a0ef05SAndroid Build Coastguard Worker 
1841*89a0ef05SAndroid Build Coastguard Worker /* Test Encode API-2 and Decode */
TEST_P(JpegRAPIEncodeAndDecodeTest,EncodeAPI2AndDecodeTest)1842*89a0ef05SAndroid Build Coastguard Worker TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI2AndDecodeTest) {
1843*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
1844*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut));
1845*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.allocateMemory());
1846*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
1847*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
1848*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.setImageColorGamut(mYuv420ColorGamut));
1849*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.allocateMemory());
1850*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
1851*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
1852*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
1853*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgSdr(kImageWidth, kImageHeight);
1854*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgSdr.allocateMemory());
1855*89a0ef05SAndroid Build Coastguard Worker   auto sdr = jpgSdr.getImageHandle();
1856*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(readFile(kSdrJpgFileName, sdr->data, sdr->maxLength, sdr->length));
1857*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
1858*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(
1859*89a0ef05SAndroid Build Coastguard Worker       uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg420.getImageHandle(), sdr,
1860*89a0ef05SAndroid Build Coastguard Worker                           ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
1861*89a0ef05SAndroid Build Coastguard Worker       JPEGR_NO_ERROR);
1862*89a0ef05SAndroid Build Coastguard Worker   // encode with luma stride set
1863*89a0ef05SAndroid Build Coastguard Worker   {
1864*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1865*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
1866*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
1867*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
1868*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1869*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1870*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1871*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1872*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
1873*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
1874*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1875*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1876*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1877*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1878*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1879*89a0ef05SAndroid Build Coastguard Worker   }
1880*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set
1881*89a0ef05SAndroid Build Coastguard Worker   {
1882*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1883*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
1884*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
1885*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1886*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
1887*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1888*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1889*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1890*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1891*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
1892*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
1893*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1894*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1895*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1896*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1897*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1898*89a0ef05SAndroid Build Coastguard Worker   }
1899*89a0ef05SAndroid Build Coastguard Worker   // encode with chroma stride set
1900*89a0ef05SAndroid Build Coastguard Worker   {
1901*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1902*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
1903*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
1904*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1905*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
1906*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1907*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1908*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1909*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1910*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
1911*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
1912*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1913*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1914*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1915*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1916*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1917*89a0ef05SAndroid Build Coastguard Worker   }
1918*89a0ef05SAndroid Build Coastguard Worker   // encode with luma stride set
1919*89a0ef05SAndroid Build Coastguard Worker   {
1920*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
1921*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
1922*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 128, 0));
1923*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.allocateMemory());
1924*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
1925*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1926*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1927*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1928*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr,
1929*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
1930*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1931*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1932*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1933*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1934*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1935*89a0ef05SAndroid Build Coastguard Worker   }
1936*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set
1937*89a0ef05SAndroid Build Coastguard Worker   {
1938*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
1939*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
1940*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 128, kImageWidth + 256));
1941*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setChromaMode(false));
1942*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.allocateMemory());
1943*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
1944*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1945*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
1946*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
1947*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr,
1948*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
1949*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
1950*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
1951*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
1952*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
1953*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1954*89a0ef05SAndroid Build Coastguard Worker 
1955*89a0ef05SAndroid Build Coastguard Worker     uhdr_codec_private_t* obj = uhdr_create_encoder();
1956*89a0ef05SAndroid Build Coastguard Worker     uhdr_raw_image_t uhdrRawImg{};
1957*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.fmt = UHDR_IMG_FMT_24bppYCbCrP010;
1958*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.cg = map_internal_cg_to_cg(mP010ColorGamut);
1959*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.ct = map_internal_ct_to_ct(ultrahdr_transfer_function::ULTRAHDR_TF_HLG);
1960*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.range = UHDR_CR_LIMITED_RANGE;
1961*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.w = kImageWidth;
1962*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.h = kImageHeight;
1963*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_Y] = rawImgP010.getImageHandle()->data;
1964*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_Y] = kImageWidth;
1965*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_UV] =
1966*89a0ef05SAndroid Build Coastguard Worker         ((uint8_t*)(rawImgP010.getImageHandle()->data)) + kImageWidth * kImageHeight * 2;
1967*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_UV] = kImageWidth;
1968*89a0ef05SAndroid Build Coastguard Worker     uhdr_error_info_t status = uhdr_enc_set_raw_image(obj, &uhdrRawImg, UHDR_HDR_IMG);
1969*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1970*89a0ef05SAndroid Build Coastguard Worker 
1971*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.fmt = UHDR_IMG_FMT_12bppYCbCr420;
1972*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.cg = map_internal_cg_to_cg(mYuv420ColorGamut);
1973*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.ct = map_internal_ct_to_ct(ultrahdr_transfer_function::ULTRAHDR_TF_SRGB);
1974*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.range = UHDR_CR_FULL_RANGE;
1975*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.w = kImageWidth;
1976*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.h = kImageHeight;
1977*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_Y] = rawImg2420.getImageHandle()->data;
1978*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_Y] = rawImg2420.getImageHandle()->luma_stride;
1979*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_U] = rawImg2420.getImageHandle()->chroma_data;
1980*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_U] = rawImg2420.getImageHandle()->chroma_stride;
1981*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_V] = ((uint8_t*)(rawImg2420.getImageHandle()->chroma_data)) +
1982*89a0ef05SAndroid Build Coastguard Worker                                       rawImg2420.getImageHandle()->chroma_stride * kImageHeight / 2;
1983*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_V] = rawImg2420.getImageHandle()->chroma_stride;
1984*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_raw_image(obj, &uhdrRawImg, UHDR_SDR_IMG);
1985*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1986*89a0ef05SAndroid Build Coastguard Worker 
1987*89a0ef05SAndroid Build Coastguard Worker     uhdr_compressed_image_t uhdrCompressedImg;
1988*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.data = sdr->data;
1989*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.data_sz = sdr->length;
1990*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.capacity = sdr->length;
1991*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.cg = map_internal_cg_to_cg(sdr->colorGamut);
1992*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.ct = UHDR_CT_UNSPECIFIED;
1993*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.range = UHDR_CR_UNSPECIFIED;
1994*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_compressed_image(obj, &uhdrCompressedImg, UHDR_SDR_IMG);
1995*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1996*89a0ef05SAndroid Build Coastguard Worker 
1997*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_quality(obj, kQuality, UHDR_BASE_IMG);
1998*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
1999*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_using_multi_channel_gainmap(obj, false);
2000*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2001*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_gainmap_scale_factor(obj, 4);
2002*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2003*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_quality(obj, 85, UHDR_GAIN_MAP_IMG);
2004*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2005*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_preset(obj, UHDR_USAGE_REALTIME);
2006*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2007*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_encode(obj);
2008*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2009*89a0ef05SAndroid Build Coastguard Worker     uhdr_compressed_image_t* compressedImage = uhdr_get_encoded_stream(obj);
2010*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, compressedImage);
2011*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpgImg.getImageHandle()->length, compressedImage->data_sz);
2012*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
2013*89a0ef05SAndroid Build Coastguard Worker         0, memcmp(jpgImg.getImageHandle()->data, compressedImage->data, compressedImage->data_sz));
2014*89a0ef05SAndroid Build Coastguard Worker     uhdr_release_encoder(obj);
2015*89a0ef05SAndroid Build Coastguard Worker   }
2016*89a0ef05SAndroid Build Coastguard Worker   // encode with chroma stride set
2017*89a0ef05SAndroid Build Coastguard Worker   {
2018*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
2019*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
2020*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setImageStride(0, kImageWidth + 64));
2021*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.setChromaMode(false));
2022*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.allocateMemory());
2023*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
2024*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
2025*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
2026*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
2027*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr,
2028*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
2029*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
2030*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
2031*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
2032*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
2033*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
2034*89a0ef05SAndroid Build Coastguard Worker   }
2035*89a0ef05SAndroid Build Coastguard Worker 
2036*89a0ef05SAndroid Build Coastguard Worker   auto jpg1 = jpgImg.getImageHandle();
2037*89a0ef05SAndroid Build Coastguard Worker 
2038*89a0ef05SAndroid Build Coastguard Worker #ifdef DUMP_OUTPUT
2039*89a0ef05SAndroid Build Coastguard Worker   if (!writeFile("encode_api2_output.jpeg", jpg1->data, jpg1->length)) {
2040*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "unable to write output file" << std::endl;
2041*89a0ef05SAndroid Build Coastguard Worker   }
2042*89a0ef05SAndroid Build Coastguard Worker #endif
2043*89a0ef05SAndroid Build Coastguard Worker 
2044*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api2_output.rgb"));
2045*89a0ef05SAndroid Build Coastguard Worker }
2046*89a0ef05SAndroid Build Coastguard Worker 
2047*89a0ef05SAndroid Build Coastguard Worker /* Test Encode API-3 and Decode */
TEST_P(JpegRAPIEncodeAndDecodeTest,EncodeAPI3AndDecodeTest)2048*89a0ef05SAndroid Build Coastguard Worker TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI3AndDecodeTest) {
2049*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
2050*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut));
2051*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.allocateMemory());
2052*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
2053*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
2054*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgImg.allocateMemory());
2055*89a0ef05SAndroid Build Coastguard Worker   UhdrCompressedStructWrapper jpgSdr(kImageWidth, kImageHeight);
2056*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(jpgSdr.allocateMemory());
2057*89a0ef05SAndroid Build Coastguard Worker   auto sdr = jpgSdr.getImageHandle();
2058*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(readFile(kSdrJpgFileName, sdr->data, sdr->maxLength, sdr->length));
2059*89a0ef05SAndroid Build Coastguard Worker   JpegR uHdrLib;
2060*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(
2061*89a0ef05SAndroid Build Coastguard Worker       uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), sdr,
2062*89a0ef05SAndroid Build Coastguard Worker                           ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg.getImageHandle()),
2063*89a0ef05SAndroid Build Coastguard Worker       JPEGR_NO_ERROR);
2064*89a0ef05SAndroid Build Coastguard Worker   // encode with luma stride set
2065*89a0ef05SAndroid Build Coastguard Worker   {
2066*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
2067*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
2068*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
2069*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
2070*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
2071*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
2072*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
2073*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
2074*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
2075*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
2076*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
2077*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
2078*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
2079*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
2080*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
2081*89a0ef05SAndroid Build Coastguard Worker   }
2082*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set
2083*89a0ef05SAndroid Build Coastguard Worker   {
2084*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
2085*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
2086*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
2087*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setChromaMode(false));
2088*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
2089*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
2090*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
2091*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
2092*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
2093*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
2094*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
2095*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
2096*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
2097*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
2098*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
2099*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
2100*89a0ef05SAndroid Build Coastguard Worker   }
2101*89a0ef05SAndroid Build Coastguard Worker   // encode with chroma stride set
2102*89a0ef05SAndroid Build Coastguard Worker   {
2103*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
2104*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
2105*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
2106*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setChromaMode(false));
2107*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
2108*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
2109*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
2110*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
2111*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
2112*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
2113*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
2114*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
2115*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
2116*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
2117*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
2118*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
2119*89a0ef05SAndroid Build Coastguard Worker   }
2120*89a0ef05SAndroid Build Coastguard Worker   // encode with luma and chroma stride set and no chroma ptr
2121*89a0ef05SAndroid Build Coastguard Worker   {
2122*89a0ef05SAndroid Build Coastguard Worker     UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
2123*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
2124*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 32, kImageWidth + 256));
2125*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.allocateMemory());
2126*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
2127*89a0ef05SAndroid Build Coastguard Worker     UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
2128*89a0ef05SAndroid Build Coastguard Worker     ASSERT_TRUE(jpgImg2.allocateMemory());
2129*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
2130*89a0ef05SAndroid Build Coastguard Worker         uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
2131*89a0ef05SAndroid Build Coastguard Worker                             ultrahdr_transfer_function::ULTRAHDR_TF_HLG, jpgImg2.getImageHandle()),
2132*89a0ef05SAndroid Build Coastguard Worker         JPEGR_NO_ERROR);
2133*89a0ef05SAndroid Build Coastguard Worker     auto jpg1 = jpgImg.getImageHandle();
2134*89a0ef05SAndroid Build Coastguard Worker     auto jpg2 = jpgImg2.getImageHandle();
2135*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpg1->length, jpg2->length);
2136*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
2137*89a0ef05SAndroid Build Coastguard Worker   }
2138*89a0ef05SAndroid Build Coastguard Worker 
2139*89a0ef05SAndroid Build Coastguard Worker   {
2140*89a0ef05SAndroid Build Coastguard Worker     uhdr_codec_private_t* obj = uhdr_create_encoder();
2141*89a0ef05SAndroid Build Coastguard Worker     uhdr_raw_image_t uhdrRawImg{};
2142*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.fmt = UHDR_IMG_FMT_24bppYCbCrP010;
2143*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.cg = map_internal_cg_to_cg(mP010ColorGamut);
2144*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.ct = map_internal_ct_to_ct(ultrahdr_transfer_function::ULTRAHDR_TF_HLG);
2145*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.range = UHDR_CR_LIMITED_RANGE;
2146*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.w = kImageWidth;
2147*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.h = kImageHeight;
2148*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_Y] = rawImgP010.getImageHandle()->data;
2149*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_Y] = kImageWidth;
2150*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.planes[UHDR_PLANE_UV] =
2151*89a0ef05SAndroid Build Coastguard Worker         ((uint8_t*)(rawImgP010.getImageHandle()->data)) + kImageWidth * kImageHeight * 2;
2152*89a0ef05SAndroid Build Coastguard Worker     uhdrRawImg.stride[UHDR_PLANE_UV] = kImageWidth;
2153*89a0ef05SAndroid Build Coastguard Worker     uhdr_error_info_t status = uhdr_enc_set_raw_image(obj, &uhdrRawImg, UHDR_HDR_IMG);
2154*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2155*89a0ef05SAndroid Build Coastguard Worker 
2156*89a0ef05SAndroid Build Coastguard Worker     uhdr_compressed_image_t uhdrCompressedImg;
2157*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.data = sdr->data;
2158*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.data_sz = sdr->length;
2159*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.capacity = sdr->length;
2160*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.cg = map_internal_cg_to_cg(sdr->colorGamut);
2161*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.ct = UHDR_CT_UNSPECIFIED;
2162*89a0ef05SAndroid Build Coastguard Worker     uhdrCompressedImg.range = UHDR_CR_UNSPECIFIED;
2163*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_compressed_image(obj, &uhdrCompressedImg, UHDR_SDR_IMG);
2164*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2165*89a0ef05SAndroid Build Coastguard Worker 
2166*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_quality(obj, kQuality, UHDR_BASE_IMG);
2167*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2168*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_using_multi_channel_gainmap(obj, false);
2169*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2170*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_gainmap_scale_factor(obj, 4);
2171*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2172*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_quality(obj, 85, UHDR_GAIN_MAP_IMG);
2173*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2174*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_enc_set_preset(obj, UHDR_USAGE_REALTIME);
2175*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2176*89a0ef05SAndroid Build Coastguard Worker     status = uhdr_encode(obj);
2177*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, status.error_code) << status.detail;
2178*89a0ef05SAndroid Build Coastguard Worker     uhdr_compressed_image_t* compressedImage = uhdr_get_encoded_stream(obj);
2179*89a0ef05SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, compressedImage);
2180*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(jpgImg.getImageHandle()->length, compressedImage->data_sz);
2181*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(
2182*89a0ef05SAndroid Build Coastguard Worker         0, memcmp(jpgImg.getImageHandle()->data, compressedImage->data, compressedImage->data_sz));
2183*89a0ef05SAndroid Build Coastguard Worker     uhdr_release_encoder(obj);
2184*89a0ef05SAndroid Build Coastguard Worker   }
2185*89a0ef05SAndroid Build Coastguard Worker 
2186*89a0ef05SAndroid Build Coastguard Worker   auto jpg1 = jpgImg.getImageHandle();
2187*89a0ef05SAndroid Build Coastguard Worker 
2188*89a0ef05SAndroid Build Coastguard Worker #ifdef DUMP_OUTPUT
2189*89a0ef05SAndroid Build Coastguard Worker   if (!writeFile("encode_api3_output.jpeg", jpg1->data, jpg1->length)) {
2190*89a0ef05SAndroid Build Coastguard Worker     std::cerr << "unable to write output file" << std::endl;
2191*89a0ef05SAndroid Build Coastguard Worker   }
2192*89a0ef05SAndroid Build Coastguard Worker #endif
2193*89a0ef05SAndroid Build Coastguard Worker 
2194*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api3_output.rgb"));
2195*89a0ef05SAndroid Build Coastguard Worker }
2196*89a0ef05SAndroid Build Coastguard Worker 
2197*89a0ef05SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
2198*89a0ef05SAndroid Build Coastguard Worker     JpegRAPIParameterizedTests, JpegRAPIEncodeAndDecodeTest,
2199*89a0ef05SAndroid Build Coastguard Worker     ::testing::Combine(::testing::Values(ULTRAHDR_COLORGAMUT_BT709, ULTRAHDR_COLORGAMUT_P3,
2200*89a0ef05SAndroid Build Coastguard Worker                                          ULTRAHDR_COLORGAMUT_BT2100),
2201*89a0ef05SAndroid Build Coastguard Worker                        ::testing::Values(ULTRAHDR_COLORGAMUT_BT709, ULTRAHDR_COLORGAMUT_P3,
2202*89a0ef05SAndroid Build Coastguard Worker                                          ULTRAHDR_COLORGAMUT_BT2100)));
2203*89a0ef05SAndroid Build Coastguard Worker 
2204*89a0ef05SAndroid Build Coastguard Worker // ============================================================================
2205*89a0ef05SAndroid Build Coastguard Worker // Profiling
2206*89a0ef05SAndroid Build Coastguard Worker // ============================================================================
2207*89a0ef05SAndroid Build Coastguard Worker #ifdef _WIN32
2208*89a0ef05SAndroid Build Coastguard Worker class Profiler {
2209*89a0ef05SAndroid Build Coastguard Worker  public:
timerStart()2210*89a0ef05SAndroid Build Coastguard Worker   void timerStart() { QueryPerformanceCounter(&mStartingTime); }
2211*89a0ef05SAndroid Build Coastguard Worker 
timerStop()2212*89a0ef05SAndroid Build Coastguard Worker   void timerStop() { QueryPerformanceCounter(&mEndingTime); }
2213*89a0ef05SAndroid Build Coastguard Worker 
elapsedTime()2214*89a0ef05SAndroid Build Coastguard Worker   double elapsedTime() {
2215*89a0ef05SAndroid Build Coastguard Worker     LARGE_INTEGER frequency;
2216*89a0ef05SAndroid Build Coastguard Worker     LARGE_INTEGER elapsedMicroseconds;
2217*89a0ef05SAndroid Build Coastguard Worker     QueryPerformanceFrequency(&frequency);
2218*89a0ef05SAndroid Build Coastguard Worker     elapsedMicroseconds.QuadPart = mEndingTime.QuadPart - mStartingTime.QuadPart;
2219*89a0ef05SAndroid Build Coastguard Worker     return (double)elapsedMicroseconds.QuadPart / (double)frequency.QuadPart * 1000000;
2220*89a0ef05SAndroid Build Coastguard Worker   }
2221*89a0ef05SAndroid Build Coastguard Worker 
2222*89a0ef05SAndroid Build Coastguard Worker  private:
2223*89a0ef05SAndroid Build Coastguard Worker   LARGE_INTEGER mStartingTime;
2224*89a0ef05SAndroid Build Coastguard Worker   LARGE_INTEGER mEndingTime;
2225*89a0ef05SAndroid Build Coastguard Worker };
2226*89a0ef05SAndroid Build Coastguard Worker #else
2227*89a0ef05SAndroid Build Coastguard Worker class Profiler {
2228*89a0ef05SAndroid Build Coastguard Worker  public:
timerStart()2229*89a0ef05SAndroid Build Coastguard Worker   void timerStart() { gettimeofday(&mStartingTime, nullptr); }
2230*89a0ef05SAndroid Build Coastguard Worker 
timerStop()2231*89a0ef05SAndroid Build Coastguard Worker   void timerStop() { gettimeofday(&mEndingTime, nullptr); }
2232*89a0ef05SAndroid Build Coastguard Worker 
elapsedTime()2233*89a0ef05SAndroid Build Coastguard Worker   int64_t elapsedTime() {
2234*89a0ef05SAndroid Build Coastguard Worker     struct timeval elapsedMicroseconds;
2235*89a0ef05SAndroid Build Coastguard Worker     elapsedMicroseconds.tv_sec = mEndingTime.tv_sec - mStartingTime.tv_sec;
2236*89a0ef05SAndroid Build Coastguard Worker     elapsedMicroseconds.tv_usec = mEndingTime.tv_usec - mStartingTime.tv_usec;
2237*89a0ef05SAndroid Build Coastguard Worker     return elapsedMicroseconds.tv_sec * 1000000 + elapsedMicroseconds.tv_usec;
2238*89a0ef05SAndroid Build Coastguard Worker   }
2239*89a0ef05SAndroid Build Coastguard Worker 
2240*89a0ef05SAndroid Build Coastguard Worker  private:
2241*89a0ef05SAndroid Build Coastguard Worker   struct timeval mStartingTime;
2242*89a0ef05SAndroid Build Coastguard Worker   struct timeval mEndingTime;
2243*89a0ef05SAndroid Build Coastguard Worker };
2244*89a0ef05SAndroid Build Coastguard Worker #endif
2245*89a0ef05SAndroid Build Coastguard Worker 
2246*89a0ef05SAndroid Build Coastguard Worker class JpegRBenchmark : public JpegR {
2247*89a0ef05SAndroid Build Coastguard Worker  public:
2248*89a0ef05SAndroid Build Coastguard Worker #ifdef UHDR_ENABLE_GLES
JpegRBenchmark(uhdr_opengl_ctxt_t * uhdrGLCtxt)2249*89a0ef05SAndroid Build Coastguard Worker   JpegRBenchmark(uhdr_opengl_ctxt_t* uhdrGLCtxt) : JpegR(uhdrGLCtxt) {}
2250*89a0ef05SAndroid Build Coastguard Worker #endif
2251*89a0ef05SAndroid Build Coastguard Worker   void BenchmarkGenerateGainMap(uhdr_raw_image_t* yuv420Image, uhdr_raw_image_t* p010Image,
2252*89a0ef05SAndroid Build Coastguard Worker                                 uhdr_gainmap_metadata_ext_t* metadata,
2253*89a0ef05SAndroid Build Coastguard Worker                                 std::unique_ptr<uhdr_raw_image_ext_t>& gainmap);
2254*89a0ef05SAndroid Build Coastguard Worker   void BenchmarkApplyGainMap(uhdr_raw_image_t* yuv420Image, uhdr_raw_image_t* map,
2255*89a0ef05SAndroid Build Coastguard Worker                              uhdr_gainmap_metadata_ext_t* metadata, uhdr_raw_image_t* dest);
2256*89a0ef05SAndroid Build Coastguard Worker 
2257*89a0ef05SAndroid Build Coastguard Worker  private:
2258*89a0ef05SAndroid Build Coastguard Worker   const int kProfileCount = 10;
2259*89a0ef05SAndroid Build Coastguard Worker };
2260*89a0ef05SAndroid Build Coastguard Worker 
BenchmarkGenerateGainMap(uhdr_raw_image_t * yuv420Image,uhdr_raw_image_t * p010Image,uhdr_gainmap_metadata_ext_t * metadata,std::unique_ptr<uhdr_raw_image_ext_t> & gainmap)2261*89a0ef05SAndroid Build Coastguard Worker void JpegRBenchmark::BenchmarkGenerateGainMap(uhdr_raw_image_t* yuv420Image,
2262*89a0ef05SAndroid Build Coastguard Worker                                               uhdr_raw_image_t* p010Image,
2263*89a0ef05SAndroid Build Coastguard Worker                                               uhdr_gainmap_metadata_ext_t* metadata,
2264*89a0ef05SAndroid Build Coastguard Worker                                               std::unique_ptr<uhdr_raw_image_ext_t>& gainmap) {
2265*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(yuv420Image->w, p010Image->w);
2266*89a0ef05SAndroid Build Coastguard Worker   ASSERT_EQ(yuv420Image->h, p010Image->h);
2267*89a0ef05SAndroid Build Coastguard Worker   Profiler profileGenerateMap;
2268*89a0ef05SAndroid Build Coastguard Worker   profileGenerateMap.timerStart();
2269*89a0ef05SAndroid Build Coastguard Worker   for (auto i = 0; i < kProfileCount; i++) {
2270*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, generateGainMap(yuv420Image, p010Image, metadata, gainmap).error_code);
2271*89a0ef05SAndroid Build Coastguard Worker   }
2272*89a0ef05SAndroid Build Coastguard Worker   profileGenerateMap.timerStop();
2273*89a0ef05SAndroid Build Coastguard Worker   ALOGV("Generate Gain Map:- Res = %u x %u, time = %f ms", yuv420Image->w, yuv420Image->h,
2274*89a0ef05SAndroid Build Coastguard Worker         profileGenerateMap.elapsedTime() / (kProfileCount * 1000.f));
2275*89a0ef05SAndroid Build Coastguard Worker }
2276*89a0ef05SAndroid Build Coastguard Worker 
BenchmarkApplyGainMap(uhdr_raw_image_t * yuv420Image,uhdr_raw_image_t * map,uhdr_gainmap_metadata_ext_t * metadata,uhdr_raw_image_t * dest)2277*89a0ef05SAndroid Build Coastguard Worker void JpegRBenchmark::BenchmarkApplyGainMap(uhdr_raw_image_t* yuv420Image, uhdr_raw_image_t* map,
2278*89a0ef05SAndroid Build Coastguard Worker                                            uhdr_gainmap_metadata_ext_t* metadata,
2279*89a0ef05SAndroid Build Coastguard Worker                                            uhdr_raw_image_t* dest) {
2280*89a0ef05SAndroid Build Coastguard Worker   Profiler profileRecMap;
2281*89a0ef05SAndroid Build Coastguard Worker   profileRecMap.timerStart();
2282*89a0ef05SAndroid Build Coastguard Worker   for (auto i = 0; i < kProfileCount; i++) {
2283*89a0ef05SAndroid Build Coastguard Worker     ASSERT_EQ(UHDR_CODEC_OK, applyGainMap(yuv420Image, map, metadata, UHDR_CT_HLG,
2284*89a0ef05SAndroid Build Coastguard Worker                                           UHDR_IMG_FMT_32bppRGBA1010102, FLT_MAX, dest)
2285*89a0ef05SAndroid Build Coastguard Worker                                  .error_code);
2286*89a0ef05SAndroid Build Coastguard Worker   }
2287*89a0ef05SAndroid Build Coastguard Worker   profileRecMap.timerStop();
2288*89a0ef05SAndroid Build Coastguard Worker   ALOGV("Apply Gain Map:- Res = %u x %u, time = %f ms", yuv420Image->w, yuv420Image->h,
2289*89a0ef05SAndroid Build Coastguard Worker         profileRecMap.elapsedTime() / (kProfileCount * 1000.f));
2290*89a0ef05SAndroid Build Coastguard Worker }
2291*89a0ef05SAndroid Build Coastguard Worker 
TEST(JpegRTest,ProfileGainMapFuncs)2292*89a0ef05SAndroid Build Coastguard Worker TEST(JpegRTest, ProfileGainMapFuncs) {
2293*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
2294*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
2295*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.allocateMemory());
2296*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
2297*89a0ef05SAndroid Build Coastguard Worker   UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
2298*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
2299*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.allocateMemory());
2300*89a0ef05SAndroid Build Coastguard Worker   ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
2301*89a0ef05SAndroid Build Coastguard Worker   uhdr_gainmap_metadata_ext_t metadata(kJpegrVersion);
2302*89a0ef05SAndroid Build Coastguard Worker 
2303*89a0ef05SAndroid Build Coastguard Worker   uhdr_raw_image_t hdr_intent, sdr_intent;
2304*89a0ef05SAndroid Build Coastguard Worker 
2305*89a0ef05SAndroid Build Coastguard Worker   {
2306*89a0ef05SAndroid Build Coastguard Worker     auto rawImg = rawImgP010.getImageHandle();
2307*89a0ef05SAndroid Build Coastguard Worker     if (rawImg->luma_stride == 0) rawImg->luma_stride = rawImg->width;
2308*89a0ef05SAndroid Build Coastguard Worker     if (!rawImg->chroma_data) {
2309*89a0ef05SAndroid Build Coastguard Worker       uint16_t* data = reinterpret_cast<uint16_t*>(rawImg->data);
2310*89a0ef05SAndroid Build Coastguard Worker       rawImg->chroma_data = data + rawImg->luma_stride * rawImg->height;
2311*89a0ef05SAndroid Build Coastguard Worker       rawImg->chroma_stride = rawImg->luma_stride;
2312*89a0ef05SAndroid Build Coastguard Worker     }
2313*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.fmt = UHDR_IMG_FMT_24bppYCbCrP010;
2314*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.cg = UHDR_CG_BT_2100;
2315*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.ct = UHDR_CT_HLG;
2316*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.range = UHDR_CR_LIMITED_RANGE;
2317*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.w = rawImg->width;
2318*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.h = rawImg->height;
2319*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.planes[UHDR_PLANE_Y] = rawImg->data;
2320*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.stride[UHDR_PLANE_Y] = rawImg->luma_stride;
2321*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.planes[UHDR_PLANE_UV] = rawImg->chroma_data;
2322*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.stride[UHDR_PLANE_UV] = rawImg->chroma_stride;
2323*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.planes[UHDR_PLANE_V] = nullptr;
2324*89a0ef05SAndroid Build Coastguard Worker     hdr_intent.stride[UHDR_PLANE_V] = 0;
2325*89a0ef05SAndroid Build Coastguard Worker   }
2326*89a0ef05SAndroid Build Coastguard Worker   {
2327*89a0ef05SAndroid Build Coastguard Worker     auto rawImg = rawImg420.getImageHandle();
2328*89a0ef05SAndroid Build Coastguard Worker     if (rawImg->luma_stride == 0) rawImg->luma_stride = rawImg->width;
2329*89a0ef05SAndroid Build Coastguard Worker     if (!rawImg->chroma_data) {
2330*89a0ef05SAndroid Build Coastguard Worker       uint8_t* data = reinterpret_cast<uint8_t*>(rawImg->data);
2331*89a0ef05SAndroid Build Coastguard Worker       rawImg->chroma_data = data + rawImg->luma_stride * rawImg->height;
2332*89a0ef05SAndroid Build Coastguard Worker       rawImg->chroma_stride = rawImg->luma_stride / 2;
2333*89a0ef05SAndroid Build Coastguard Worker     }
2334*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.fmt = UHDR_IMG_FMT_12bppYCbCr420;
2335*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.cg = UHDR_CG_DISPLAY_P3;
2336*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.ct = UHDR_CT_SRGB;
2337*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.range = rawImg->colorRange;
2338*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.w = rawImg->width;
2339*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.h = rawImg->height;
2340*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.planes[UHDR_PLANE_Y] = rawImg->data;
2341*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.stride[UHDR_PLANE_Y] = rawImg->luma_stride;
2342*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.planes[UHDR_PLANE_U] = rawImg->chroma_data;
2343*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.stride[UHDR_PLANE_U] = rawImg->chroma_stride;
2344*89a0ef05SAndroid Build Coastguard Worker     uint8_t* data = reinterpret_cast<uint8_t*>(rawImg->chroma_data);
2345*89a0ef05SAndroid Build Coastguard Worker     data += (rawImg->height * rawImg->chroma_stride) / 2;
2346*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.planes[UHDR_PLANE_V] = data;
2347*89a0ef05SAndroid Build Coastguard Worker     sdr_intent.stride[UHDR_PLANE_V] = rawImg->chroma_stride;
2348*89a0ef05SAndroid Build Coastguard Worker   }
2349*89a0ef05SAndroid Build Coastguard Worker 
2350*89a0ef05SAndroid Build Coastguard Worker   std::unique_ptr<uhdr_raw_image_ext_t> gainmap;
2351*89a0ef05SAndroid Build Coastguard Worker 
2352*89a0ef05SAndroid Build Coastguard Worker #ifdef UHDR_ENABLE_GLES
2353*89a0ef05SAndroid Build Coastguard Worker   uhdr_opengl_ctxt_t glCtxt;
2354*89a0ef05SAndroid Build Coastguard Worker   glCtxt.init_opengl_ctxt();
2355*89a0ef05SAndroid Build Coastguard Worker   JpegRBenchmark benchmark(glCtxt.mErrorStatus.error_code == UHDR_CODEC_OK ? &glCtxt : nullptr);
2356*89a0ef05SAndroid Build Coastguard Worker #else
2357*89a0ef05SAndroid Build Coastguard Worker   JpegRBenchmark benchmark;
2358*89a0ef05SAndroid Build Coastguard Worker #endif
2359*89a0ef05SAndroid Build Coastguard Worker 
2360*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
2361*89a0ef05SAndroid Build Coastguard Worker       benchmark.BenchmarkGenerateGainMap(&sdr_intent, &hdr_intent, &metadata, gainmap));
2362*89a0ef05SAndroid Build Coastguard Worker 
2363*89a0ef05SAndroid Build Coastguard Worker   const int dstSize = kImageWidth * kImageWidth * 4;
2364*89a0ef05SAndroid Build Coastguard Worker   auto bufferDst = std::make_unique<uint8_t[]>(dstSize);
2365*89a0ef05SAndroid Build Coastguard Worker   uhdr_raw_image_t output;
2366*89a0ef05SAndroid Build Coastguard Worker   output.fmt = UHDR_IMG_FMT_32bppRGBA1010102;
2367*89a0ef05SAndroid Build Coastguard Worker   output.cg = UHDR_CG_UNSPECIFIED;
2368*89a0ef05SAndroid Build Coastguard Worker   output.ct = UHDR_CT_UNSPECIFIED;
2369*89a0ef05SAndroid Build Coastguard Worker   output.range = UHDR_CR_UNSPECIFIED;
2370*89a0ef05SAndroid Build Coastguard Worker   output.w = kImageWidth;
2371*89a0ef05SAndroid Build Coastguard Worker   output.h = kImageHeight;
2372*89a0ef05SAndroid Build Coastguard Worker   output.planes[UHDR_PLANE_PACKED] = bufferDst.get();
2373*89a0ef05SAndroid Build Coastguard Worker   output.stride[UHDR_PLANE_PACKED] = kImageWidth;
2374*89a0ef05SAndroid Build Coastguard Worker   output.planes[UHDR_PLANE_U] = nullptr;
2375*89a0ef05SAndroid Build Coastguard Worker   output.stride[UHDR_PLANE_U] = 0;
2376*89a0ef05SAndroid Build Coastguard Worker   output.planes[UHDR_PLANE_V] = nullptr;
2377*89a0ef05SAndroid Build Coastguard Worker   output.stride[UHDR_PLANE_V] = 0;
2378*89a0ef05SAndroid Build Coastguard Worker 
2379*89a0ef05SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
2380*89a0ef05SAndroid Build Coastguard Worker       benchmark.BenchmarkApplyGainMap(&sdr_intent, gainmap.get(), &metadata, &output));
2381*89a0ef05SAndroid Build Coastguard Worker 
2382*89a0ef05SAndroid Build Coastguard Worker #ifdef UHDR_ENABLE_GLES
2383*89a0ef05SAndroid Build Coastguard Worker   glCtxt.delete_opengl_ctxt();
2384*89a0ef05SAndroid Build Coastguard Worker #endif
2385*89a0ef05SAndroid Build Coastguard Worker }
2386*89a0ef05SAndroid Build Coastguard Worker 
2387*89a0ef05SAndroid Build Coastguard Worker }  // namespace ultrahdr
2388