blob: 7837bcfc31be1716ba44e6518c6ca0c3b43c9ef4 [file] [log] [blame]
Dichen Zhang85b37562022-10-11 11:08:28 -07001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Ram Mohan9485bc72023-07-24 14:37:05 +053017#include <sys/time.h>
18#include <fstream>
19#include <iostream>
20
21#include <ultrahdr/gainmapmath.h>
Dichen Zhangdbceb0e2023-04-14 19:03:18 +000022#include <ultrahdr/jpegr.h>
23#include <ultrahdr/jpegrutils.h>
Ram Mohan9485bc72023-07-24 14:37:05 +053024
Dichen Zhang36c1e732022-11-23 01:25:34 +000025#include <gtest/gtest.h>
26#include <utils/Log.h>
27
Ram Mohan9485bc72023-07-24 14:37:05 +053028//#define DUMP_OUTPUT
Dichen Zhang85b37562022-10-11 11:08:28 -070029
Dichen Zhangdbceb0e2023-04-14 19:03:18 +000030namespace android::ultrahdr {
Dichen Zhang85b37562022-10-11 11:08:28 -070031
Ram Mohan9485bc72023-07-24 14:37:05 +053032// resources used by unit tests
33const char* kYCbCrP010FileName = "raw_p010_image.p010";
34const char* kYCbCr420FileName = "raw_yuv420_image.yuv420";
35const char* kSdrJpgFileName = "jpeg_image.jpg";
36const int kImageWidth = 1280;
37const int kImageHeight = 720;
38const int kQuality = 90;
Nick Deakin594a4ca2022-11-16 20:57:42 -050039
Ram Mohan9485bc72023-07-24 14:37:05 +053040// Wrapper to describe the input type
41typedef enum {
42 YCbCr_p010 = 0,
43 YCbCr_420 = 1,
44} UhdrInputFormat;
Nick Deakin594a4ca2022-11-16 20:57:42 -050045
Ram Mohan9485bc72023-07-24 14:37:05 +053046/**
47 * Wrapper class for raw resource
48 * Sample usage:
49 * UhdrUnCompressedStructWrapper rawImg(width, height, YCbCr_p010);
50 * rawImg.setImageColorGamut(colorGamut));
51 * rawImg.setImageStride(strideLuma, strideChroma); // optional
52 * rawImg.setChromaMode(false); // optional
53 * rawImg.allocateMemory();
54 * rawImg.loadRawResource(kYCbCrP010FileName);
55 */
56class UhdrUnCompressedStructWrapper {
Nick Deakind19e5762023-02-10 15:39:08 -050057public:
Ram Mohan9485bc72023-07-24 14:37:05 +053058 UhdrUnCompressedStructWrapper(uint32_t width, uint32_t height, UhdrInputFormat format);
59 ~UhdrUnCompressedStructWrapper() = default;
Nick Deakind19e5762023-02-10 15:39:08 -050060
Ram Mohan9485bc72023-07-24 14:37:05 +053061 bool setChromaMode(bool isChromaContiguous);
62 bool setImageStride(int lumaStride, int chromaStride);
63 bool setImageColorGamut(ultrahdr_color_gamut colorGamut);
64 bool allocateMemory();
65 bool loadRawResource(const char* fileName);
66 jr_uncompressed_ptr getImageHandle();
Nick Deakind19e5762023-02-10 15:39:08 -050067
Nick Deakind19e5762023-02-10 15:39:08 -050068private:
Ram Mohan9485bc72023-07-24 14:37:05 +053069 std::unique_ptr<uint8_t[]> mLumaData;
70 std::unique_ptr<uint8_t[]> mChromaData;
71 jpegr_uncompressed_struct mImg;
72 UhdrInputFormat mFormat;
73 bool mIsChromaContiguous;
Nick Deakind19e5762023-02-10 15:39:08 -050074};
75
Ram Mohan9485bc72023-07-24 14:37:05 +053076/**
77 * Wrapper class for compressed resource
78 * Sample usage:
79 * UhdrCompressedStructWrapper jpgImg(width, height);
80 * rawImg.allocateMemory();
81 */
82class UhdrCompressedStructWrapper {
83public:
84 UhdrCompressedStructWrapper(uint32_t width, uint32_t height);
85 ~UhdrCompressedStructWrapper() = default;
Nick Deakind19e5762023-02-10 15:39:08 -050086
Ram Mohan9485bc72023-07-24 14:37:05 +053087 bool allocateMemory();
88 jr_compressed_ptr getImageHandle();
Nick Deakind19e5762023-02-10 15:39:08 -050089
Ram Mohan9485bc72023-07-24 14:37:05 +053090private:
91 std::unique_ptr<uint8_t[]> mData;
92 jpegr_compressed_struct mImg{};
93 uint32_t mWidth;
94 uint32_t mHeight;
95};
96
97UhdrUnCompressedStructWrapper::UhdrUnCompressedStructWrapper(uint32_t width, uint32_t height,
98 UhdrInputFormat format) {
99 mImg.data = nullptr;
100 mImg.width = width;
101 mImg.height = height;
102 mImg.colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED;
103 mImg.chroma_data = nullptr;
104 mImg.luma_stride = 0;
105 mImg.chroma_stride = 0;
106 mFormat = format;
107 mIsChromaContiguous = true;
108}
109
110bool UhdrUnCompressedStructWrapper::setChromaMode(bool isChromaContiguous) {
111 if (mLumaData.get() != nullptr) {
112 std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
113 return false;
Nick Deakind19e5762023-02-10 15:39:08 -0500114 }
Ram Mohan9485bc72023-07-24 14:37:05 +0530115 mIsChromaContiguous = isChromaContiguous;
116 return true;
Nick Deakind19e5762023-02-10 15:39:08 -0500117}
118
Ram Mohan9485bc72023-07-24 14:37:05 +0530119bool UhdrUnCompressedStructWrapper::setImageStride(int lumaStride, int chromaStride) {
120 if (mLumaData.get() != nullptr) {
121 std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
122 return false;
Nick Deakind19e5762023-02-10 15:39:08 -0500123 }
Ram Mohan9485bc72023-07-24 14:37:05 +0530124 if (lumaStride != 0) {
125 if (lumaStride < mImg.width) {
126 std::cerr << "Bad luma stride received" << std::endl;
127 return false;
128 }
129 mImg.luma_stride = lumaStride;
130 }
131 if (chromaStride != 0) {
132 if (mFormat == YCbCr_p010 && chromaStride < mImg.width) {
133 std::cerr << "Bad chroma stride received for format YCbCrP010" << std::endl;
134 return false;
135 }
136 if (mFormat == YCbCr_420 && chromaStride < (mImg.width >> 1)) {
137 std::cerr << "Bad chroma stride received for format YCbCr420" << std::endl;
138 return false;
139 }
140 mImg.chroma_stride = chromaStride;
141 }
142 return true;
Nick Deakind19e5762023-02-10 15:39:08 -0500143}
144
Ram Mohan9485bc72023-07-24 14:37:05 +0530145bool UhdrUnCompressedStructWrapper::setImageColorGamut(ultrahdr_color_gamut colorGamut) {
146 if (mLumaData.get() != nullptr) {
147 std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
148 return false;
149 }
150 mImg.colorGamut = colorGamut;
151 return true;
Nick Deakin594a4ca2022-11-16 20:57:42 -0500152}
153
Ram Mohan9485bc72023-07-24 14:37:05 +0530154bool UhdrUnCompressedStructWrapper::allocateMemory() {
155 if (mImg.width == 0 || (mImg.width % 2 != 0) || mImg.height == 0 || (mImg.height % 2 != 0) ||
156 (mFormat != YCbCr_p010 && mFormat != YCbCr_420)) {
157 std::cerr << "Object in bad state, mem alloc failed" << std::endl;
158 return false;
159 }
160 int lumaStride = mImg.luma_stride == 0 ? mImg.width : mImg.luma_stride;
161 int lumaSize = lumaStride * mImg.height * (mFormat == YCbCr_p010 ? 2 : 1);
162 int chromaSize = (mImg.height >> 1) * (mFormat == YCbCr_p010 ? 2 : 1);
163 if (mIsChromaContiguous) {
164 chromaSize *= lumaStride;
165 } else {
166 if (mImg.chroma_stride == 0) {
167 std::cerr << "Object in bad state, mem alloc failed" << std::endl;
168 return false;
169 }
170 if (mFormat == YCbCr_p010) {
171 chromaSize *= mImg.chroma_stride;
172 } else {
173 chromaSize *= (mImg.chroma_stride * 2);
174 }
175 }
176 if (mIsChromaContiguous) {
177 mLumaData = std::make_unique<uint8_t[]>(lumaSize + chromaSize);
178 mImg.data = mLumaData.get();
179 mImg.chroma_data = nullptr;
180 } else {
181 mLumaData = std::make_unique<uint8_t[]>(lumaSize);
182 mImg.data = mLumaData.get();
183 mChromaData = std::make_unique<uint8_t[]>(chromaSize);
184 mImg.chroma_data = mChromaData.get();
185 }
186 return true;
187}
Ram Mohan35ab3a82023-05-18 18:38:16 +0530188
Ram Mohan9485bc72023-07-24 14:37:05 +0530189bool UhdrUnCompressedStructWrapper::loadRawResource(const char* fileName) {
190 if (!mImg.data) {
191 std::cerr << "memory is not allocated, read not possible" << std::endl;
192 return false;
193 }
194 std::ifstream ifd(fileName, std::ios::binary | std::ios::ate);
195 if (ifd.good()) {
196 int bpp = mFormat == YCbCr_p010 ? 2 : 1;
197 int size = ifd.tellg();
198 int length = mImg.width * mImg.height * bpp * 3 / 2; // 2x2 subsampling
199 if (size < length) {
200 std::cerr << "requested to read " << length << " bytes from file : " << fileName
201 << ", file contains only " << length << " bytes" << std::endl;
202 return false;
203 }
204 ifd.seekg(0, std::ios::beg);
205 int lumaStride = mImg.luma_stride == 0 ? mImg.width : mImg.luma_stride;
206 char* mem = static_cast<char*>(mImg.data);
207 for (int i = 0; i < mImg.height; i++) {
208 ifd.read(mem, mImg.width * bpp);
209 mem += lumaStride * bpp;
210 }
211 if (!mIsChromaContiguous) {
212 mem = static_cast<char*>(mImg.chroma_data);
213 }
214 int chromaStride;
215 if (mIsChromaContiguous) {
216 chromaStride = mFormat == YCbCr_p010 ? lumaStride : lumaStride / 2;
217 } else {
218 if (mFormat == YCbCr_p010) {
219 chromaStride = mImg.chroma_stride == 0 ? lumaStride : mImg.chroma_stride;
220 } else {
221 chromaStride = mImg.chroma_stride == 0 ? (lumaStride / 2) : mImg.chroma_stride;
222 }
223 }
224 if (mFormat == YCbCr_p010) {
225 for (int i = 0; i < mImg.height / 2; i++) {
226 ifd.read(mem, mImg.width * 2);
227 mem += chromaStride * 2;
228 }
229 } else {
230 for (int i = 0; i < mImg.height / 2; i++) {
231 ifd.read(mem, (mImg.width / 2));
232 mem += chromaStride;
233 }
234 for (int i = 0; i < mImg.height / 2; i++) {
235 ifd.read(mem, (mImg.width / 2));
236 mem += chromaStride;
237 }
238 }
239 return true;
240 }
241 std::cerr << "unable to open file : " << fileName << std::endl;
242 return false;
243}
Ram Mohan35ab3a82023-05-18 18:38:16 +0530244
Ram Mohan9485bc72023-07-24 14:37:05 +0530245jr_uncompressed_ptr UhdrUnCompressedStructWrapper::getImageHandle() {
246 return &mImg;
247}
Ram Mohan35ab3a82023-05-18 18:38:16 +0530248
Ram Mohan9485bc72023-07-24 14:37:05 +0530249UhdrCompressedStructWrapper::UhdrCompressedStructWrapper(uint32_t width, uint32_t height) {
250 mWidth = width;
251 mHeight = height;
252}
Ram Mohan35ab3a82023-05-18 18:38:16 +0530253
Ram Mohan9485bc72023-07-24 14:37:05 +0530254bool UhdrCompressedStructWrapper::allocateMemory() {
255 if (mWidth == 0 || (mWidth % 2 != 0) || mHeight == 0 || (mHeight % 2 != 0)) {
256 std::cerr << "Object in bad state, mem alloc failed" << std::endl;
257 return false;
258 }
259 int maxLength = std::max(8 * 1024 /* min size 8kb */, (int)(mWidth * mHeight * 3 * 2));
260 mData = std::make_unique<uint8_t[]>(maxLength);
261 mImg.data = mData.get();
262 mImg.length = 0;
263 mImg.maxLength = maxLength;
264 return true;
265}
Ram Mohan35ab3a82023-05-18 18:38:16 +0530266
Ram Mohan9485bc72023-07-24 14:37:05 +0530267jr_compressed_ptr UhdrCompressedStructWrapper::getImageHandle() {
268 return &mImg;
269}
Ram Mohan35ab3a82023-05-18 18:38:16 +0530270
Ram Mohan9485bc72023-07-24 14:37:05 +0530271static bool writeFile(const char* filename, void*& result, int length) {
272 std::ofstream ofd(filename, std::ios::binary);
273 if (ofd.is_open()) {
274 ofd.write(static_cast<char*>(result), length);
275 return true;
276 }
277 std::cerr << "unable to write to file : " << filename << std::endl;
278 return false;
279}
Ram Mohan35ab3a82023-05-18 18:38:16 +0530280
Ram Mohan9485bc72023-07-24 14:37:05 +0530281static bool readFile(const char* fileName, void*& result, int maxLength, int& length) {
282 std::ifstream ifd(fileName, std::ios::binary | std::ios::ate);
283 if (ifd.good()) {
284 length = ifd.tellg();
285 if (length > maxLength) {
286 std::cerr << "not enough space to read file" << std::endl;
287 return false;
288 }
289 ifd.seekg(0, std::ios::beg);
290 ifd.read(static_cast<char*>(result), length);
291 return true;
292 }
293 std::cerr << "unable to read file : " << fileName << std::endl;
294 return false;
295}
Ram Mohan35ab3a82023-05-18 18:38:16 +0530296
Ram Mohan9485bc72023-07-24 14:37:05 +0530297void decodeJpegRImg(jr_compressed_ptr img, [[maybe_unused]] const char* outFileName) {
298 std::vector<uint8_t> iccData(0);
299 std::vector<uint8_t> exifData(0);
300 jpegr_info_struct info{0, 0, &iccData, &exifData};
301 JpegR jpegHdr;
302 ASSERT_EQ(OK, jpegHdr.getJPEGRInfo(img, &info));
303 ASSERT_EQ(kImageWidth, info.width);
304 ASSERT_EQ(kImageHeight, info.height);
305 size_t outSize = info.width * info.height * 8;
306 std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t[]>(outSize);
307 jpegr_uncompressed_struct destImage{};
308 destImage.data = data.get();
309 ASSERT_EQ(OK, jpegHdr.decodeJPEGR(img, &destImage));
310 ASSERT_EQ(kImageWidth, destImage.width);
311 ASSERT_EQ(kImageHeight, destImage.height);
312#ifdef DUMP_OUTPUT
313 if (!writeFile(outFileName, destImage.data, outSize)) {
314 std::cerr << "unable to write output file" << std::endl;
315 }
316#endif
317}
318
319// ============================================================================
320// Unit Tests
321// ============================================================================
322
323// Test Encode API-0 invalid arguments
324TEST(JpegRTest, EncodeAPI0WithInvalidArgs) {
325 JpegR uHdrLib;
326
327 UhdrCompressedStructWrapper jpgImg(16, 16);
328 ASSERT_TRUE(jpgImg.allocateMemory());
329
330 // test quality factor and transfer function
331 {
332 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
333 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
334 ASSERT_TRUE(rawImg.allocateMemory());
335
336 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
337 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
338 jpgImg.getImageHandle(), -1, nullptr),
339 OK)
340 << "fail, API allows bad jpeg quality factor";
341 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
342 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
343 jpgImg.getImageHandle(), 101, nullptr),
344 OK)
345 << "fail, API allows bad jpeg quality factor";
346
347 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
348 ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
349 jpgImg.getImageHandle(), kQuality, nullptr),
350 OK)
351 << "fail, API allows bad hdr transfer function";
352 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
353 static_cast<ultrahdr_transfer_function>(
354 ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
355 jpgImg.getImageHandle(), kQuality, nullptr),
356 OK)
357 << "fail, API allows bad hdr transfer function";
358 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
359 static_cast<ultrahdr_transfer_function>(-10),
360 jpgImg.getImageHandle(), kQuality, nullptr),
361 OK)
362 << "fail, API allows bad hdr transfer function";
363 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530364
365 // test dest
Ram Mohan9485bc72023-07-24 14:37:05 +0530366 {
367 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
368 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
369 ASSERT_TRUE(rawImg.allocateMemory());
370
371 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
372 ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr, kQuality,
373 nullptr),
374 OK)
375 << "fail, API allows nullptr dest";
376 UhdrCompressedStructWrapper jpgImg2(16, 16);
377 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
378 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
379 jpgImg2.getImageHandle(), kQuality, nullptr),
380 OK)
381 << "fail, API allows nullptr dest";
382 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530383
384 // test p010 input
Ram Mohan9485bc72023-07-24 14:37:05 +0530385 {
386 ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
387 jpgImg.getImageHandle(), kQuality, nullptr),
388 OK)
389 << "fail, API allows nullptr p010 image";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530390
Ram Mohan9485bc72023-07-24 14:37:05 +0530391 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
392 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
393 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
394 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
395 jpgImg.getImageHandle(), kQuality, nullptr),
396 OK)
397 << "fail, API allows nullptr p010 image";
398 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530399
Ram Mohan9485bc72023-07-24 14:37:05 +0530400 {
401 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
402 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED));
403 ASSERT_TRUE(rawImg.allocateMemory());
404 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
405 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
406 jpgImg.getImageHandle(), kQuality, nullptr),
407 OK)
408 << "fail, API allows bad p010 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530409
Ram Mohan9485bc72023-07-24 14:37:05 +0530410 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_p010);
411 ASSERT_TRUE(rawImg2.setImageColorGamut(
412 static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1)));
413 ASSERT_TRUE(rawImg2.allocateMemory());
414 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
415 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
416 jpgImg.getImageHandle(), kQuality, nullptr),
417 OK)
418 << "fail, API allows bad p010 color gamut";
419 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530420
Ram Mohan9485bc72023-07-24 14:37:05 +0530421 {
422 const int kWidth = 32, kHeight = 32;
423 UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
424 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
425 ASSERT_TRUE(rawImg.allocateMemory());
426 auto rawImgP010 = rawImg.getImageHandle();
Ram Mohan35ab3a82023-05-18 18:38:16 +0530427
Ram Mohan9485bc72023-07-24 14:37:05 +0530428 rawImgP010->width = kWidth - 1;
429 rawImgP010->height = kHeight;
430 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
431 jpgImg.getImageHandle(), kQuality, nullptr),
432 OK)
433 << "fail, API allows bad image width";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530434
Ram Mohan9485bc72023-07-24 14:37:05 +0530435 rawImgP010->width = kWidth;
436 rawImgP010->height = kHeight - 1;
437 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
438 jpgImg.getImageHandle(), kQuality, nullptr),
439 OK)
440 << "fail, API allows bad image height";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530441
Ram Mohan9485bc72023-07-24 14:37:05 +0530442 rawImgP010->width = 0;
443 rawImgP010->height = kHeight;
444 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
445 jpgImg.getImageHandle(), kQuality, nullptr),
446 OK)
447 << "fail, API allows bad image width";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530448
Ram Mohan9485bc72023-07-24 14:37:05 +0530449 rawImgP010->width = kWidth;
450 rawImgP010->height = 0;
451 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
452 jpgImg.getImageHandle(), kQuality, nullptr),
453 OK)
454 << "fail, API allows bad image height";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530455
Ram Mohan9485bc72023-07-24 14:37:05 +0530456 rawImgP010->width = kWidth;
457 rawImgP010->height = kHeight;
458 rawImgP010->luma_stride = kWidth - 2;
459 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
460 jpgImg.getImageHandle(), kQuality, nullptr),
461 OK)
462 << "fail, API allows bad luma stride";
Ram Mohanfd7bb542023-05-20 00:55:56 +0530463
Ram Mohan9485bc72023-07-24 14:37:05 +0530464 rawImgP010->width = kWidth;
465 rawImgP010->height = kHeight;
466 rawImgP010->luma_stride = kWidth + 64;
467 rawImgP010->chroma_data = rawImgP010->data;
468 rawImgP010->chroma_stride = kWidth - 2;
469 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
470 jpgImg.getImageHandle(), kQuality, nullptr),
471 OK)
472 << "fail, API allows bad chroma stride";
473 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530474}
475
476/* Test Encode API-1 invalid arguments */
Ram Mohan9485bc72023-07-24 14:37:05 +0530477TEST(JpegRTest, EncodeAPI1WithInvalidArgs) {
478 JpegR uHdrLib;
Ram Mohan35ab3a82023-05-18 18:38:16 +0530479
Ram Mohan9485bc72023-07-24 14:37:05 +0530480 UhdrCompressedStructWrapper jpgImg(16, 16);
481 ASSERT_TRUE(jpgImg.allocateMemory());
Ram Mohan35ab3a82023-05-18 18:38:16 +0530482
Ram Mohan9485bc72023-07-24 14:37:05 +0530483 // test quality factor and transfer function
484 {
485 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
486 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
487 ASSERT_TRUE(rawImg.allocateMemory());
488 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
489 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
490 ASSERT_TRUE(rawImg2.allocateMemory());
Ram Mohan35ab3a82023-05-18 18:38:16 +0530491
Ram Mohan9485bc72023-07-24 14:37:05 +0530492 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
493 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
494 jpgImg.getImageHandle(), -1, nullptr),
495 OK)
496 << "fail, API allows bad jpeg quality factor";
497 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
498 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
499 jpgImg.getImageHandle(), 101, nullptr),
500 OK)
501 << "fail, API allows bad jpeg quality factor";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530502
Ram Mohan9485bc72023-07-24 14:37:05 +0530503 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
504 ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
505 jpgImg.getImageHandle(), kQuality, nullptr),
506 OK)
507 << "fail, API allows bad hdr transfer function";
508 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
509 static_cast<ultrahdr_transfer_function>(
510 ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
511 jpgImg.getImageHandle(), kQuality, nullptr),
512 OK)
513 << "fail, API allows bad hdr transfer function";
514 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
515 static_cast<ultrahdr_transfer_function>(-10),
516 jpgImg.getImageHandle(), kQuality, nullptr),
517 OK)
518 << "fail, API allows bad hdr transfer function";
519 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530520
521 // test dest
Ram Mohan9485bc72023-07-24 14:37:05 +0530522 {
523 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
524 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
525 ASSERT_TRUE(rawImg.allocateMemory());
526 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
527 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
528 ASSERT_TRUE(rawImg2.allocateMemory());
529
530 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
531 ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr, kQuality,
532 nullptr),
533 OK)
534 << "fail, API allows nullptr dest";
535 UhdrCompressedStructWrapper jpgImg2(16, 16);
536 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
537 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
538 jpgImg2.getImageHandle(), kQuality, nullptr),
539 OK)
540 << "fail, API allows nullptr dest";
541 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530542
543 // test p010 input
Ram Mohan9485bc72023-07-24 14:37:05 +0530544 {
545 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
546 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
547 ASSERT_TRUE(rawImg2.allocateMemory());
548 ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, rawImg2.getImageHandle(),
549 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
550 jpgImg.getImageHandle(), kQuality, nullptr),
551 OK)
552 << "fail, API allows nullptr p010 image";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530553
Ram Mohan9485bc72023-07-24 14:37:05 +0530554 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
555 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
556 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
557 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
558 jpgImg.getImageHandle(), kQuality, nullptr),
559 OK)
560 << "fail, API allows nullptr p010 image";
561 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530562
Ram Mohan9485bc72023-07-24 14:37:05 +0530563 {
564 const int kWidth = 32, kHeight = 32;
565 UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
566 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
567 ASSERT_TRUE(rawImg.allocateMemory());
568 auto rawImgP010 = rawImg.getImageHandle();
569 UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
570 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
571 ASSERT_TRUE(rawImg2.allocateMemory());
572 auto rawImg420 = rawImg2.getImageHandle();
Ram Mohan35ab3a82023-05-18 18:38:16 +0530573
Ram Mohan9485bc72023-07-24 14:37:05 +0530574 rawImgP010->width = kWidth;
575 rawImgP010->height = kHeight;
576 rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
577 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
578 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
579 jpgImg.getImageHandle(), kQuality, nullptr),
580 OK)
581 << "fail, API allows bad p010 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530582
Ram Mohan9485bc72023-07-24 14:37:05 +0530583 rawImgP010->width = kWidth;
584 rawImgP010->height = kHeight;
585 rawImgP010->colorGamut =
586 static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
587 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
588 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
589 jpgImg.getImageHandle(), kQuality, nullptr),
590 OK)
591 << "fail, API allows bad p010 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530592
Ram Mohan9485bc72023-07-24 14:37:05 +0530593 rawImgP010->width = kWidth - 1;
594 rawImgP010->height = kHeight;
595 rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
596 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
597 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
598 jpgImg.getImageHandle(), kQuality, nullptr),
599 OK)
600 << "fail, API allows bad image width";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530601
Ram Mohan9485bc72023-07-24 14:37:05 +0530602 rawImgP010->width = kWidth;
603 rawImgP010->height = kHeight - 1;
604 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
605 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
606 jpgImg.getImageHandle(), kQuality, nullptr),
607 OK)
608 << "fail, API allows bad image height";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530609
Ram Mohan9485bc72023-07-24 14:37:05 +0530610 rawImgP010->width = 0;
611 rawImgP010->height = kHeight;
612 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
613 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
614 jpgImg.getImageHandle(), kQuality, nullptr),
615 OK)
616 << "fail, API allows bad image width";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530617
Ram Mohan9485bc72023-07-24 14:37:05 +0530618 rawImgP010->width = kWidth;
619 rawImgP010->height = 0;
620 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
621 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
622 jpgImg.getImageHandle(), kQuality, nullptr),
623 OK)
624 << "fail, API allows bad image height";
625
626 rawImgP010->width = kWidth;
627 rawImgP010->height = kHeight;
628 rawImgP010->luma_stride = kWidth - 2;
629 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
630 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
631 jpgImg.getImageHandle(), kQuality, nullptr),
632 OK)
633 << "fail, API allows bad luma stride";
634
635 rawImgP010->width = kWidth;
636 rawImgP010->height = kHeight;
637 rawImgP010->luma_stride = kWidth + 64;
638 rawImgP010->chroma_data = rawImgP010->data;
639 rawImgP010->chroma_stride = kWidth - 2;
640 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
641 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
642 jpgImg.getImageHandle(), kQuality, nullptr),
643 OK)
644 << "fail, API allows bad chroma stride";
645 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530646
647 // test 420 input
Ram Mohan9485bc72023-07-24 14:37:05 +0530648 {
649 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
650 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
651 ASSERT_TRUE(rawImg.allocateMemory());
652 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr,
653 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
654 jpgImg.getImageHandle(), kQuality, nullptr),
655 OK)
656 << "fail, API allows nullptr 420 image";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530657
Ram Mohan9485bc72023-07-24 14:37:05 +0530658 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
659 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
660 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
661 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
662 jpgImg.getImageHandle(), kQuality, nullptr),
663 OK)
664 << "fail, API allows nullptr 420 image";
665 }
666 {
667 const int kWidth = 32, kHeight = 32;
668 UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
669 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
670 ASSERT_TRUE(rawImg.allocateMemory());
671 auto rawImgP010 = rawImg.getImageHandle();
672 UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
673 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
674 ASSERT_TRUE(rawImg2.allocateMemory());
675 auto rawImg420 = rawImg2.getImageHandle();
Ram Mohan35ab3a82023-05-18 18:38:16 +0530676
Ram Mohan9485bc72023-07-24 14:37:05 +0530677 rawImg420->width = kWidth;
678 rawImg420->height = kHeight;
679 rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
680 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
681 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
682 jpgImg.getImageHandle(), kQuality, nullptr),
683 OK)
684 << "fail, API allows bad 420 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530685
Ram Mohan9485bc72023-07-24 14:37:05 +0530686 rawImg420->width = kWidth;
687 rawImg420->height = kHeight;
688 rawImg420->colorGamut =
689 static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
690 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
691 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
692 jpgImg.getImageHandle(), kQuality, nullptr),
693 OK)
694 << "fail, API allows bad 420 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530695
Ram Mohan9485bc72023-07-24 14:37:05 +0530696 rawImg420->width = kWidth - 1;
697 rawImg420->height = kHeight;
698 rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709;
699 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
700 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
701 jpgImg.getImageHandle(), kQuality, nullptr),
702 OK)
703 << "fail, API allows bad image width for 420";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530704
Ram Mohan9485bc72023-07-24 14:37:05 +0530705 rawImg420->width = kWidth;
706 rawImg420->height = kHeight - 1;
707 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
708 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
709 jpgImg.getImageHandle(), kQuality, nullptr),
710 OK)
711 << "fail, API allows bad image height for 420";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530712
Ram Mohan9485bc72023-07-24 14:37:05 +0530713 rawImg420->width = 0;
714 rawImg420->height = kHeight;
715 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
716 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
717 jpgImg.getImageHandle(), kQuality, nullptr),
718 OK)
719 << "fail, API allows bad image width for 420";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530720
Ram Mohan9485bc72023-07-24 14:37:05 +0530721 rawImg420->width = kWidth;
722 rawImg420->height = 0;
723 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
724 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
725 jpgImg.getImageHandle(), kQuality, nullptr),
726 OK)
727 << "fail, API allows bad image height for 420";
728
729 rawImg420->width = kWidth;
730 rawImg420->height = kHeight;
731 rawImg420->luma_stride = kWidth;
732 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
733 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
734 jpgImg.getImageHandle(), kQuality, nullptr),
735 OK)
736 << "fail, API allows luma stride for 420";
737
738 rawImg420->width = kWidth;
739 rawImg420->height = kHeight;
740 rawImg420->luma_stride = 0;
741 rawImg420->chroma_data = rawImgP010->data;
742 rawImg420->chroma_stride = kWidth;
743 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
744 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
745 jpgImg.getImageHandle(), kQuality, nullptr),
746 OK)
747 << "fail, API allows bad chroma pointer for 420";
748 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530749}
750
751/* Test Encode API-2 invalid arguments */
Ram Mohan9485bc72023-07-24 14:37:05 +0530752TEST(JpegRTest, EncodeAPI2WithInvalidArgs) {
753 JpegR uHdrLib;
Ram Mohan35ab3a82023-05-18 18:38:16 +0530754
Ram Mohan9485bc72023-07-24 14:37:05 +0530755 UhdrCompressedStructWrapper jpgImg(16, 16);
756 ASSERT_TRUE(jpgImg.allocateMemory());
Ram Mohan35ab3a82023-05-18 18:38:16 +0530757
Ram Mohan9485bc72023-07-24 14:37:05 +0530758 // test quality factor and transfer function
759 {
760 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
761 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
762 ASSERT_TRUE(rawImg.allocateMemory());
763 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
764 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
765 ASSERT_TRUE(rawImg2.allocateMemory());
Ram Mohan35ab3a82023-05-18 18:38:16 +0530766
Ram Mohan9485bc72023-07-24 14:37:05 +0530767 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
768 jpgImg.getImageHandle(),
769 ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
770 jpgImg.getImageHandle()),
771 OK)
772 << "fail, API allows bad hdr transfer function";
773 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
774 jpgImg.getImageHandle(),
775 static_cast<ultrahdr_transfer_function>(
776 ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
777 jpgImg.getImageHandle()),
778 OK)
779 << "fail, API allows bad hdr transfer function";
780 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
781 jpgImg.getImageHandle(),
782 static_cast<ultrahdr_transfer_function>(-10),
783 jpgImg.getImageHandle()),
784 OK)
785 << "fail, API allows bad hdr transfer function";
786 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530787
788 // test dest
Ram Mohan9485bc72023-07-24 14:37:05 +0530789 {
790 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
791 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
792 ASSERT_TRUE(rawImg.allocateMemory());
793 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
794 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
795 ASSERT_TRUE(rawImg2.allocateMemory());
796
797 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
798 jpgImg.getImageHandle(),
799 ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr),
800 OK)
801 << "fail, API allows nullptr dest";
802 UhdrCompressedStructWrapper jpgImg2(16, 16);
803 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
804 jpgImg.getImageHandle(),
805 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
806 jpgImg2.getImageHandle()),
807 OK)
808 << "fail, API allows nullptr dest";
809 }
810
811 // test compressed image
812 {
813 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
814 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
815 ASSERT_TRUE(rawImg.allocateMemory());
816 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
817 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
818 ASSERT_TRUE(rawImg2.allocateMemory());
819
820 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(), nullptr,
821 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
822 jpgImg.getImageHandle()),
823 OK)
824 << "fail, API allows nullptr for compressed image";
825 UhdrCompressedStructWrapper jpgImg2(16, 16);
826 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
827 jpgImg2.getImageHandle(),
828 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
829 jpgImg.getImageHandle()),
830 OK)
831 << "fail, API allows nullptr for compressed image";
832 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530833
834 // test p010 input
Ram Mohan9485bc72023-07-24 14:37:05 +0530835 {
836 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
837 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
838 ASSERT_TRUE(rawImg2.allocateMemory());
839 ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, rawImg2.getImageHandle(), jpgImg.getImageHandle(),
840 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
841 jpgImg.getImageHandle()),
842 OK)
843 << "fail, API allows nullptr p010 image";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530844
Ram Mohan9485bc72023-07-24 14:37:05 +0530845 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
846 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
847 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
848 jpgImg.getImageHandle(),
849 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
850 jpgImg.getImageHandle()),
851 OK)
852 << "fail, API allows nullptr p010 image";
853 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530854
Ram Mohan9485bc72023-07-24 14:37:05 +0530855 {
856 const int kWidth = 32, kHeight = 32;
857 UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
858 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
859 ASSERT_TRUE(rawImg.allocateMemory());
860 auto rawImgP010 = rawImg.getImageHandle();
861 UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
862 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
863 ASSERT_TRUE(rawImg2.allocateMemory());
864 auto rawImg420 = rawImg2.getImageHandle();
Ram Mohan35ab3a82023-05-18 18:38:16 +0530865
Ram Mohan9485bc72023-07-24 14:37:05 +0530866 rawImgP010->width = kWidth;
867 rawImgP010->height = kHeight;
868 rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
869 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
870 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
871 jpgImg.getImageHandle()),
872 OK)
873 << "fail, API allows bad p010 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530874
Ram Mohan9485bc72023-07-24 14:37:05 +0530875 rawImgP010->width = kWidth;
876 rawImgP010->height = kHeight;
877 rawImgP010->colorGamut =
878 static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
879 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
880 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
881 jpgImg.getImageHandle()),
882 OK)
883 << "fail, API allows bad p010 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530884
Ram Mohan9485bc72023-07-24 14:37:05 +0530885 rawImgP010->width = kWidth - 1;
886 rawImgP010->height = kHeight;
887 rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
888 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
889 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
890 jpgImg.getImageHandle()),
891 OK)
892 << "fail, API allows bad image width";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530893
Ram Mohan9485bc72023-07-24 14:37:05 +0530894 rawImgP010->width = kWidth;
895 rawImgP010->height = kHeight - 1;
896 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
897 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
898 jpgImg.getImageHandle()),
899 OK)
900 << "fail, API allows bad image height";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530901
Ram Mohan9485bc72023-07-24 14:37:05 +0530902 rawImgP010->width = 0;
903 rawImgP010->height = kHeight;
904 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
905 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
906 jpgImg.getImageHandle()),
907 OK)
908 << "fail, API allows bad image width";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530909
Ram Mohan9485bc72023-07-24 14:37:05 +0530910 rawImgP010->width = kWidth;
911 rawImgP010->height = 0;
912 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
913 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
914 jpgImg.getImageHandle()),
915 OK)
916 << "fail, API allows bad image height";
917
918 rawImgP010->width = kWidth;
919 rawImgP010->height = kHeight;
920 rawImgP010->luma_stride = kWidth - 2;
921 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
922 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
923 jpgImg.getImageHandle()),
924 OK)
925 << "fail, API allows bad luma stride";
926
927 rawImgP010->width = kWidth;
928 rawImgP010->height = kHeight;
929 rawImgP010->luma_stride = kWidth + 64;
930 rawImgP010->chroma_data = rawImgP010->data;
931 rawImgP010->chroma_stride = kWidth - 2;
932 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
933 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
934 jpgImg.getImageHandle()),
935 OK)
936 << "fail, API allows bad chroma stride";
937 }
Ram Mohan35ab3a82023-05-18 18:38:16 +0530938
939 // test 420 input
Ram Mohan9485bc72023-07-24 14:37:05 +0530940 {
941 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
942 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
943 ASSERT_TRUE(rawImg.allocateMemory());
944 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr, jpgImg.getImageHandle(),
945 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
946 jpgImg.getImageHandle()),
947 OK)
948 << "fail, API allows nullptr 420 image";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530949
Ram Mohan9485bc72023-07-24 14:37:05 +0530950 UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
951 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
952 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
953 jpgImg.getImageHandle(),
954 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
955 jpgImg.getImageHandle()),
956 OK)
957 << "fail, API allows nullptr 420 image";
958 }
959 {
960 const int kWidth = 32, kHeight = 32;
961 UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
962 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
963 ASSERT_TRUE(rawImg.allocateMemory());
964 auto rawImgP010 = rawImg.getImageHandle();
965 UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
966 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
967 ASSERT_TRUE(rawImg2.allocateMemory());
968 auto rawImg420 = rawImg2.getImageHandle();
Ram Mohan35ab3a82023-05-18 18:38:16 +0530969
Ram Mohan9485bc72023-07-24 14:37:05 +0530970 rawImg420->width = kWidth;
971 rawImg420->height = kHeight;
972 rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
973 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
974 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
975 jpgImg.getImageHandle()),
976 OK)
977 << "fail, API allows bad 420 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530978
Ram Mohan9485bc72023-07-24 14:37:05 +0530979 rawImg420->width = kWidth;
980 rawImg420->height = kHeight;
981 rawImg420->colorGamut =
982 static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
983 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
984 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
985 jpgImg.getImageHandle()),
986 OK)
987 << "fail, API allows bad 420 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530988
Ram Mohan9485bc72023-07-24 14:37:05 +0530989 rawImg420->width = kWidth - 1;
990 rawImg420->height = kHeight;
991 rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709;
992 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
993 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
994 jpgImg.getImageHandle()),
995 OK)
996 << "fail, API allows bad image width for 420";
Ram Mohan35ab3a82023-05-18 18:38:16 +0530997
Ram Mohan9485bc72023-07-24 14:37:05 +0530998 rawImg420->width = kWidth;
999 rawImg420->height = kHeight - 1;
1000 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1001 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1002 jpgImg.getImageHandle()),
1003 OK)
1004 << "fail, API allows bad image height for 420";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301005
Ram Mohan9485bc72023-07-24 14:37:05 +05301006 rawImg420->width = 0;
1007 rawImg420->height = kHeight;
1008 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1009 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1010 jpgImg.getImageHandle()),
1011 OK)
1012 << "fail, API allows bad image width for 420";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301013
Ram Mohan9485bc72023-07-24 14:37:05 +05301014 rawImg420->width = kWidth;
1015 rawImg420->height = 0;
1016 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1017 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1018 jpgImg.getImageHandle()),
1019 OK)
1020 << "fail, API allows bad image height for 420";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301021
Ram Mohan9485bc72023-07-24 14:37:05 +05301022 rawImg420->width = kWidth;
1023 rawImg420->height = kHeight;
1024 rawImg420->luma_stride = kWidth;
1025 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1026 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1027 jpgImg.getImageHandle()),
1028 OK)
1029 << "fail, API allows luma stride for 420";
1030
1031 rawImg420->width = kWidth;
1032 rawImg420->height = kHeight;
1033 rawImg420->luma_stride = 0;
1034 rawImg420->chroma_data = rawImgP010->data;
1035 rawImg420->chroma_stride = kWidth;
1036 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
1037 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1038 jpgImg.getImageHandle()),
1039 OK)
1040 << "fail, API allows bad chroma pointer for 420";
1041 }
Ram Mohan35ab3a82023-05-18 18:38:16 +05301042}
1043
1044/* Test Encode API-3 invalid arguments */
Ram Mohan9485bc72023-07-24 14:37:05 +05301045TEST(JpegRTest, EncodeAPI3WithInvalidArgs) {
1046 JpegR uHdrLib;
Ram Mohan35ab3a82023-05-18 18:38:16 +05301047
Ram Mohan9485bc72023-07-24 14:37:05 +05301048 UhdrCompressedStructWrapper jpgImg(16, 16);
1049 ASSERT_TRUE(jpgImg.allocateMemory());
Ram Mohan35ab3a82023-05-18 18:38:16 +05301050
Ram Mohan9485bc72023-07-24 14:37:05 +05301051 // test quality factor and transfer function
1052 {
1053 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1054 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1055 ASSERT_TRUE(rawImg.allocateMemory());
Ram Mohan35ab3a82023-05-18 18:38:16 +05301056
Ram Mohan9485bc72023-07-24 14:37:05 +05301057 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1058 ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
1059 jpgImg.getImageHandle()),
1060 OK)
1061 << "fail, API allows bad hdr transfer function";
1062 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1063 static_cast<ultrahdr_transfer_function>(
1064 ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
1065 jpgImg.getImageHandle()),
1066 OK)
1067 << "fail, API allows bad hdr transfer function";
1068 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1069 static_cast<ultrahdr_transfer_function>(-10),
1070 jpgImg.getImageHandle()),
1071 OK)
1072 << "fail, API allows bad hdr transfer function";
1073 }
Ram Mohan35ab3a82023-05-18 18:38:16 +05301074
1075 // test dest
Ram Mohan9485bc72023-07-24 14:37:05 +05301076 {
1077 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1078 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1079 ASSERT_TRUE(rawImg.allocateMemory());
1080
1081 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1082 ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr),
1083 OK)
1084 << "fail, API allows nullptr dest";
1085 UhdrCompressedStructWrapper jpgImg2(16, 16);
1086 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1087 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1088 jpgImg2.getImageHandle()),
1089 OK)
1090 << "fail, API allows nullptr dest";
1091 }
1092
1093 // test compressed image
1094 {
1095 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1096 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1097 ASSERT_TRUE(rawImg.allocateMemory());
1098
1099 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr,
1100 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1101 jpgImg.getImageHandle()),
1102 OK)
1103 << "fail, API allows nullptr for compressed image";
1104 UhdrCompressedStructWrapper jpgImg2(16, 16);
1105 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg2.getImageHandle(),
1106 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1107 jpgImg.getImageHandle()),
1108 OK)
1109 << "fail, API allows nullptr for compressed image";
1110 }
Ram Mohan35ab3a82023-05-18 18:38:16 +05301111
1112 // test p010 input
Ram Mohan9485bc72023-07-24 14:37:05 +05301113 {
1114 ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, jpgImg.getImageHandle(),
1115 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1116 jpgImg.getImageHandle()),
1117 OK)
1118 << "fail, API allows nullptr p010 image";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301119
Ram Mohan9485bc72023-07-24 14:37:05 +05301120 UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
1121 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1122 ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
1123 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1124 jpgImg.getImageHandle()),
1125 OK)
1126 << "fail, API allows nullptr p010 image";
1127 }
Ram Mohan35ab3a82023-05-18 18:38:16 +05301128
Ram Mohan9485bc72023-07-24 14:37:05 +05301129 {
1130 const int kWidth = 32, kHeight = 32;
1131 UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
1132 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1133 ASSERT_TRUE(rawImg.allocateMemory());
1134 auto rawImgP010 = rawImg.getImageHandle();
Ram Mohan35ab3a82023-05-18 18:38:16 +05301135
Ram Mohan9485bc72023-07-24 14:37:05 +05301136 rawImgP010->width = kWidth;
1137 rawImgP010->height = kHeight;
1138 rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
1139 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1140 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1141 jpgImg.getImageHandle()),
1142 OK)
1143 << "fail, API allows bad p010 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301144
Ram Mohan9485bc72023-07-24 14:37:05 +05301145 rawImgP010->width = kWidth;
1146 rawImgP010->height = kHeight;
1147 rawImgP010->colorGamut =
1148 static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
1149 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1150 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1151 jpgImg.getImageHandle()),
1152 OK)
1153 << "fail, API allows bad p010 color gamut";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301154
Ram Mohan9485bc72023-07-24 14:37:05 +05301155 rawImgP010->width = kWidth - 1;
1156 rawImgP010->height = kHeight;
1157 rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
1158 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1159 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1160 jpgImg.getImageHandle()),
1161 OK)
1162 << "fail, API allows bad image width";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301163
Ram Mohan9485bc72023-07-24 14:37:05 +05301164 rawImgP010->width = kWidth;
1165 rawImgP010->height = kHeight - 1;
1166 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1167 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1168 jpgImg.getImageHandle()),
1169 OK)
1170 << "fail, API allows bad image height";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301171
Ram Mohan9485bc72023-07-24 14:37:05 +05301172 rawImgP010->width = 0;
1173 rawImgP010->height = kHeight;
1174 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1175 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1176 jpgImg.getImageHandle()),
1177 OK)
1178 << "fail, API allows bad image width";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301179
Ram Mohan9485bc72023-07-24 14:37:05 +05301180 rawImgP010->width = kWidth;
1181 rawImgP010->height = 0;
1182 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1183 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1184 jpgImg.getImageHandle()),
1185 OK)
1186 << "fail, API allows bad image height";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301187
Ram Mohan9485bc72023-07-24 14:37:05 +05301188 rawImgP010->width = kWidth;
1189 rawImgP010->height = kHeight;
1190 rawImgP010->luma_stride = kWidth - 2;
1191 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1192 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1193 jpgImg.getImageHandle()),
1194 OK)
1195 << "fail, API allows bad luma stride";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301196
Ram Mohan9485bc72023-07-24 14:37:05 +05301197 rawImgP010->width = kWidth;
1198 rawImgP010->height = kHeight;
1199 rawImgP010->luma_stride = kWidth + 64;
1200 rawImgP010->chroma_data = rawImgP010->data;
1201 rawImgP010->chroma_stride = kWidth - 2;
1202 ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
1203 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1204 jpgImg.getImageHandle()),
1205 OK)
1206 << "fail, API allows bad chroma stride";
1207 }
Ram Mohan35ab3a82023-05-18 18:38:16 +05301208}
1209
1210/* Test Encode API-4 invalid arguments */
Ram Mohan9485bc72023-07-24 14:37:05 +05301211TEST(JpegRTest, EncodeAPI4WithInvalidArgs) {
1212 UhdrCompressedStructWrapper jpgImg(16, 16);
1213 ASSERT_TRUE(jpgImg.allocateMemory());
1214 UhdrCompressedStructWrapper jpgImg2(16, 16);
1215 JpegR uHdrLib;
Ram Mohan35ab3a82023-05-18 18:38:16 +05301216
1217 // test dest
Ram Mohan9485bc72023-07-24 14:37:05 +05301218 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), nullptr, nullptr),
1219 OK)
1220 << "fail, API allows nullptr dest";
1221 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), nullptr,
1222 jpgImg2.getImageHandle()),
1223 OK)
1224 << "fail, API allows nullptr dest";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301225
1226 // test primary image
Ram Mohan9485bc72023-07-24 14:37:05 +05301227 ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, jpgImg.getImageHandle(), nullptr, jpgImg.getImageHandle()),
1228 OK)
1229 << "fail, API allows nullptr primary image";
1230 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg2.getImageHandle(), jpgImg.getImageHandle(), nullptr,
1231 jpgImg.getImageHandle()),
1232 OK)
1233 << "fail, API allows nullptr primary image";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301234
1235 // test gain map
Ram Mohan9485bc72023-07-24 14:37:05 +05301236 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), nullptr, nullptr, jpgImg.getImageHandle()),
1237 OK)
1238 << "fail, API allows nullptr gain map image";
1239 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg2.getImageHandle(), nullptr,
1240 jpgImg.getImageHandle()),
1241 OK)
1242 << "fail, API allows nullptr gain map image";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301243
Nick Deakin094946b2023-06-09 11:58:41 -04001244 // test metadata
1245 ultrahdr_metadata_struct good_metadata;
1246 good_metadata.version = "1.0";
1247 good_metadata.minContentBoost = 1.0f;
1248 good_metadata.maxContentBoost = 2.0f;
1249 good_metadata.gamma = 1.0f;
1250 good_metadata.offsetSdr = 0.0f;
1251 good_metadata.offsetHdr = 0.0f;
1252 good_metadata.hdrCapacityMin = 1.0f;
1253 good_metadata.hdrCapacityMax = 2.0f;
1254
1255 ultrahdr_metadata_struct metadata = good_metadata;
1256 metadata.version = "1.1";
Ram Mohan9485bc72023-07-24 14:37:05 +05301257 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1258 jpgImg.getImageHandle()),
1259 OK)
1260 << "fail, API allows bad metadata version";
Nick Deakin094946b2023-06-09 11:58:41 -04001261
1262 metadata = good_metadata;
1263 metadata.minContentBoost = 3.0f;
Ram Mohan9485bc72023-07-24 14:37:05 +05301264 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1265 jpgImg.getImageHandle()),
1266 OK)
1267 << "fail, API allows bad metadata content boost";
Nick Deakin094946b2023-06-09 11:58:41 -04001268
1269 metadata = good_metadata;
1270 metadata.gamma = -0.1f;
Ram Mohan9485bc72023-07-24 14:37:05 +05301271 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1272 jpgImg.getImageHandle()),
1273 OK)
1274 << "fail, API allows bad metadata gamma";
Nick Deakin094946b2023-06-09 11:58:41 -04001275
1276 metadata = good_metadata;
1277 metadata.offsetSdr = -0.1f;
Ram Mohan9485bc72023-07-24 14:37:05 +05301278 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1279 jpgImg.getImageHandle()),
1280 OK)
1281 << "fail, API allows bad metadata offset sdr";
Nick Deakin094946b2023-06-09 11:58:41 -04001282
1283 metadata = good_metadata;
1284 metadata.offsetHdr = -0.1f;
Ram Mohan9485bc72023-07-24 14:37:05 +05301285 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1286 jpgImg.getImageHandle()),
1287 OK)
1288 << "fail, API allows bad metadata offset hdr";
Nick Deakin094946b2023-06-09 11:58:41 -04001289
1290 metadata = good_metadata;
1291 metadata.hdrCapacityMax = 0.5f;
Ram Mohan9485bc72023-07-24 14:37:05 +05301292 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1293 jpgImg.getImageHandle()),
1294 OK)
1295 << "fail, API allows bad metadata hdr capacity max";
Nick Deakin094946b2023-06-09 11:58:41 -04001296
1297 metadata = good_metadata;
1298 metadata.hdrCapacityMin = 0.5f;
Ram Mohan9485bc72023-07-24 14:37:05 +05301299 ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
1300 jpgImg.getImageHandle()),
1301 OK)
1302 << "fail, API allows bad metadata hdr capacity min";
Ram Mohan35ab3a82023-05-18 18:38:16 +05301303}
1304
Ram Mohanb0375052023-05-20 04:03:48 +05301305/* Test Decode API invalid arguments */
Ram Mohan9485bc72023-07-24 14:37:05 +05301306TEST(JpegRTest, DecodeAPIWithInvalidArgs) {
1307 JpegR uHdrLib;
Ram Mohanb0375052023-05-20 04:03:48 +05301308
Ram Mohan9485bc72023-07-24 14:37:05 +05301309 UhdrCompressedStructWrapper jpgImg(16, 16);
1310 jpegr_uncompressed_struct destImage{};
1311 size_t outSize = 16 * 16 * 8;
1312 std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t[]>(outSize);
1313 destImage.data = data.get();
Ram Mohanb0375052023-05-20 04:03:48 +05301314
1315 // test jpegr image
Ram Mohan9485bc72023-07-24 14:37:05 +05301316 ASSERT_NE(uHdrLib.decodeJPEGR(nullptr, &destImage), OK)
1317 << "fail, API allows nullptr for jpegr img";
1318 ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage), OK)
1319 << "fail, API allows nullptr for jpegr img";
1320 ASSERT_TRUE(jpgImg.allocateMemory());
Ram Mohanb0375052023-05-20 04:03:48 +05301321
1322 // test dest image
Ram Mohan9485bc72023-07-24 14:37:05 +05301323 ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), nullptr), OK)
1324 << "fail, API allows nullptr for dest";
1325 destImage.data = nullptr;
1326 ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage), OK)
1327 << "fail, API allows nullptr for dest";
1328 destImage.data = data.get();
Ram Mohanb0375052023-05-20 04:03:48 +05301329
1330 // test max display boost
Ram Mohan9485bc72023-07-24 14:37:05 +05301331 ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, 0.5), OK)
1332 << "fail, API allows invalid max display boost";
Ram Mohanb0375052023-05-20 04:03:48 +05301333
1334 // test output format
Ram Mohan9485bc72023-07-24 14:37:05 +05301335 ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, FLT_MAX, nullptr,
1336 static_cast<ultrahdr_output_format>(-1)),
1337 OK)
1338 << "fail, API allows invalid output format";
1339 ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, FLT_MAX, nullptr,
1340 static_cast<ultrahdr_output_format>(ULTRAHDR_OUTPUT_MAX + 1)),
1341 OK)
1342 << "fail, API allows invalid output format";
Ram Mohanb0375052023-05-20 04:03:48 +05301343}
1344
Ram Mohan9485bc72023-07-24 14:37:05 +05301345TEST(JpegRTest, writeXmpThenRead) {
Dichen Zhangdbceb0e2023-04-14 19:03:18 +00001346 ultrahdr_metadata_struct metadata_expected;
Nick Deakin05ceebf2023-04-19 15:27:13 -04001347 metadata_expected.version = "1.0";
Nick Deakin094946b2023-06-09 11:58:41 -04001348 metadata_expected.maxContentBoost = 1.25f;
1349 metadata_expected.minContentBoost = 0.75f;
1350 metadata_expected.gamma = 1.0f;
1351 metadata_expected.offsetSdr = 0.0f;
1352 metadata_expected.offsetHdr = 0.0f;
1353 metadata_expected.hdrCapacityMin = 1.0f;
1354 metadata_expected.hdrCapacityMax = metadata_expected.maxContentBoost;
Fyodor Kyslov8f46e2a2023-01-20 04:21:56 +00001355 const std::string nameSpace = "http://ns.adobe.com/xap/1.0/\0";
Ram Mohan9485bc72023-07-24 14:37:05 +05301356 const int nameSpaceLength = nameSpace.size() + 1; // need to count the null terminator
Fyodor Kyslov8f46e2a2023-01-20 04:21:56 +00001357
Dichen Zhang61ede362023-02-22 18:50:13 +00001358 std::string xmp = generateXmpForSecondaryImage(metadata_expected);
Dichen Zhangdc8452b2022-11-23 17:17:56 +00001359
Fyodor Kyslov8f46e2a2023-01-20 04:21:56 +00001360 std::vector<uint8_t> xmpData;
1361 xmpData.reserve(nameSpaceLength + xmp.size());
1362 xmpData.insert(xmpData.end(), reinterpret_cast<const uint8_t*>(nameSpace.c_str()),
Ram Mohan9485bc72023-07-24 14:37:05 +05301363 reinterpret_cast<const uint8_t*>(nameSpace.c_str()) + nameSpaceLength);
Fyodor Kyslov8f46e2a2023-01-20 04:21:56 +00001364 xmpData.insert(xmpData.end(), reinterpret_cast<const uint8_t*>(xmp.c_str()),
Ram Mohan9485bc72023-07-24 14:37:05 +05301365 reinterpret_cast<const uint8_t*>(xmp.c_str()) + xmp.size());
Fyodor Kyslov8f46e2a2023-01-20 04:21:56 +00001366
Dichen Zhangdbceb0e2023-04-14 19:03:18 +00001367 ultrahdr_metadata_struct metadata_read;
Fyodor Kyslov8f46e2a2023-01-20 04:21:56 +00001368 EXPECT_TRUE(getMetadataFromXMP(xmpData.data(), xmpData.size(), &metadata_read));
Nick Deakin31f03e32023-03-31 16:00:13 -04001369 EXPECT_FLOAT_EQ(metadata_expected.maxContentBoost, metadata_read.maxContentBoost);
1370 EXPECT_FLOAT_EQ(metadata_expected.minContentBoost, metadata_read.minContentBoost);
Nick Deakin094946b2023-06-09 11:58:41 -04001371 EXPECT_FLOAT_EQ(metadata_expected.gamma, metadata_read.gamma);
1372 EXPECT_FLOAT_EQ(metadata_expected.offsetSdr, metadata_read.offsetSdr);
1373 EXPECT_FLOAT_EQ(metadata_expected.offsetHdr, metadata_read.offsetHdr);
1374 EXPECT_FLOAT_EQ(metadata_expected.hdrCapacityMin, metadata_read.hdrCapacityMin);
1375 EXPECT_FLOAT_EQ(metadata_expected.hdrCapacityMax, metadata_read.hdrCapacityMax);
Dichen Zhangdc8452b2022-11-23 17:17:56 +00001376}
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001377
Ram Mohan9485bc72023-07-24 14:37:05 +05301378/* Test Encode API-0 and Decode */
1379TEST(JpegRTest, EncodeAPI0AndDecodeTest) {
1380 // reference encode
1381 UhdrUnCompressedStructWrapper rawImg(kImageWidth, kImageHeight, YCbCr_p010);
1382 ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1383 ASSERT_TRUE(rawImg.allocateMemory());
1384 ASSERT_TRUE(rawImg.loadRawResource(kYCbCrP010FileName));
1385 UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
1386 ASSERT_TRUE(jpgImg.allocateMemory());
1387 JpegR uHdrLib;
1388 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
1389 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1390 jpgImg.getImageHandle(), kQuality, nullptr),
1391 OK);
1392 // encode with luma stride set
1393 {
1394 UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
1395 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1396 ASSERT_TRUE(rawImg2.setImageStride(kImageWidth + 128, 0));
1397 ASSERT_TRUE(rawImg2.allocateMemory());
1398 ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
1399 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1400 ASSERT_TRUE(jpgImg2.allocateMemory());
1401 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
1402 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1403 jpgImg2.getImageHandle(), kQuality, nullptr),
1404 OK);
1405 auto jpg1 = jpgImg.getImageHandle();
1406 auto jpg2 = jpgImg2.getImageHandle();
1407 ASSERT_EQ(jpg1->length, jpg2->length);
1408 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1409 }
1410 // encode with luma and chroma stride set
1411 {
1412 UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
1413 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1414 ASSERT_TRUE(rawImg2.setImageStride(kImageWidth + 128, kImageWidth + 256));
1415 ASSERT_TRUE(rawImg2.setChromaMode(false));
1416 ASSERT_TRUE(rawImg2.allocateMemory());
1417 ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
1418 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1419 ASSERT_TRUE(jpgImg2.allocateMemory());
1420 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
1421 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1422 jpgImg2.getImageHandle(), kQuality, nullptr),
1423 OK);
1424 auto jpg1 = jpgImg.getImageHandle();
1425 auto jpg2 = jpgImg2.getImageHandle();
1426 ASSERT_EQ(jpg1->length, jpg2->length);
1427 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
1428 }
1429 // encode with chroma stride set
1430 {
1431 UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
1432 ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1433 ASSERT_TRUE(rawImg2.setImageStride(0, kImageWidth + 64));
1434 ASSERT_TRUE(rawImg2.setChromaMode(false));
1435 ASSERT_TRUE(rawImg2.allocateMemory());
1436 ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
1437 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1438 ASSERT_TRUE(jpgImg2.allocateMemory());
1439 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
1440 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1441 jpgImg2.getImageHandle(), kQuality, nullptr),
1442 OK);
1443 auto jpg1 = jpgImg.getImageHandle();
1444 auto jpg2 = jpgImg2.getImageHandle();
1445 ASSERT_EQ(jpg1->length, jpg2->length);
1446 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Ram Mohanfd7bb542023-05-20 00:55:56 +05301447 }
1448
Ram Mohan9485bc72023-07-24 14:37:05 +05301449 auto jpg1 = jpgImg.getImageHandle();
1450#ifdef DUMP_OUTPUT
1451 if (!writeFile("encode_api0_output.jpeg", jpg1->data, jpg1->length)) {
1452 std::cerr << "unable to write output file" << std::endl;
Ram Mohanfd7bb542023-05-20 00:55:56 +05301453 }
Ram Mohan9485bc72023-07-24 14:37:05 +05301454#endif
Ram Mohanfd7bb542023-05-20 00:55:56 +05301455
Ram Mohan9485bc72023-07-24 14:37:05 +05301456 ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api0_output.rgb"));
Ram Mohanfd7bb542023-05-20 00:55:56 +05301457}
1458
Ram Mohan9485bc72023-07-24 14:37:05 +05301459/* Test Encode API-1 and Decode */
1460TEST(JpegRTest, EncodeAPI1AndDecodeTest) {
1461 UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
1462 ASSERT_TRUE(rawImgP010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1463 ASSERT_TRUE(rawImgP010.allocateMemory());
1464 ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
1465 UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
1466 ASSERT_TRUE(rawImg420.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
1467 ASSERT_TRUE(rawImg420.allocateMemory());
1468 ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
1469 UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
1470 ASSERT_TRUE(jpgImg.allocateMemory());
1471 JpegR uHdrLib;
1472 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg420.getImageHandle(),
1473 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1474 jpgImg.getImageHandle(), kQuality, nullptr),
1475 OK);
1476 // encode with luma stride set
1477 {
1478 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1479 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1480 ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
1481 ASSERT_TRUE(rawImg2P010.allocateMemory());
1482 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1483 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1484 ASSERT_TRUE(jpgImg2.allocateMemory());
1485 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
1486 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1487 jpgImg2.getImageHandle(), kQuality, nullptr),
1488 OK);
1489 auto jpg1 = jpgImg.getImageHandle();
1490 auto jpg2 = jpgImg2.getImageHandle();
1491 ASSERT_EQ(jpg1->length, jpg2->length);
1492 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhangc3437ca2023-01-04 14:00:08 -08001493 }
Ram Mohan9485bc72023-07-24 14:37:05 +05301494 // encode with luma and chroma stride set
1495 {
1496 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1497 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1498 ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
1499 ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1500 ASSERT_TRUE(rawImg2P010.allocateMemory());
1501 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1502 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1503 ASSERT_TRUE(jpgImg2.allocateMemory());
1504 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
1505 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1506 jpgImg2.getImageHandle(), kQuality, nullptr),
1507 OK);
1508 auto jpg1 = jpgImg.getImageHandle();
1509 auto jpg2 = jpgImg2.getImageHandle();
1510 ASSERT_EQ(jpg1->length, jpg2->length);
1511 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhangc3437ca2023-01-04 14:00:08 -08001512 }
Ram Mohan9485bc72023-07-24 14:37:05 +05301513 // encode with chroma stride set
1514 {
1515 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1516 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1517 ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
1518 ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1519 ASSERT_TRUE(rawImg2P010.allocateMemory());
1520 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1521 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1522 ASSERT_TRUE(jpgImg2.allocateMemory());
1523 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
1524 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1525 jpgImg2.getImageHandle(), kQuality, nullptr),
1526 OK);
1527 auto jpg1 = jpgImg.getImageHandle();
1528 auto jpg2 = jpgImg2.getImageHandle();
1529 ASSERT_EQ(jpg1->length, jpg2->length);
1530 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhangc3437ca2023-01-04 14:00:08 -08001531 }
1532
Ram Mohan9485bc72023-07-24 14:37:05 +05301533 auto jpg1 = jpgImg.getImageHandle();
Dichen Zhangc3437ca2023-01-04 14:00:08 -08001534
Ram Mohan9485bc72023-07-24 14:37:05 +05301535#ifdef DUMP_OUTPUT
1536 if (!writeFile("encode_api1_output.jpeg", jpg1->data, jpg1->length)) {
1537 std::cerr << "unable to write output file" << std::endl;
1538 }
1539#endif
1540
1541 ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api1_output.rgb"));
Dichen Zhangc3437ca2023-01-04 14:00:08 -08001542}
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001543
Ram Mohan9485bc72023-07-24 14:37:05 +05301544/* Test Encode API-2 and Decode */
1545TEST(JpegRTest, EncodeAPI2AndDecodeTest) {
1546 UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
1547 ASSERT_TRUE(rawImgP010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1548 ASSERT_TRUE(rawImgP010.allocateMemory());
1549 ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
1550 UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
1551 ASSERT_TRUE(rawImg420.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
1552 ASSERT_TRUE(rawImg420.allocateMemory());
1553 ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
1554 UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
1555 ASSERT_TRUE(jpgImg.allocateMemory());
1556 UhdrCompressedStructWrapper jpgSdr(kImageWidth, kImageHeight);
1557 ASSERT_TRUE(jpgSdr.allocateMemory());
1558 auto sdr = jpgSdr.getImageHandle();
1559 ASSERT_TRUE(readFile(kSdrJpgFileName, sdr->data, sdr->maxLength, sdr->length));
1560 JpegR uHdrLib;
1561 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg420.getImageHandle(), sdr,
1562 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1563 jpgImg.getImageHandle()),
1564 OK);
1565 // encode with luma stride set
1566 {
1567 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1568 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1569 ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
1570 ASSERT_TRUE(rawImg2P010.allocateMemory());
1571 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1572 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1573 ASSERT_TRUE(jpgImg2.allocateMemory());
1574 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
1575 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1576 jpgImg2.getImageHandle()),
1577 OK);
1578 auto jpg1 = jpgImg.getImageHandle();
1579 auto jpg2 = jpgImg2.getImageHandle();
1580 ASSERT_EQ(jpg1->length, jpg2->length);
1581 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhang66ca6e32023-04-05 12:22:54 -07001582 }
Ram Mohan9485bc72023-07-24 14:37:05 +05301583 // encode with luma and chroma stride set
1584 {
1585 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1586 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1587 ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
1588 ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1589 ASSERT_TRUE(rawImg2P010.allocateMemory());
1590 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1591 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1592 ASSERT_TRUE(jpgImg2.allocateMemory());
1593 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
1594 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1595 jpgImg2.getImageHandle()),
1596 OK);
1597 auto jpg1 = jpgImg.getImageHandle();
1598 auto jpg2 = jpgImg2.getImageHandle();
1599 ASSERT_EQ(jpg1->length, jpg2->length);
1600 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhang66ca6e32023-04-05 12:22:54 -07001601 }
Ram Mohan9485bc72023-07-24 14:37:05 +05301602 // encode with chroma stride set
1603 {
1604 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1605 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1606 ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
1607 ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1608 ASSERT_TRUE(rawImg2P010.allocateMemory());
1609 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1610 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1611 ASSERT_TRUE(jpgImg2.allocateMemory());
1612 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
1613 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1614 jpgImg2.getImageHandle()),
1615 OK);
1616 auto jpg1 = jpgImg.getImageHandle();
1617 auto jpg2 = jpgImg2.getImageHandle();
1618 ASSERT_EQ(jpg1->length, jpg2->length);
1619 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhang66ca6e32023-04-05 12:22:54 -07001620 }
1621
Ram Mohan9485bc72023-07-24 14:37:05 +05301622 auto jpg1 = jpgImg.getImageHandle();
Dichen Zhang66ca6e32023-04-05 12:22:54 -07001623
Ram Mohan9485bc72023-07-24 14:37:05 +05301624#ifdef DUMP_OUTPUT
1625 if (!writeFile("encode_api2_output.jpeg", jpg1->data, jpg1->length)) {
1626 std::cerr << "unable to write output file" << std::endl;
1627 }
1628#endif
1629
1630 ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api2_output.rgb"));
Dichen Zhang66ca6e32023-04-05 12:22:54 -07001631}
1632
Ram Mohan9485bc72023-07-24 14:37:05 +05301633/* Test Encode API-3 and Decode */
1634TEST(JpegRTest, EncodeAPI3AndDecodeTest) {
1635 UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
1636 ASSERT_TRUE(rawImgP010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1637 ASSERT_TRUE(rawImgP010.allocateMemory());
1638 ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
1639 UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
1640 ASSERT_TRUE(jpgImg.allocateMemory());
1641 UhdrCompressedStructWrapper jpgSdr(kImageWidth, kImageHeight);
1642 ASSERT_TRUE(jpgSdr.allocateMemory());
1643 auto sdr = jpgSdr.getImageHandle();
1644 ASSERT_TRUE(readFile(kSdrJpgFileName, sdr->data, sdr->maxLength, sdr->length));
1645 JpegR uHdrLib;
1646 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), sdr,
1647 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1648 jpgImg.getImageHandle()),
1649 OK);
1650 // encode with luma stride set
1651 {
1652 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1653 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1654 ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
1655 ASSERT_TRUE(rawImg2P010.allocateMemory());
1656 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1657 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1658 ASSERT_TRUE(jpgImg2.allocateMemory());
1659 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
1660 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1661 jpgImg2.getImageHandle()),
1662 OK);
1663 auto jpg1 = jpgImg.getImageHandle();
1664 auto jpg2 = jpgImg2.getImageHandle();
1665 ASSERT_EQ(jpg1->length, jpg2->length);
1666 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhang54444382022-12-07 20:57:49 +00001667 }
Ram Mohan9485bc72023-07-24 14:37:05 +05301668 // encode with luma and chroma stride set
1669 {
1670 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1671 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1672 ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
1673 ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1674 ASSERT_TRUE(rawImg2P010.allocateMemory());
1675 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1676 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1677 ASSERT_TRUE(jpgImg2.allocateMemory());
1678 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
1679 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1680 jpgImg2.getImageHandle()),
1681 OK);
1682 auto jpg1 = jpgImg.getImageHandle();
1683 auto jpg2 = jpgImg2.getImageHandle();
1684 ASSERT_EQ(jpg1->length, jpg2->length);
1685 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001686 }
Ram Mohan9485bc72023-07-24 14:37:05 +05301687 // encode with chroma stride set
1688 {
1689 UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
1690 ASSERT_TRUE(rawImg2P010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1691 ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
1692 ASSERT_TRUE(rawImg2P010.setChromaMode(false));
1693 ASSERT_TRUE(rawImg2P010.allocateMemory());
1694 ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
1695 UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
1696 ASSERT_TRUE(jpgImg2.allocateMemory());
1697 ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
1698 ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1699 jpgImg2.getImageHandle()),
1700 OK);
1701 auto jpg1 = jpgImg.getImageHandle();
1702 auto jpg2 = jpgImg2.getImageHandle();
1703 ASSERT_EQ(jpg1->length, jpg2->length);
1704 ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
Dichen Zhang54444382022-12-07 20:57:49 +00001705 }
1706
Ram Mohan9485bc72023-07-24 14:37:05 +05301707 auto jpg1 = jpgImg.getImageHandle();
Dichen Zhang54444382022-12-07 20:57:49 +00001708
Ram Mohan9485bc72023-07-24 14:37:05 +05301709#ifdef DUMP_OUTPUT
1710 if (!writeFile("encode_api3_output.jpeg", jpg1->data, jpg1->length)) {
1711 std::cerr << "unable to write output file" << std::endl;
1712 }
1713#endif
1714
1715 ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api3_output.rgb"));
Dichen Zhang54444382022-12-07 20:57:49 +00001716}
1717
Ram Mohan9485bc72023-07-24 14:37:05 +05301718// ============================================================================
1719// Profiling
1720// ============================================================================
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001721
Ram Mohan9485bc72023-07-24 14:37:05 +05301722class Profiler {
1723public:
1724 void timerStart() { gettimeofday(&mStartingTime, nullptr); }
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001725
Ram Mohan9485bc72023-07-24 14:37:05 +05301726 void timerStop() { gettimeofday(&mEndingTime, nullptr); }
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001727
Ram Mohan9485bc72023-07-24 14:37:05 +05301728 int64_t elapsedTime() {
1729 struct timeval elapsedMicroseconds;
1730 elapsedMicroseconds.tv_sec = mEndingTime.tv_sec - mStartingTime.tv_sec;
1731 elapsedMicroseconds.tv_usec = mEndingTime.tv_usec - mStartingTime.tv_usec;
1732 return elapsedMicroseconds.tv_sec * 1000000 + elapsedMicroseconds.tv_usec;
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001733 }
1734
Ram Mohan9485bc72023-07-24 14:37:05 +05301735private:
1736 struct timeval mStartingTime;
1737 struct timeval mEndingTime;
1738};
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001739
Ram Mohan9485bc72023-07-24 14:37:05 +05301740class JpegRBenchmark : public JpegR {
1741public:
1742 void BenchmarkGenerateGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr p010Image,
1743 ultrahdr_metadata_ptr metadata, jr_uncompressed_ptr map);
1744 void BenchmarkApplyGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr map,
1745 ultrahdr_metadata_ptr metadata, jr_uncompressed_ptr dest);
1746
1747private:
1748 const int kProfileCount = 10;
1749};
1750
1751void JpegRBenchmark::BenchmarkGenerateGainMap(jr_uncompressed_ptr yuv420Image,
1752 jr_uncompressed_ptr p010Image,
1753 ultrahdr_metadata_ptr metadata,
1754 jr_uncompressed_ptr map) {
1755 ASSERT_EQ(yuv420Image->width, p010Image->width);
1756 ASSERT_EQ(yuv420Image->height, p010Image->height);
1757 Profiler profileGenerateMap;
1758 profileGenerateMap.timerStart();
1759 for (auto i = 0; i < kProfileCount; i++) {
1760 ASSERT_EQ(OK,
1761 generateGainMap(yuv420Image, p010Image, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
1762 metadata, map));
1763 if (i != kProfileCount - 1) delete[] static_cast<uint8_t*>(map->data);
1764 }
1765 profileGenerateMap.timerStop();
1766 ALOGE("Generate Gain Map:- Res = %i x %i, time = %f ms", yuv420Image->width, yuv420Image->height,
1767 profileGenerateMap.elapsedTime() / (kProfileCount * 1000.f));
Dichen Zhang7e3ed122022-12-14 22:05:01 +00001768}
1769
Ram Mohan9485bc72023-07-24 14:37:05 +05301770void JpegRBenchmark::BenchmarkApplyGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr map,
1771 ultrahdr_metadata_ptr metadata,
1772 jr_uncompressed_ptr dest) {
1773 Profiler profileRecMap;
1774 profileRecMap.timerStart();
1775 for (auto i = 0; i < kProfileCount; i++) {
1776 ASSERT_EQ(OK,
1777 applyGainMap(yuv420Image, map, metadata, ULTRAHDR_OUTPUT_HDR_HLG,
1778 metadata->maxContentBoost /* displayBoost */, dest));
Dichen Zhang36c1e732022-11-23 01:25:34 +00001779 }
Ram Mohan9485bc72023-07-24 14:37:05 +05301780 profileRecMap.timerStop();
1781 ALOGE("Apply Gain Map:- Res = %i x %i, time = %f ms", yuv420Image->width, yuv420Image->height,
1782 profileRecMap.elapsedTime() / (kProfileCount * 1000.f));
Dichen Zhang36c1e732022-11-23 01:25:34 +00001783}
1784
Ram Mohan9485bc72023-07-24 14:37:05 +05301785TEST(JpegRTest, ProfileGainMapFuncs) {
1786 UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
1787 ASSERT_TRUE(rawImgP010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
1788 ASSERT_TRUE(rawImgP010.allocateMemory());
1789 ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
1790 UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
1791 ASSERT_TRUE(rawImg420.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
1792 ASSERT_TRUE(rawImg420.allocateMemory());
1793 ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
1794 ultrahdr_metadata_struct metadata = {.version = "1.0"};
1795 jpegr_uncompressed_struct map = {.data = NULL,
1796 .width = 0,
1797 .height = 0,
1798 .colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED};
Dichen Zhang761b52d2023-02-10 22:38:38 +00001799 JpegRBenchmark benchmark;
Ram Mohan9485bc72023-07-24 14:37:05 +05301800 ASSERT_NO_FATAL_FAILURE(benchmark.BenchmarkGenerateGainMap(rawImg420.getImageHandle(),
1801 rawImgP010.getImageHandle(), &metadata,
1802 &map));
Nick Deakind19e5762023-02-10 15:39:08 -05001803
Ram Mohan9485bc72023-07-24 14:37:05 +05301804 const int dstSize = kImageWidth * kImageWidth * 4;
1805 auto bufferDst = std::make_unique<uint8_t[]>(dstSize);
1806 jpegr_uncompressed_struct dest = {.data = bufferDst.get(),
Nick Deakind19e5762023-02-10 15:39:08 -05001807 .width = 0,
1808 .height = 0,
Ram Mohan9485bc72023-07-24 14:37:05 +05301809 .colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED};
Nick Deakind19e5762023-02-10 15:39:08 -05001810
Ram Mohan9485bc72023-07-24 14:37:05 +05301811 ASSERT_NO_FATAL_FAILURE(
1812 benchmark.BenchmarkApplyGainMap(rawImg420.getImageHandle(), &map, &metadata, &dest));
Nick Deakind19e5762023-02-10 15:39:08 -05001813}
1814
Dichen Zhangdbceb0e2023-04-14 19:03:18 +00001815} // namespace android::ultrahdr