| Dichen Zhang | 85b3756 | 2022-10-11 11:08:28 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright 2022 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 17 | #include <sys/time.h> | 
|  | 18 | #include <fstream> | 
|  | 19 | #include <iostream> | 
|  | 20 |  | 
|  | 21 | #include <ultrahdr/gainmapmath.h> | 
| Dichen Zhang | dbceb0e | 2023-04-14 19:03:18 +0000 | [diff] [blame] | 22 | #include <ultrahdr/jpegr.h> | 
|  | 23 | #include <ultrahdr/jpegrutils.h> | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 24 |  | 
| Dichen Zhang | 36c1e73 | 2022-11-23 01:25:34 +0000 | [diff] [blame] | 25 | #include <gtest/gtest.h> | 
|  | 26 | #include <utils/Log.h> | 
|  | 27 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 28 | //#define DUMP_OUTPUT | 
| Dichen Zhang | 85b3756 | 2022-10-11 11:08:28 -0700 | [diff] [blame] | 29 |  | 
| Dichen Zhang | dbceb0e | 2023-04-14 19:03:18 +0000 | [diff] [blame] | 30 | namespace android::ultrahdr { | 
| Dichen Zhang | 85b3756 | 2022-10-11 11:08:28 -0700 | [diff] [blame] | 31 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 32 | // resources used by unit tests | 
|  | 33 | const char* kYCbCrP010FileName = "raw_p010_image.p010"; | 
|  | 34 | const char* kYCbCr420FileName = "raw_yuv420_image.yuv420"; | 
|  | 35 | const char* kSdrJpgFileName = "jpeg_image.jpg"; | 
|  | 36 | const int kImageWidth = 1280; | 
|  | 37 | const int kImageHeight = 720; | 
|  | 38 | const int kQuality = 90; | 
| Nick Deakin | 594a4ca | 2022-11-16 20:57:42 -0500 | [diff] [blame] | 39 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 40 | // Wrapper to describe the input type | 
|  | 41 | typedef enum { | 
|  | 42 | YCbCr_p010 = 0, | 
|  | 43 | YCbCr_420 = 1, | 
|  | 44 | } UhdrInputFormat; | 
| Nick Deakin | 594a4ca | 2022-11-16 20:57:42 -0500 | [diff] [blame] | 45 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 46 | /** | 
|  | 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 | */ | 
|  | 56 | class UhdrUnCompressedStructWrapper { | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 57 | public: | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 58 | UhdrUnCompressedStructWrapper(uint32_t width, uint32_t height, UhdrInputFormat format); | 
|  | 59 | ~UhdrUnCompressedStructWrapper() = default; | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 60 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 61 | 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 Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 67 |  | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 68 | private: | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 69 | 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 Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 74 | }; | 
|  | 75 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 76 | /** | 
|  | 77 | * Wrapper class for compressed resource | 
|  | 78 | * Sample usage: | 
|  | 79 | *   UhdrCompressedStructWrapper jpgImg(width, height); | 
|  | 80 | *   rawImg.allocateMemory(); | 
|  | 81 | */ | 
|  | 82 | class UhdrCompressedStructWrapper { | 
|  | 83 | public: | 
|  | 84 | UhdrCompressedStructWrapper(uint32_t width, uint32_t height); | 
|  | 85 | ~UhdrCompressedStructWrapper() = default; | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 86 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 87 | bool allocateMemory(); | 
|  | 88 | jr_compressed_ptr getImageHandle(); | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 89 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 90 | private: | 
|  | 91 | std::unique_ptr<uint8_t[]> mData; | 
|  | 92 | jpegr_compressed_struct mImg{}; | 
|  | 93 | uint32_t mWidth; | 
|  | 94 | uint32_t mHeight; | 
|  | 95 | }; | 
|  | 96 |  | 
|  | 97 | UhdrUnCompressedStructWrapper::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 |  | 
|  | 110 | bool 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 Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 114 | } | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 115 | mIsChromaContiguous = isChromaContiguous; | 
|  | 116 | return true; | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 117 | } | 
|  | 118 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 119 | bool 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 Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 123 | } | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 124 | 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 Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 143 | } | 
|  | 144 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 145 | bool 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 Deakin | 594a4ca | 2022-11-16 20:57:42 -0500 | [diff] [blame] | 152 | } | 
|  | 153 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 154 | bool 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 188 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 189 | bool 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 244 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 245 | jr_uncompressed_ptr UhdrUnCompressedStructWrapper::getImageHandle() { | 
|  | 246 | return &mImg; | 
|  | 247 | } | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 248 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 249 | UhdrCompressedStructWrapper::UhdrCompressedStructWrapper(uint32_t width, uint32_t height) { | 
|  | 250 | mWidth = width; | 
|  | 251 | mHeight = height; | 
|  | 252 | } | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 253 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 254 | bool 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 266 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 267 | jr_compressed_ptr UhdrCompressedStructWrapper::getImageHandle() { | 
|  | 268 | return &mImg; | 
|  | 269 | } | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 270 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 271 | static 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 280 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 281 | static 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 296 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 297 | void 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 | 
|  | 324 | TEST(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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 364 |  | 
|  | 365 | // test dest | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 366 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 383 |  | 
|  | 384 | // test p010 input | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 385 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 390 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 391 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 399 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 400 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 409 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 410 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 420 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 421 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 427 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 428 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 434 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 435 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 441 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 442 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 448 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 449 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 455 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 456 | 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 Mohan | fd7bb54 | 2023-05-20 00:55:56 +0530 | [diff] [blame] | 463 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 464 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 474 | } | 
|  | 475 |  | 
|  | 476 | /* Test Encode API-1 invalid arguments */ | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 477 | TEST(JpegRTest, EncodeAPI1WithInvalidArgs) { | 
|  | 478 | JpegR uHdrLib; | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 479 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 480 | UhdrCompressedStructWrapper jpgImg(16, 16); | 
|  | 481 | ASSERT_TRUE(jpgImg.allocateMemory()); | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 482 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 483 | // 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 491 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 492 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 502 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 503 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 520 |  | 
|  | 521 | // test dest | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 522 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 542 |  | 
|  | 543 | // test p010 input | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 544 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 553 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 554 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 562 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 563 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 573 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 574 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 582 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 583 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 592 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 593 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 601 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 602 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 609 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 610 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 617 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 618 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 646 |  | 
|  | 647 | // test 420 input | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 648 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 657 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 658 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 676 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 677 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 685 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 686 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 695 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 696 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 704 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 705 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 712 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 713 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 720 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 721 | 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; | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 731 | rawImg420->luma_stride = kWidth - 2; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 732 | ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, | 
|  | 733 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 734 | jpgImg.getImageHandle(), kQuality, nullptr), | 
|  | 735 | OK) | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 736 | << "fail, API allows bad luma stride for 420"; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 737 |  | 
|  | 738 | rawImg420->width = kWidth; | 
|  | 739 | rawImg420->height = kHeight; | 
|  | 740 | rawImg420->luma_stride = 0; | 
|  | 741 | rawImg420->chroma_data = rawImgP010->data; | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 742 | rawImg420->chroma_stride = kWidth / 2 - 2; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 743 | ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, | 
|  | 744 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 745 | jpgImg.getImageHandle(), kQuality, nullptr), | 
|  | 746 | OK) | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 747 | << "fail, API allows bad chroma stride for 420"; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 748 | } | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 749 | } | 
|  | 750 |  | 
|  | 751 | /* Test Encode API-2 invalid arguments */ | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 752 | TEST(JpegRTest, EncodeAPI2WithInvalidArgs) { | 
|  | 753 | JpegR uHdrLib; | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 754 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 755 | UhdrCompressedStructWrapper jpgImg(16, 16); | 
|  | 756 | ASSERT_TRUE(jpgImg.allocateMemory()); | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 757 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 758 | // 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 766 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 767 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 787 |  | 
|  | 788 | // test dest | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 789 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 833 |  | 
|  | 834 | // test p010 input | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 835 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 844 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 845 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 854 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 855 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 865 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 866 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 874 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 875 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 884 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 885 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 893 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 894 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 901 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 902 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 909 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 910 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 938 |  | 
|  | 939 | // test 420 input | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 940 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 949 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 950 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 969 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 970 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 978 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 979 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 988 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 989 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 997 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 998 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1005 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1006 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1013 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1014 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1021 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1022 | rawImg420->width = kWidth; | 
|  | 1023 | rawImg420->height = kHeight; | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1024 | rawImg420->luma_stride = kWidth - 2; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1025 | ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(), | 
|  | 1026 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1027 | jpgImg.getImageHandle()), | 
|  | 1028 | OK) | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1029 | << "fail, API allows bad luma stride for 420"; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1030 |  | 
|  | 1031 | rawImg420->width = kWidth; | 
|  | 1032 | rawImg420->height = kHeight; | 
|  | 1033 | rawImg420->luma_stride = 0; | 
|  | 1034 | rawImg420->chroma_data = rawImgP010->data; | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1035 | rawImg420->chroma_stride = kWidth / 2 - 2; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1036 | ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(), | 
|  | 1037 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1038 | jpgImg.getImageHandle()), | 
|  | 1039 | OK) | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1040 | << "fail, API allows bad chroma stride for 420"; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1041 | } | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1042 | } | 
|  | 1043 |  | 
|  | 1044 | /* Test Encode API-3 invalid arguments */ | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1045 | TEST(JpegRTest, EncodeAPI3WithInvalidArgs) { | 
|  | 1046 | JpegR uHdrLib; | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1047 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1048 | UhdrCompressedStructWrapper jpgImg(16, 16); | 
|  | 1049 | ASSERT_TRUE(jpgImg.allocateMemory()); | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1050 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1051 | // 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1056 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1057 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1074 |  | 
|  | 1075 | // test dest | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1076 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1111 |  | 
|  | 1112 | // test p010 input | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1113 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1119 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1120 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1128 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1129 | { | 
|  | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1135 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1136 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1144 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1145 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1154 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1155 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1163 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1164 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1171 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1172 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1179 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1180 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1187 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1188 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1196 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1197 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1208 | } | 
|  | 1209 |  | 
|  | 1210 | /* Test Encode API-4 invalid arguments */ | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1211 | TEST(JpegRTest, EncodeAPI4WithInvalidArgs) { | 
|  | 1212 | UhdrCompressedStructWrapper jpgImg(16, 16); | 
|  | 1213 | ASSERT_TRUE(jpgImg.allocateMemory()); | 
|  | 1214 | UhdrCompressedStructWrapper jpgImg2(16, 16); | 
|  | 1215 | JpegR uHdrLib; | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1216 |  | 
|  | 1217 | // test dest | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1218 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1225 |  | 
|  | 1226 | // test primary image | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1227 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1234 |  | 
|  | 1235 | // test gain map | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1236 | 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 Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1243 |  | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1244 | // 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 Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1257 | ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata, | 
|  | 1258 | jpgImg.getImageHandle()), | 
|  | 1259 | OK) | 
|  | 1260 | << "fail, API allows bad metadata version"; | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1261 |  | 
|  | 1262 | metadata = good_metadata; | 
|  | 1263 | metadata.minContentBoost = 3.0f; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1264 | ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata, | 
|  | 1265 | jpgImg.getImageHandle()), | 
|  | 1266 | OK) | 
|  | 1267 | << "fail, API allows bad metadata content boost"; | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1268 |  | 
|  | 1269 | metadata = good_metadata; | 
|  | 1270 | metadata.gamma = -0.1f; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1271 | ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata, | 
|  | 1272 | jpgImg.getImageHandle()), | 
|  | 1273 | OK) | 
|  | 1274 | << "fail, API allows bad metadata gamma"; | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1275 |  | 
|  | 1276 | metadata = good_metadata; | 
|  | 1277 | metadata.offsetSdr = -0.1f; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1278 | ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata, | 
|  | 1279 | jpgImg.getImageHandle()), | 
|  | 1280 | OK) | 
|  | 1281 | << "fail, API allows bad metadata offset sdr"; | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1282 |  | 
|  | 1283 | metadata = good_metadata; | 
|  | 1284 | metadata.offsetHdr = -0.1f; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1285 | ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata, | 
|  | 1286 | jpgImg.getImageHandle()), | 
|  | 1287 | OK) | 
|  | 1288 | << "fail, API allows bad metadata offset hdr"; | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1289 |  | 
|  | 1290 | metadata = good_metadata; | 
|  | 1291 | metadata.hdrCapacityMax = 0.5f; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1292 | ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata, | 
|  | 1293 | jpgImg.getImageHandle()), | 
|  | 1294 | OK) | 
|  | 1295 | << "fail, API allows bad metadata hdr capacity max"; | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1296 |  | 
|  | 1297 | metadata = good_metadata; | 
|  | 1298 | metadata.hdrCapacityMin = 0.5f; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1299 | ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata, | 
|  | 1300 | jpgImg.getImageHandle()), | 
|  | 1301 | OK) | 
|  | 1302 | << "fail, API allows bad metadata hdr capacity min"; | 
| Ram Mohan | 35ab3a8 | 2023-05-18 18:38:16 +0530 | [diff] [blame] | 1303 | } | 
|  | 1304 |  | 
| Ram Mohan | b037505 | 2023-05-20 04:03:48 +0530 | [diff] [blame] | 1305 | /* Test Decode API invalid arguments */ | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1306 | TEST(JpegRTest, DecodeAPIWithInvalidArgs) { | 
|  | 1307 | JpegR uHdrLib; | 
| Ram Mohan | b037505 | 2023-05-20 04:03:48 +0530 | [diff] [blame] | 1308 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1309 | 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 Mohan | b037505 | 2023-05-20 04:03:48 +0530 | [diff] [blame] | 1314 |  | 
|  | 1315 | // test jpegr image | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1316 | 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 Mohan | b037505 | 2023-05-20 04:03:48 +0530 | [diff] [blame] | 1321 |  | 
|  | 1322 | // test dest image | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1323 | 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 Mohan | b037505 | 2023-05-20 04:03:48 +0530 | [diff] [blame] | 1329 |  | 
|  | 1330 | // test max display boost | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1331 | ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, 0.5), OK) | 
|  | 1332 | << "fail, API allows invalid max display boost"; | 
| Ram Mohan | b037505 | 2023-05-20 04:03:48 +0530 | [diff] [blame] | 1333 |  | 
|  | 1334 | // test output format | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1335 | 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 Mohan | b037505 | 2023-05-20 04:03:48 +0530 | [diff] [blame] | 1343 | } | 
|  | 1344 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1345 | TEST(JpegRTest, writeXmpThenRead) { | 
| Dichen Zhang | dbceb0e | 2023-04-14 19:03:18 +0000 | [diff] [blame] | 1346 | ultrahdr_metadata_struct metadata_expected; | 
| Nick Deakin | 05ceebf | 2023-04-19 15:27:13 -0400 | [diff] [blame] | 1347 | metadata_expected.version = "1.0"; | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1348 | 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 Kyslov | 8f46e2a | 2023-01-20 04:21:56 +0000 | [diff] [blame] | 1355 | const std::string nameSpace = "http://ns.adobe.com/xap/1.0/\0"; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1356 | const int nameSpaceLength = nameSpace.size() + 1; // need to count the null terminator | 
| Fyodor Kyslov | 8f46e2a | 2023-01-20 04:21:56 +0000 | [diff] [blame] | 1357 |  | 
| Dichen Zhang | 61ede36 | 2023-02-22 18:50:13 +0000 | [diff] [blame] | 1358 | std::string xmp = generateXmpForSecondaryImage(metadata_expected); | 
| Dichen Zhang | dc8452b | 2022-11-23 17:17:56 +0000 | [diff] [blame] | 1359 |  | 
| Fyodor Kyslov | 8f46e2a | 2023-01-20 04:21:56 +0000 | [diff] [blame] | 1360 | 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 Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1363 | reinterpret_cast<const uint8_t*>(nameSpace.c_str()) + nameSpaceLength); | 
| Fyodor Kyslov | 8f46e2a | 2023-01-20 04:21:56 +0000 | [diff] [blame] | 1364 | xmpData.insert(xmpData.end(), reinterpret_cast<const uint8_t*>(xmp.c_str()), | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1365 | reinterpret_cast<const uint8_t*>(xmp.c_str()) + xmp.size()); | 
| Fyodor Kyslov | 8f46e2a | 2023-01-20 04:21:56 +0000 | [diff] [blame] | 1366 |  | 
| Dichen Zhang | dbceb0e | 2023-04-14 19:03:18 +0000 | [diff] [blame] | 1367 | ultrahdr_metadata_struct metadata_read; | 
| Fyodor Kyslov | 8f46e2a | 2023-01-20 04:21:56 +0000 | [diff] [blame] | 1368 | EXPECT_TRUE(getMetadataFromXMP(xmpData.data(), xmpData.size(), &metadata_read)); | 
| Nick Deakin | 31f03e3 | 2023-03-31 16:00:13 -0400 | [diff] [blame] | 1369 | EXPECT_FLOAT_EQ(metadata_expected.maxContentBoost, metadata_read.maxContentBoost); | 
|  | 1370 | EXPECT_FLOAT_EQ(metadata_expected.minContentBoost, metadata_read.minContentBoost); | 
| Nick Deakin | 094946b | 2023-06-09 11:58:41 -0400 | [diff] [blame] | 1371 | 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 Zhang | dc8452b | 2022-11-23 17:17:56 +0000 | [diff] [blame] | 1376 | } | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1377 |  | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1378 | class JpegRAPIEncodeAndDecodeTest | 
|  | 1379 | : public ::testing::TestWithParam<std::tuple<ultrahdr_color_gamut, ultrahdr_color_gamut>> { | 
|  | 1380 | public: | 
|  | 1381 | JpegRAPIEncodeAndDecodeTest() | 
|  | 1382 | : mP010ColorGamut(std::get<0>(GetParam())), mYuv420ColorGamut(std::get<1>(GetParam())){}; | 
|  | 1383 |  | 
|  | 1384 | const ultrahdr_color_gamut mP010ColorGamut; | 
|  | 1385 | const ultrahdr_color_gamut mYuv420ColorGamut; | 
|  | 1386 | }; | 
|  | 1387 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1388 | /* Test Encode API-0 and Decode */ | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1389 | TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI0AndDecodeTest) { | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1390 | // reference encode | 
|  | 1391 | UhdrUnCompressedStructWrapper rawImg(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1392 | ASSERT_TRUE(rawImg.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1393 | ASSERT_TRUE(rawImg.allocateMemory()); | 
|  | 1394 | ASSERT_TRUE(rawImg.loadRawResource(kYCbCrP010FileName)); | 
|  | 1395 | UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight); | 
|  | 1396 | ASSERT_TRUE(jpgImg.allocateMemory()); | 
|  | 1397 | JpegR uHdrLib; | 
|  | 1398 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), | 
|  | 1399 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1400 | jpgImg.getImageHandle(), kQuality, nullptr), | 
|  | 1401 | OK); | 
|  | 1402 | // encode with luma stride set | 
|  | 1403 | { | 
|  | 1404 | UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1405 | ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut)); | 
|  | 1406 | ASSERT_TRUE(rawImg2.setImageStride(kImageWidth + 18, 0)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1407 | ASSERT_TRUE(rawImg2.allocateMemory()); | 
|  | 1408 | ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName)); | 
|  | 1409 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1410 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1411 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), | 
|  | 1412 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1413 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1414 | OK); | 
|  | 1415 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1416 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1417 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1418 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1419 | } | 
|  | 1420 | // encode with luma and chroma stride set | 
|  | 1421 | { | 
|  | 1422 | UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1423 | ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut)); | 
|  | 1424 | ASSERT_TRUE(rawImg2.setImageStride(kImageWidth + 18, kImageWidth + 28)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1425 | ASSERT_TRUE(rawImg2.setChromaMode(false)); | 
|  | 1426 | ASSERT_TRUE(rawImg2.allocateMemory()); | 
|  | 1427 | ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName)); | 
|  | 1428 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1429 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1430 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), | 
|  | 1431 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1432 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1433 | OK); | 
|  | 1434 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1435 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1436 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1437 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1438 | } | 
|  | 1439 | // encode with chroma stride set | 
|  | 1440 | { | 
|  | 1441 | UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1442 | ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut)); | 
|  | 1443 | ASSERT_TRUE(rawImg2.setImageStride(0, kImageWidth + 34)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1444 | ASSERT_TRUE(rawImg2.setChromaMode(false)); | 
|  | 1445 | ASSERT_TRUE(rawImg2.allocateMemory()); | 
|  | 1446 | ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName)); | 
|  | 1447 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1448 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1449 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), | 
|  | 1450 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1451 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1452 | OK); | 
|  | 1453 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1454 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1455 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1456 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Ram Mohan | fd7bb54 | 2023-05-20 00:55:56 +0530 | [diff] [blame] | 1457 | } | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1458 | // encode with luma and chroma stride set but no chroma ptr | 
|  | 1459 | { | 
|  | 1460 | UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1461 | ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut)); | 
|  | 1462 | ASSERT_TRUE(rawImg2.setImageStride(kImageWidth, kImageWidth + 38)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1463 | ASSERT_TRUE(rawImg2.allocateMemory()); | 
|  | 1464 | ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName)); | 
|  | 1465 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1466 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1467 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(), | 
|  | 1468 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1469 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1470 | OK); | 
|  | 1471 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1472 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1473 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1474 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1475 | } | 
| Ram Mohan | fd7bb54 | 2023-05-20 00:55:56 +0530 | [diff] [blame] | 1476 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1477 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1478 | #ifdef DUMP_OUTPUT | 
|  | 1479 | if (!writeFile("encode_api0_output.jpeg", jpg1->data, jpg1->length)) { | 
|  | 1480 | std::cerr << "unable to write output file" << std::endl; | 
| Ram Mohan | fd7bb54 | 2023-05-20 00:55:56 +0530 | [diff] [blame] | 1481 | } | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1482 | #endif | 
| Ram Mohan | fd7bb54 | 2023-05-20 00:55:56 +0530 | [diff] [blame] | 1483 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1484 | ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api0_output.rgb")); | 
| Ram Mohan | fd7bb54 | 2023-05-20 00:55:56 +0530 | [diff] [blame] | 1485 | } | 
|  | 1486 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1487 | /* Test Encode API-1 and Decode */ | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1488 | TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI1AndDecodeTest) { | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1489 | UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1490 | ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1491 | ASSERT_TRUE(rawImgP010.allocateMemory()); | 
|  | 1492 | ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1493 | UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1494 | ASSERT_TRUE(rawImg420.setImageColorGamut(mYuv420ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1495 | ASSERT_TRUE(rawImg420.allocateMemory()); | 
|  | 1496 | ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName)); | 
|  | 1497 | UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight); | 
|  | 1498 | ASSERT_TRUE(jpgImg.allocateMemory()); | 
|  | 1499 | JpegR uHdrLib; | 
|  | 1500 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg420.getImageHandle(), | 
|  | 1501 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1502 | jpgImg.getImageHandle(), kQuality, nullptr), | 
|  | 1503 | OK); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1504 | // encode with luma stride set p010 | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1505 | { | 
|  | 1506 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1507 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1508 | ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0)); | 
|  | 1509 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1510 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1511 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1512 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1513 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), | 
|  | 1514 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1515 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1516 | OK); | 
|  | 1517 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1518 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1519 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1520 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | c3437ca | 2023-01-04 14:00:08 -0800 | [diff] [blame] | 1521 | } | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1522 | // encode with luma and chroma stride set p010 | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1523 | { | 
|  | 1524 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1525 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1526 | ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256)); | 
|  | 1527 | ASSERT_TRUE(rawImg2P010.setChromaMode(false)); | 
|  | 1528 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1529 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1530 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1531 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1532 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), | 
|  | 1533 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1534 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1535 | OK); | 
|  | 1536 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1537 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1538 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1539 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | c3437ca | 2023-01-04 14:00:08 -0800 | [diff] [blame] | 1540 | } | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1541 | // encode with chroma stride set p010 | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1542 | { | 
|  | 1543 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1544 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1545 | ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64)); | 
|  | 1546 | ASSERT_TRUE(rawImg2P010.setChromaMode(false)); | 
|  | 1547 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1548 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1549 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1550 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1551 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), | 
|  | 1552 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1553 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1554 | OK); | 
|  | 1555 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1556 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1557 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1558 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | c3437ca | 2023-01-04 14:00:08 -0800 | [diff] [blame] | 1559 | } | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1560 | // encode with luma and chroma stride set but no chroma ptr p010 | 
|  | 1561 | { | 
|  | 1562 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1563 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1564 | ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 64, kImageWidth + 256)); | 
|  | 1565 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1566 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1567 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1568 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1569 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), | 
|  | 1570 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1571 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1572 | OK); | 
|  | 1573 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1574 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1575 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1576 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1577 | } | 
|  | 1578 | // encode with luma stride set 420 | 
|  | 1579 | { | 
|  | 1580 | UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1581 | ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut)); | 
|  | 1582 | ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 14, 0)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1583 | ASSERT_TRUE(rawImg2420.allocateMemory()); | 
|  | 1584 | ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName)); | 
|  | 1585 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1586 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1587 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), | 
|  | 1588 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1589 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1590 | OK); | 
|  | 1591 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1592 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1593 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1594 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1595 | } | 
|  | 1596 | // encode with luma and chroma stride set 420 | 
|  | 1597 | { | 
|  | 1598 | UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1599 | ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut)); | 
|  | 1600 | ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 46, kImageWidth / 2 + 34)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1601 | ASSERT_TRUE(rawImg2420.setChromaMode(false)); | 
|  | 1602 | ASSERT_TRUE(rawImg2420.allocateMemory()); | 
|  | 1603 | ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName)); | 
|  | 1604 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1605 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1606 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), | 
|  | 1607 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1608 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1609 | OK); | 
|  | 1610 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1611 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1612 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1613 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1614 | } | 
|  | 1615 | // encode with chroma stride set 420 | 
|  | 1616 | { | 
|  | 1617 | UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1618 | ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut)); | 
|  | 1619 | ASSERT_TRUE(rawImg2420.setImageStride(0, kImageWidth / 2 + 38)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1620 | ASSERT_TRUE(rawImg2420.setChromaMode(false)); | 
|  | 1621 | ASSERT_TRUE(rawImg2420.allocateMemory()); | 
|  | 1622 | ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName)); | 
|  | 1623 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1624 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1625 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), | 
|  | 1626 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1627 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1628 | OK); | 
|  | 1629 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1630 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1631 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1632 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1633 | } | 
|  | 1634 | // encode with luma and chroma stride set but no chroma ptr 420 | 
|  | 1635 | { | 
|  | 1636 | UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1637 | ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut)); | 
|  | 1638 | ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 26, kImageWidth / 2 + 44)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1639 | ASSERT_TRUE(rawImg2420.allocateMemory()); | 
|  | 1640 | ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName)); | 
|  | 1641 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1642 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1643 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), | 
|  | 1644 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1645 | jpgImg2.getImageHandle(), kQuality, nullptr), | 
|  | 1646 | OK); | 
|  | 1647 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1648 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1649 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1650 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1651 | } | 
| Dichen Zhang | c3437ca | 2023-01-04 14:00:08 -0800 | [diff] [blame] | 1652 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1653 | auto jpg1 = jpgImg.getImageHandle(); | 
| Dichen Zhang | c3437ca | 2023-01-04 14:00:08 -0800 | [diff] [blame] | 1654 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1655 | #ifdef DUMP_OUTPUT | 
|  | 1656 | if (!writeFile("encode_api1_output.jpeg", jpg1->data, jpg1->length)) { | 
|  | 1657 | std::cerr << "unable to write output file" << std::endl; | 
|  | 1658 | } | 
|  | 1659 | #endif | 
|  | 1660 |  | 
|  | 1661 | ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api1_output.rgb")); | 
| Dichen Zhang | c3437ca | 2023-01-04 14:00:08 -0800 | [diff] [blame] | 1662 | } | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1663 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1664 | /* Test Encode API-2 and Decode */ | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1665 | TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI2AndDecodeTest) { | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1666 | UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1667 | ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1668 | ASSERT_TRUE(rawImgP010.allocateMemory()); | 
|  | 1669 | ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1670 | UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1671 | ASSERT_TRUE(rawImg420.setImageColorGamut(mYuv420ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1672 | ASSERT_TRUE(rawImg420.allocateMemory()); | 
|  | 1673 | ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName)); | 
|  | 1674 | UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight); | 
|  | 1675 | ASSERT_TRUE(jpgImg.allocateMemory()); | 
|  | 1676 | UhdrCompressedStructWrapper jpgSdr(kImageWidth, kImageHeight); | 
|  | 1677 | ASSERT_TRUE(jpgSdr.allocateMemory()); | 
|  | 1678 | auto sdr = jpgSdr.getImageHandle(); | 
|  | 1679 | ASSERT_TRUE(readFile(kSdrJpgFileName, sdr->data, sdr->maxLength, sdr->length)); | 
|  | 1680 | JpegR uHdrLib; | 
|  | 1681 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg420.getImageHandle(), sdr, | 
|  | 1682 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1683 | jpgImg.getImageHandle()), | 
|  | 1684 | OK); | 
|  | 1685 | // encode with luma stride set | 
|  | 1686 | { | 
|  | 1687 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1688 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1689 | ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0)); | 
|  | 1690 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1691 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1692 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1693 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1694 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr, | 
|  | 1695 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1696 | jpgImg2.getImageHandle()), | 
|  | 1697 | OK); | 
|  | 1698 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1699 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1700 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1701 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | 66ca6e3 | 2023-04-05 12:22:54 -0700 | [diff] [blame] | 1702 | } | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1703 | // encode with luma and chroma stride set | 
|  | 1704 | { | 
|  | 1705 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1706 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1707 | ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256)); | 
|  | 1708 | ASSERT_TRUE(rawImg2P010.setChromaMode(false)); | 
|  | 1709 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1710 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1711 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1712 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1713 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr, | 
|  | 1714 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1715 | jpgImg2.getImageHandle()), | 
|  | 1716 | OK); | 
|  | 1717 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1718 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1719 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1720 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | 66ca6e3 | 2023-04-05 12:22:54 -0700 | [diff] [blame] | 1721 | } | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1722 | // encode with chroma stride set | 
|  | 1723 | { | 
|  | 1724 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1725 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1726 | ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64)); | 
|  | 1727 | ASSERT_TRUE(rawImg2P010.setChromaMode(false)); | 
|  | 1728 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1729 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1730 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1731 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1732 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr, | 
|  | 1733 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1734 | jpgImg2.getImageHandle()), | 
|  | 1735 | OK); | 
|  | 1736 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1737 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1738 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1739 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | 66ca6e3 | 2023-04-05 12:22:54 -0700 | [diff] [blame] | 1740 | } | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1741 | // encode with luma stride set | 
|  | 1742 | { | 
|  | 1743 | UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1744 | ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1745 | ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 128, 0)); | 
|  | 1746 | ASSERT_TRUE(rawImg2420.allocateMemory()); | 
|  | 1747 | ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName)); | 
|  | 1748 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1749 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1750 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr, | 
|  | 1751 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1752 | jpgImg2.getImageHandle()), | 
|  | 1753 | OK); | 
|  | 1754 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1755 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1756 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1757 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1758 | } | 
|  | 1759 | // encode with luma and chroma stride set | 
|  | 1760 | { | 
|  | 1761 | UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1762 | ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1763 | ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 128, kImageWidth + 256)); | 
|  | 1764 | ASSERT_TRUE(rawImg2420.setChromaMode(false)); | 
|  | 1765 | ASSERT_TRUE(rawImg2420.allocateMemory()); | 
|  | 1766 | ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName)); | 
|  | 1767 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1768 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1769 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr, | 
|  | 1770 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1771 | jpgImg2.getImageHandle()), | 
|  | 1772 | OK); | 
|  | 1773 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1774 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1775 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1776 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1777 | } | 
|  | 1778 | // encode with chroma stride set | 
|  | 1779 | { | 
|  | 1780 | UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1781 | ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1782 | ASSERT_TRUE(rawImg2420.setImageStride(0, kImageWidth + 64)); | 
|  | 1783 | ASSERT_TRUE(rawImg2420.setChromaMode(false)); | 
|  | 1784 | ASSERT_TRUE(rawImg2420.allocateMemory()); | 
|  | 1785 | ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName)); | 
|  | 1786 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1787 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1788 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr, | 
|  | 1789 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1790 | jpgImg2.getImageHandle()), | 
|  | 1791 | OK); | 
|  | 1792 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1793 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1794 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1795 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1796 | } | 
| Dichen Zhang | 66ca6e3 | 2023-04-05 12:22:54 -0700 | [diff] [blame] | 1797 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1798 | auto jpg1 = jpgImg.getImageHandle(); | 
| Dichen Zhang | 66ca6e3 | 2023-04-05 12:22:54 -0700 | [diff] [blame] | 1799 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1800 | #ifdef DUMP_OUTPUT | 
|  | 1801 | if (!writeFile("encode_api2_output.jpeg", jpg1->data, jpg1->length)) { | 
|  | 1802 | std::cerr << "unable to write output file" << std::endl; | 
|  | 1803 | } | 
|  | 1804 | #endif | 
|  | 1805 |  | 
|  | 1806 | ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api2_output.rgb")); | 
| Dichen Zhang | 66ca6e3 | 2023-04-05 12:22:54 -0700 | [diff] [blame] | 1807 | } | 
|  | 1808 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1809 | /* Test Encode API-3 and Decode */ | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1810 | TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI3AndDecodeTest) { | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1811 | UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1812 | ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1813 | ASSERT_TRUE(rawImgP010.allocateMemory()); | 
|  | 1814 | ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1815 | UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight); | 
|  | 1816 | ASSERT_TRUE(jpgImg.allocateMemory()); | 
|  | 1817 | UhdrCompressedStructWrapper jpgSdr(kImageWidth, kImageHeight); | 
|  | 1818 | ASSERT_TRUE(jpgSdr.allocateMemory()); | 
|  | 1819 | auto sdr = jpgSdr.getImageHandle(); | 
|  | 1820 | ASSERT_TRUE(readFile(kSdrJpgFileName, sdr->data, sdr->maxLength, sdr->length)); | 
|  | 1821 | JpegR uHdrLib; | 
|  | 1822 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), sdr, | 
|  | 1823 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1824 | jpgImg.getImageHandle()), | 
|  | 1825 | OK); | 
|  | 1826 | // encode with luma stride set | 
|  | 1827 | { | 
|  | 1828 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1829 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1830 | ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0)); | 
|  | 1831 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1832 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1833 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1834 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1835 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr, | 
|  | 1836 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1837 | jpgImg2.getImageHandle()), | 
|  | 1838 | OK); | 
|  | 1839 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1840 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1841 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1842 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | 5444438 | 2022-12-07 20:57:49 +0000 | [diff] [blame] | 1843 | } | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1844 | // encode with luma and chroma stride set | 
|  | 1845 | { | 
|  | 1846 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1847 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1848 | ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256)); | 
|  | 1849 | ASSERT_TRUE(rawImg2P010.setChromaMode(false)); | 
|  | 1850 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1851 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1852 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1853 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1854 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr, | 
|  | 1855 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1856 | jpgImg2.getImageHandle()), | 
|  | 1857 | OK); | 
|  | 1858 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1859 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1860 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1861 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1862 | } | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1863 | // encode with chroma stride set | 
|  | 1864 | { | 
|  | 1865 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1866 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1867 | ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64)); | 
|  | 1868 | ASSERT_TRUE(rawImg2P010.setChromaMode(false)); | 
|  | 1869 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1870 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1871 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1872 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1873 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr, | 
|  | 1874 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1875 | jpgImg2.getImageHandle()), | 
|  | 1876 | OK); | 
|  | 1877 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1878 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1879 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1880 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
| Dichen Zhang | 5444438 | 2022-12-07 20:57:49 +0000 | [diff] [blame] | 1881 | } | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1882 | // encode with luma and chroma stride set and no chroma ptr | 
|  | 1883 | { | 
|  | 1884 | UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010); | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1885 | ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut)); | 
| Ram Mohan | 43c3a80 | 2023-07-24 18:33:49 +0530 | [diff] [blame] | 1886 | ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 32, kImageWidth + 256)); | 
|  | 1887 | ASSERT_TRUE(rawImg2P010.allocateMemory()); | 
|  | 1888 | ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1889 | UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight); | 
|  | 1890 | ASSERT_TRUE(jpgImg2.allocateMemory()); | 
|  | 1891 | ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr, | 
|  | 1892 | ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1893 | jpgImg2.getImageHandle()), | 
|  | 1894 | OK); | 
|  | 1895 | auto jpg1 = jpgImg.getImageHandle(); | 
|  | 1896 | auto jpg2 = jpgImg2.getImageHandle(); | 
|  | 1897 | ASSERT_EQ(jpg1->length, jpg2->length); | 
|  | 1898 | ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length)); | 
|  | 1899 | } | 
| Dichen Zhang | 5444438 | 2022-12-07 20:57:49 +0000 | [diff] [blame] | 1900 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1901 | auto jpg1 = jpgImg.getImageHandle(); | 
| Dichen Zhang | 5444438 | 2022-12-07 20:57:49 +0000 | [diff] [blame] | 1902 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1903 | #ifdef DUMP_OUTPUT | 
|  | 1904 | if (!writeFile("encode_api3_output.jpeg", jpg1->data, jpg1->length)) { | 
|  | 1905 | std::cerr << "unable to write output file" << std::endl; | 
|  | 1906 | } | 
|  | 1907 | #endif | 
|  | 1908 |  | 
|  | 1909 | ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api3_output.rgb")); | 
| Dichen Zhang | 5444438 | 2022-12-07 20:57:49 +0000 | [diff] [blame] | 1910 | } | 
|  | 1911 |  | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1912 | INSTANTIATE_TEST_SUITE_P( | 
|  | 1913 | JpegRAPIParameterizedTests, JpegRAPIEncodeAndDecodeTest, | 
|  | 1914 | ::testing::Combine(::testing::Values(ULTRAHDR_COLORGAMUT_BT709, ULTRAHDR_COLORGAMUT_P3, | 
|  | 1915 | ULTRAHDR_COLORGAMUT_BT2100), | 
|  | 1916 | ::testing::Values(ULTRAHDR_COLORGAMUT_BT709, ULTRAHDR_COLORGAMUT_P3, | 
|  | 1917 | ULTRAHDR_COLORGAMUT_BT2100))); | 
|  | 1918 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1919 | // ============================================================================ | 
|  | 1920 | // Profiling | 
|  | 1921 | // ============================================================================ | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1922 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1923 | class Profiler { | 
|  | 1924 | public: | 
|  | 1925 | void timerStart() { gettimeofday(&mStartingTime, nullptr); } | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1926 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1927 | void timerStop() { gettimeofday(&mEndingTime, nullptr); } | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1928 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1929 | int64_t elapsedTime() { | 
|  | 1930 | struct timeval elapsedMicroseconds; | 
|  | 1931 | elapsedMicroseconds.tv_sec = mEndingTime.tv_sec - mStartingTime.tv_sec; | 
|  | 1932 | elapsedMicroseconds.tv_usec = mEndingTime.tv_usec - mStartingTime.tv_usec; | 
|  | 1933 | return elapsedMicroseconds.tv_sec * 1000000 + elapsedMicroseconds.tv_usec; | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1934 | } | 
|  | 1935 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1936 | private: | 
|  | 1937 | struct timeval mStartingTime; | 
|  | 1938 | struct timeval mEndingTime; | 
|  | 1939 | }; | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1940 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1941 | class JpegRBenchmark : public JpegR { | 
|  | 1942 | public: | 
|  | 1943 | void BenchmarkGenerateGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr p010Image, | 
|  | 1944 | ultrahdr_metadata_ptr metadata, jr_uncompressed_ptr map); | 
|  | 1945 | void BenchmarkApplyGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr map, | 
|  | 1946 | ultrahdr_metadata_ptr metadata, jr_uncompressed_ptr dest); | 
|  | 1947 |  | 
|  | 1948 | private: | 
|  | 1949 | const int kProfileCount = 10; | 
|  | 1950 | }; | 
|  | 1951 |  | 
|  | 1952 | void JpegRBenchmark::BenchmarkGenerateGainMap(jr_uncompressed_ptr yuv420Image, | 
|  | 1953 | jr_uncompressed_ptr p010Image, | 
|  | 1954 | ultrahdr_metadata_ptr metadata, | 
|  | 1955 | jr_uncompressed_ptr map) { | 
|  | 1956 | ASSERT_EQ(yuv420Image->width, p010Image->width); | 
|  | 1957 | ASSERT_EQ(yuv420Image->height, p010Image->height); | 
|  | 1958 | Profiler profileGenerateMap; | 
|  | 1959 | profileGenerateMap.timerStart(); | 
|  | 1960 | for (auto i = 0; i < kProfileCount; i++) { | 
|  | 1961 | ASSERT_EQ(OK, | 
|  | 1962 | generateGainMap(yuv420Image, p010Image, ultrahdr_transfer_function::ULTRAHDR_TF_HLG, | 
|  | 1963 | metadata, map)); | 
|  | 1964 | if (i != kProfileCount - 1) delete[] static_cast<uint8_t*>(map->data); | 
|  | 1965 | } | 
|  | 1966 | profileGenerateMap.timerStop(); | 
|  | 1967 | ALOGE("Generate Gain Map:- Res = %i x %i, time = %f ms", yuv420Image->width, yuv420Image->height, | 
|  | 1968 | profileGenerateMap.elapsedTime() / (kProfileCount * 1000.f)); | 
| Dichen Zhang | 7e3ed12 | 2022-12-14 22:05:01 +0000 | [diff] [blame] | 1969 | } | 
|  | 1970 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1971 | void JpegRBenchmark::BenchmarkApplyGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr map, | 
|  | 1972 | ultrahdr_metadata_ptr metadata, | 
|  | 1973 | jr_uncompressed_ptr dest) { | 
|  | 1974 | Profiler profileRecMap; | 
|  | 1975 | profileRecMap.timerStart(); | 
|  | 1976 | for (auto i = 0; i < kProfileCount; i++) { | 
|  | 1977 | ASSERT_EQ(OK, | 
|  | 1978 | applyGainMap(yuv420Image, map, metadata, ULTRAHDR_OUTPUT_HDR_HLG, | 
|  | 1979 | metadata->maxContentBoost /* displayBoost */, dest)); | 
| Dichen Zhang | 36c1e73 | 2022-11-23 01:25:34 +0000 | [diff] [blame] | 1980 | } | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1981 | profileRecMap.timerStop(); | 
|  | 1982 | ALOGE("Apply Gain Map:- Res = %i x %i, time = %f ms", yuv420Image->width, yuv420Image->height, | 
|  | 1983 | profileRecMap.elapsedTime() / (kProfileCount * 1000.f)); | 
| Dichen Zhang | 36c1e73 | 2022-11-23 01:25:34 +0000 | [diff] [blame] | 1984 | } | 
|  | 1985 |  | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 1986 | TEST(JpegRTest, ProfileGainMapFuncs) { | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 1987 | UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010); | 
|  | 1988 | ASSERT_TRUE(rawImgP010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100)); | 
|  | 1989 | ASSERT_TRUE(rawImgP010.allocateMemory()); | 
|  | 1990 | ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName)); | 
|  | 1991 | UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420); | 
|  | 1992 | ASSERT_TRUE(rawImg420.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709)); | 
|  | 1993 | ASSERT_TRUE(rawImg420.allocateMemory()); | 
|  | 1994 | ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName)); | 
|  | 1995 | ultrahdr_metadata_struct metadata = {.version = "1.0"}; | 
|  | 1996 | jpegr_uncompressed_struct map = {.data = NULL, | 
|  | 1997 | .width = 0, | 
|  | 1998 | .height = 0, | 
|  | 1999 | .colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED}; | 
| Ram Mohan | eca8194 | 2023-07-29 14:41:48 +0530 | [diff] [blame] | 2000 | { | 
|  | 2001 | auto rawImg = rawImgP010.getImageHandle(); | 
|  | 2002 | if (rawImg->luma_stride == 0) rawImg->luma_stride = rawImg->width; | 
|  | 2003 | if (!rawImg->chroma_data) { | 
|  | 2004 | uint16_t* data = reinterpret_cast<uint16_t*>(rawImg->data); | 
|  | 2005 | rawImg->chroma_data = data + rawImg->luma_stride * rawImg->height; | 
|  | 2006 | rawImg->chroma_stride = rawImg->luma_stride; | 
|  | 2007 | } | 
|  | 2008 | } | 
|  | 2009 | { | 
|  | 2010 | auto rawImg = rawImg420.getImageHandle(); | 
|  | 2011 | if (rawImg->luma_stride == 0) rawImg->luma_stride = rawImg->width; | 
|  | 2012 | if (!rawImg->chroma_data) { | 
|  | 2013 | uint8_t* data = reinterpret_cast<uint8_t*>(rawImg->data); | 
|  | 2014 | rawImg->chroma_data = data + rawImg->luma_stride * rawImg->height; | 
|  | 2015 | rawImg->chroma_stride = rawImg->luma_stride / 2; | 
|  | 2016 | } | 
|  | 2017 | } | 
|  | 2018 |  | 
| Dichen Zhang | 761b52d | 2023-02-10 22:38:38 +0000 | [diff] [blame] | 2019 | JpegRBenchmark benchmark; | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 2020 | ASSERT_NO_FATAL_FAILURE(benchmark.BenchmarkGenerateGainMap(rawImg420.getImageHandle(), | 
|  | 2021 | rawImgP010.getImageHandle(), &metadata, | 
|  | 2022 | &map)); | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 2023 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 2024 | const int dstSize = kImageWidth * kImageWidth * 4; | 
|  | 2025 | auto bufferDst = std::make_unique<uint8_t[]>(dstSize); | 
|  | 2026 | jpegr_uncompressed_struct dest = {.data = bufferDst.get(), | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 2027 | .width = 0, | 
|  | 2028 | .height = 0, | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 2029 | .colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED}; | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 2030 |  | 
| Ram Mohan | 9485bc7 | 2023-07-24 14:37:05 +0530 | [diff] [blame] | 2031 | ASSERT_NO_FATAL_FAILURE( | 
|  | 2032 | benchmark.BenchmarkApplyGainMap(rawImg420.getImageHandle(), &map, &metadata, &dest)); | 
| Nick Deakin | d19e576 | 2023-02-10 15:39:08 -0500 | [diff] [blame] | 2033 | } | 
|  | 2034 |  | 
| Dichen Zhang | dbceb0e | 2023-04-14 19:03:18 +0000 | [diff] [blame] | 2035 | } // namespace android::ultrahdr |