blob: 5fa758e88dedd9a27fdca46e8a89faf8c31f1c4d [file] [log] [blame]
/*
* Copyright 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <sys/time.h>
#include <fstream>
#include <iostream>
#include <ultrahdr/gainmapmath.h>
#include <ultrahdr/jpegr.h>
#include <ultrahdr/jpegrutils.h>
#include <gtest/gtest.h>
#include <utils/Log.h>
//#define DUMP_OUTPUT
namespace android::ultrahdr {
// resources used by unit tests
const char* kYCbCrP010FileName = "/data/local/tmp/raw_p010_image.p010";
const char* kYCbCr420FileName = "/data/local/tmp/raw_yuv420_image.yuv420";
const char* kSdrJpgFileName = "/data/local/tmp/jpeg_image.jpg";
const int kImageWidth = 1280;
const int kImageHeight = 720;
const int kQuality = 90;
// Wrapper to describe the input type
typedef enum {
YCbCr_p010 = 0,
YCbCr_420 = 1,
} UhdrInputFormat;
/**
* Wrapper class for raw resource
* Sample usage:
* UhdrUnCompressedStructWrapper rawImg(width, height, YCbCr_p010);
* rawImg.setImageColorGamut(colorGamut));
* rawImg.setImageStride(strideLuma, strideChroma); // optional
* rawImg.setChromaMode(false); // optional
* rawImg.allocateMemory();
* rawImg.loadRawResource(kYCbCrP010FileName);
*/
class UhdrUnCompressedStructWrapper {
public:
UhdrUnCompressedStructWrapper(uint32_t width, uint32_t height, UhdrInputFormat format);
~UhdrUnCompressedStructWrapper() = default;
bool setChromaMode(bool isChromaContiguous);
bool setImageStride(int lumaStride, int chromaStride);
bool setImageColorGamut(ultrahdr_color_gamut colorGamut);
bool allocateMemory();
bool loadRawResource(const char* fileName);
jr_uncompressed_ptr getImageHandle();
private:
std::unique_ptr<uint8_t[]> mLumaData;
std::unique_ptr<uint8_t[]> mChromaData;
jpegr_uncompressed_struct mImg;
UhdrInputFormat mFormat;
bool mIsChromaContiguous;
};
/**
* Wrapper class for compressed resource
* Sample usage:
* UhdrCompressedStructWrapper jpgImg(width, height);
* rawImg.allocateMemory();
*/
class UhdrCompressedStructWrapper {
public:
UhdrCompressedStructWrapper(uint32_t width, uint32_t height);
~UhdrCompressedStructWrapper() = default;
bool allocateMemory();
jr_compressed_ptr getImageHandle();
private:
std::unique_ptr<uint8_t[]> mData;
jpegr_compressed_struct mImg{};
uint32_t mWidth;
uint32_t mHeight;
};
UhdrUnCompressedStructWrapper::UhdrUnCompressedStructWrapper(uint32_t width, uint32_t height,
UhdrInputFormat format) {
mImg.data = nullptr;
mImg.width = width;
mImg.height = height;
mImg.colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED;
mImg.chroma_data = nullptr;
mImg.luma_stride = 0;
mImg.chroma_stride = 0;
mFormat = format;
mIsChromaContiguous = true;
}
bool UhdrUnCompressedStructWrapper::setChromaMode(bool isChromaContiguous) {
if (mLumaData.get() != nullptr) {
std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
return false;
}
mIsChromaContiguous = isChromaContiguous;
return true;
}
bool UhdrUnCompressedStructWrapper::setImageStride(int lumaStride, int chromaStride) {
if (mLumaData.get() != nullptr) {
std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
return false;
}
if (lumaStride != 0) {
if (lumaStride < mImg.width) {
std::cerr << "Bad luma stride received" << std::endl;
return false;
}
mImg.luma_stride = lumaStride;
}
if (chromaStride != 0) {
if (mFormat == YCbCr_p010 && chromaStride < mImg.width) {
std::cerr << "Bad chroma stride received for format YCbCrP010" << std::endl;
return false;
}
if (mFormat == YCbCr_420 && chromaStride < (mImg.width >> 1)) {
std::cerr << "Bad chroma stride received for format YCbCr420" << std::endl;
return false;
}
mImg.chroma_stride = chromaStride;
}
return true;
}
bool UhdrUnCompressedStructWrapper::setImageColorGamut(ultrahdr_color_gamut colorGamut) {
if (mLumaData.get() != nullptr) {
std::cerr << "Object has sailed, no further modifications are allowed" << std::endl;
return false;
}
mImg.colorGamut = colorGamut;
return true;
}
bool UhdrUnCompressedStructWrapper::allocateMemory() {
if (mImg.width == 0 || (mImg.width % 2 != 0) || mImg.height == 0 || (mImg.height % 2 != 0) ||
(mFormat != YCbCr_p010 && mFormat != YCbCr_420)) {
std::cerr << "Object in bad state, mem alloc failed" << std::endl;
return false;
}
int lumaStride = mImg.luma_stride == 0 ? mImg.width : mImg.luma_stride;
int lumaSize = lumaStride * mImg.height * (mFormat == YCbCr_p010 ? 2 : 1);
int chromaSize = (mImg.height >> 1) * (mFormat == YCbCr_p010 ? 2 : 1);
if (mIsChromaContiguous) {
chromaSize *= lumaStride;
} else {
if (mImg.chroma_stride == 0) {
std::cerr << "Object in bad state, mem alloc failed" << std::endl;
return false;
}
if (mFormat == YCbCr_p010) {
chromaSize *= mImg.chroma_stride;
} else {
chromaSize *= (mImg.chroma_stride * 2);
}
}
if (mIsChromaContiguous) {
mLumaData = std::make_unique<uint8_t[]>(lumaSize + chromaSize);
mImg.data = mLumaData.get();
mImg.chroma_data = nullptr;
} else {
mLumaData = std::make_unique<uint8_t[]>(lumaSize);
mImg.data = mLumaData.get();
mChromaData = std::make_unique<uint8_t[]>(chromaSize);
mImg.chroma_data = mChromaData.get();
}
return true;
}
bool UhdrUnCompressedStructWrapper::loadRawResource(const char* fileName) {
if (!mImg.data) {
std::cerr << "memory is not allocated, read not possible" << std::endl;
return false;
}
std::ifstream ifd(fileName, std::ios::binary | std::ios::ate);
if (ifd.good()) {
int bpp = mFormat == YCbCr_p010 ? 2 : 1;
int size = ifd.tellg();
int length = mImg.width * mImg.height * bpp * 3 / 2; // 2x2 subsampling
if (size < length) {
std::cerr << "requested to read " << length << " bytes from file : " << fileName
<< ", file contains only " << length << " bytes" << std::endl;
return false;
}
ifd.seekg(0, std::ios::beg);
int lumaStride = mImg.luma_stride == 0 ? mImg.width : mImg.luma_stride;
char* mem = static_cast<char*>(mImg.data);
for (int i = 0; i < mImg.height; i++) {
ifd.read(mem, mImg.width * bpp);
mem += lumaStride * bpp;
}
if (!mIsChromaContiguous) {
mem = static_cast<char*>(mImg.chroma_data);
}
int chromaStride;
if (mIsChromaContiguous) {
chromaStride = mFormat == YCbCr_p010 ? lumaStride : lumaStride / 2;
} else {
if (mFormat == YCbCr_p010) {
chromaStride = mImg.chroma_stride == 0 ? lumaStride : mImg.chroma_stride;
} else {
chromaStride = mImg.chroma_stride == 0 ? (lumaStride / 2) : mImg.chroma_stride;
}
}
if (mFormat == YCbCr_p010) {
for (int i = 0; i < mImg.height / 2; i++) {
ifd.read(mem, mImg.width * 2);
mem += chromaStride * 2;
}
} else {
for (int i = 0; i < mImg.height / 2; i++) {
ifd.read(mem, (mImg.width / 2));
mem += chromaStride;
}
for (int i = 0; i < mImg.height / 2; i++) {
ifd.read(mem, (mImg.width / 2));
mem += chromaStride;
}
}
return true;
}
std::cerr << "unable to open file : " << fileName << std::endl;
return false;
}
jr_uncompressed_ptr UhdrUnCompressedStructWrapper::getImageHandle() {
return &mImg;
}
UhdrCompressedStructWrapper::UhdrCompressedStructWrapper(uint32_t width, uint32_t height) {
mWidth = width;
mHeight = height;
}
bool UhdrCompressedStructWrapper::allocateMemory() {
if (mWidth == 0 || (mWidth % 2 != 0) || mHeight == 0 || (mHeight % 2 != 0)) {
std::cerr << "Object in bad state, mem alloc failed" << std::endl;
return false;
}
int maxLength = std::max(8 * 1024 /* min size 8kb */, (int)(mWidth * mHeight * 3 * 2));
mData = std::make_unique<uint8_t[]>(maxLength);
mImg.data = mData.get();
mImg.length = 0;
mImg.maxLength = maxLength;
return true;
}
jr_compressed_ptr UhdrCompressedStructWrapper::getImageHandle() {
return &mImg;
}
static bool writeFile(const char* filename, void*& result, int length) {
std::ofstream ofd(filename, std::ios::binary);
if (ofd.is_open()) {
ofd.write(static_cast<char*>(result), length);
return true;
}
std::cerr << "unable to write to file : " << filename << std::endl;
return false;
}
static bool readFile(const char* fileName, void*& result, int maxLength, int& length) {
std::ifstream ifd(fileName, std::ios::binary | std::ios::ate);
if (ifd.good()) {
length = ifd.tellg();
if (length > maxLength) {
std::cerr << "not enough space to read file" << std::endl;
return false;
}
ifd.seekg(0, std::ios::beg);
ifd.read(static_cast<char*>(result), length);
return true;
}
std::cerr << "unable to read file : " << fileName << std::endl;
return false;
}
void decodeJpegRImg(jr_compressed_ptr img, [[maybe_unused]] const char* outFileName) {
std::vector<uint8_t> iccData(0);
std::vector<uint8_t> exifData(0);
jpegr_info_struct info{0, 0, &iccData, &exifData};
JpegR jpegHdr;
ASSERT_EQ(OK, jpegHdr.getJPEGRInfo(img, &info));
ASSERT_EQ(kImageWidth, info.width);
ASSERT_EQ(kImageHeight, info.height);
size_t outSize = info.width * info.height * 8;
std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t[]>(outSize);
jpegr_uncompressed_struct destImage{};
destImage.data = data.get();
ASSERT_EQ(OK, jpegHdr.decodeJPEGR(img, &destImage));
ASSERT_EQ(kImageWidth, destImage.width);
ASSERT_EQ(kImageHeight, destImage.height);
#ifdef DUMP_OUTPUT
if (!writeFile(outFileName, destImage.data, outSize)) {
std::cerr << "unable to write output file" << std::endl;
}
#endif
}
// ============================================================================
// Unit Tests
// ============================================================================
// Test Encode API-0 invalid arguments
TEST(JpegRTest, EncodeAPI0WithInvalidArgs) {
JpegR uHdrLib;
UhdrCompressedStructWrapper jpgImg(16, 16);
ASSERT_TRUE(jpgImg.allocateMemory());
// test quality factor and transfer function
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), -1, nullptr),
OK)
<< "fail, API allows bad jpeg quality factor";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), 101, nullptr),
OK)
<< "fail, API allows bad jpeg quality factor";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad hdr transfer function";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
static_cast<ultrahdr_transfer_function>(
ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad hdr transfer function";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
static_cast<ultrahdr_transfer_function>(-10),
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad hdr transfer function";
}
// test dest
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr, kQuality,
nullptr),
OK)
<< "fail, API allows nullptr dest";
UhdrCompressedStructWrapper jpgImg2(16, 16);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows nullptr dest";
}
// test p010 input
{
ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows nullptr p010 image";
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows nullptr p010 image";
}
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad p010 color gamut";
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg2.setImageColorGamut(
static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1)));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad p010 color gamut";
}
{
const int kWidth = 32, kHeight = 32;
UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
auto rawImgP010 = rawImg.getImageHandle();
rawImgP010->width = kWidth - 1;
rawImgP010->height = kHeight;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image width";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight - 1;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image height";
rawImgP010->width = 0;
rawImgP010->height = kHeight;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image width";
rawImgP010->width = kWidth;
rawImgP010->height = 0;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image height";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->luma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad luma stride";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->luma_stride = kWidth + 64;
rawImgP010->chroma_data = rawImgP010->data;
rawImgP010->chroma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad chroma stride";
}
}
/* Test Encode API-1 invalid arguments */
TEST(JpegRTest, EncodeAPI1WithInvalidArgs) {
JpegR uHdrLib;
UhdrCompressedStructWrapper jpgImg(16, 16);
ASSERT_TRUE(jpgImg.allocateMemory());
// test quality factor and transfer function
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), -1, nullptr),
OK)
<< "fail, API allows bad jpeg quality factor";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), 101, nullptr),
OK)
<< "fail, API allows bad jpeg quality factor";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad hdr transfer function";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
static_cast<ultrahdr_transfer_function>(
ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad hdr transfer function";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
static_cast<ultrahdr_transfer_function>(-10),
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad hdr transfer function";
}
// test dest
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr, kQuality,
nullptr),
OK)
<< "fail, API allows nullptr dest";
UhdrCompressedStructWrapper jpgImg2(16, 16);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows nullptr dest";
}
// test p010 input
{
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows nullptr p010 image";
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows nullptr p010 image";
}
{
const int kWidth = 32, kHeight = 32;
UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
auto rawImgP010 = rawImg.getImageHandle();
UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
auto rawImg420 = rawImg2.getImageHandle();
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad p010 color gamut";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->colorGamut =
static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad p010 color gamut";
rawImgP010->width = kWidth - 1;
rawImgP010->height = kHeight;
rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image width";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight - 1;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image height";
rawImgP010->width = 0;
rawImgP010->height = kHeight;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image width";
rawImgP010->width = kWidth;
rawImgP010->height = 0;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image height";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->luma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad luma stride";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->luma_stride = kWidth + 64;
rawImgP010->chroma_data = rawImgP010->data;
rawImgP010->chroma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad chroma stride";
}
// test 420 input
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows nullptr 420 image";
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows nullptr 420 image";
}
{
const int kWidth = 32, kHeight = 32;
UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
auto rawImgP010 = rawImg.getImageHandle();
UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
auto rawImg420 = rawImg2.getImageHandle();
rawImg420->width = kWidth;
rawImg420->height = kHeight;
rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad 420 color gamut";
rawImg420->width = kWidth;
rawImg420->height = kHeight;
rawImg420->colorGamut =
static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad 420 color gamut";
rawImg420->width = kWidth - 1;
rawImg420->height = kHeight;
rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image width for 420";
rawImg420->width = kWidth;
rawImg420->height = kHeight - 1;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image height for 420";
rawImg420->width = 0;
rawImg420->height = kHeight;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image width for 420";
rawImg420->width = kWidth;
rawImg420->height = 0;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad image height for 420";
rawImg420->width = kWidth;
rawImg420->height = kHeight;
rawImg420->luma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad luma stride for 420";
rawImg420->width = kWidth;
rawImg420->height = kHeight;
rawImg420->luma_stride = 0;
rawImg420->chroma_data = rawImgP010->data;
rawImg420->chroma_stride = kWidth / 2 - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK)
<< "fail, API allows bad chroma stride for 420";
}
}
/* Test Encode API-2 invalid arguments */
TEST(JpegRTest, EncodeAPI2WithInvalidArgs) {
JpegR uHdrLib;
UhdrCompressedStructWrapper jpgImg(16, 16);
ASSERT_TRUE(jpgImg.allocateMemory());
// test quality factor and transfer function
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad hdr transfer function";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
jpgImg.getImageHandle(),
static_cast<ultrahdr_transfer_function>(
ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad hdr transfer function";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
jpgImg.getImageHandle(),
static_cast<ultrahdr_transfer_function>(-10),
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad hdr transfer function";
}
// test dest
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr),
OK)
<< "fail, API allows nullptr dest";
UhdrCompressedStructWrapper jpgImg2(16, 16);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK)
<< "fail, API allows nullptr dest";
}
// test compressed image
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(), nullptr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr for compressed image";
UhdrCompressedStructWrapper jpgImg2(16, 16);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
jpgImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr for compressed image";
}
// test p010 input
{
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, rawImg2.getImageHandle(), jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr p010 image";
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr p010 image";
}
{
const int kWidth = 32, kHeight = 32;
UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
auto rawImgP010 = rawImg.getImageHandle();
UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
auto rawImg420 = rawImg2.getImageHandle();
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad p010 color gamut";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->colorGamut =
static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad p010 color gamut";
rawImgP010->width = kWidth - 1;
rawImgP010->height = kHeight;
rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image width";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight - 1;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image height";
rawImgP010->width = 0;
rawImgP010->height = kHeight;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image width";
rawImgP010->width = kWidth;
rawImgP010->height = 0;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image height";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->luma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad luma stride";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->luma_stride = kWidth + 64;
rawImgP010->chroma_data = rawImgP010->data;
rawImgP010->chroma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad chroma stride";
}
// test 420 input
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr 420 image";
UhdrUnCompressedStructWrapper rawImg2(16, 16, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), rawImg2.getImageHandle(),
jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr 420 image";
}
{
const int kWidth = 32, kHeight = 32;
UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
auto rawImgP010 = rawImg.getImageHandle();
UhdrUnCompressedStructWrapper rawImg2(kWidth, kHeight, YCbCr_420);
ASSERT_TRUE(rawImg2.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg2.allocateMemory());
auto rawImg420 = rawImg2.getImageHandle();
rawImg420->width = kWidth;
rawImg420->height = kHeight;
rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad 420 color gamut";
rawImg420->width = kWidth;
rawImg420->height = kHeight;
rawImg420->colorGamut =
static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad 420 color gamut";
rawImg420->width = kWidth - 1;
rawImg420->height = kHeight;
rawImg420->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image width for 420";
rawImg420->width = kWidth;
rawImg420->height = kHeight - 1;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image height for 420";
rawImg420->width = 0;
rawImg420->height = kHeight;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image width for 420";
rawImg420->width = kWidth;
rawImg420->height = 0;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image height for 420";
rawImg420->width = kWidth;
rawImg420->height = kHeight;
rawImg420->luma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad luma stride for 420";
rawImg420->width = kWidth;
rawImg420->height = kHeight;
rawImg420->luma_stride = 0;
rawImg420->chroma_data = rawImgP010->data;
rawImg420->chroma_stride = kWidth / 2 - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, rawImg420, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad chroma stride for 420";
}
}
/* Test Encode API-3 invalid arguments */
TEST(JpegRTest, EncodeAPI3WithInvalidArgs) {
JpegR uHdrLib;
UhdrCompressedStructWrapper jpgImg(16, 16);
ASSERT_TRUE(jpgImg.allocateMemory());
// test quality factor and transfer function
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_UNSPECIFIED,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad hdr transfer function";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
static_cast<ultrahdr_transfer_function>(
ultrahdr_transfer_function::ULTRAHDR_TF_MAX + 1),
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad hdr transfer function";
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
static_cast<ultrahdr_transfer_function>(-10),
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad hdr transfer function";
}
// test dest
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG, nullptr),
OK)
<< "fail, API allows nullptr dest";
UhdrCompressedStructWrapper jpgImg2(16, 16);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK)
<< "fail, API allows nullptr dest";
}
// test compressed image
{
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), nullptr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr for compressed image";
UhdrCompressedStructWrapper jpgImg2(16, 16);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr for compressed image";
}
// test p010 input
{
ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr p010 image";
UhdrUnCompressedStructWrapper rawImg(16, 16, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_NE(uHdrLib.encodeJPEGR(rawImg.getImageHandle(), jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr p010 image";
}
{
const int kWidth = 32, kHeight = 32;
UhdrUnCompressedStructWrapper rawImg(kWidth, kHeight, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImg.allocateMemory());
auto rawImgP010 = rawImg.getImageHandle();
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_UNSPECIFIED;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad p010 color gamut";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->colorGamut =
static_cast<ultrahdr_color_gamut>(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_MAX + 1);
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad p010 color gamut";
rawImgP010->width = kWidth - 1;
rawImgP010->height = kHeight;
rawImgP010->colorGamut = ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image width";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight - 1;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image height";
rawImgP010->width = 0;
rawImgP010->height = kHeight;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image width";
rawImgP010->width = kWidth;
rawImgP010->height = 0;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad image height";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->luma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad luma stride";
rawImgP010->width = kWidth;
rawImgP010->height = kHeight;
rawImgP010->luma_stride = kWidth + 64;
rawImgP010->chroma_data = rawImgP010->data;
rawImgP010->chroma_stride = kWidth - 2;
ASSERT_NE(uHdrLib.encodeJPEGR(rawImgP010, jpgImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad chroma stride";
}
}
/* Test Encode API-4 invalid arguments */
TEST(JpegRTest, EncodeAPI4WithInvalidArgs) {
UhdrCompressedStructWrapper jpgImg(16, 16);
ASSERT_TRUE(jpgImg.allocateMemory());
UhdrCompressedStructWrapper jpgImg2(16, 16);
JpegR uHdrLib;
// test dest
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), nullptr, nullptr),
OK)
<< "fail, API allows nullptr dest";
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), nullptr,
jpgImg2.getImageHandle()),
OK)
<< "fail, API allows nullptr dest";
// test primary image
ASSERT_NE(uHdrLib.encodeJPEGR(nullptr, jpgImg.getImageHandle(), nullptr, jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr primary image";
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg2.getImageHandle(), jpgImg.getImageHandle(), nullptr,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr primary image";
// test gain map
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), nullptr, nullptr, jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr gain map image";
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg2.getImageHandle(), nullptr,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows nullptr gain map image";
// test metadata
ultrahdr_metadata_struct good_metadata;
good_metadata.version = "1.0";
good_metadata.minContentBoost = 1.0f;
good_metadata.maxContentBoost = 2.0f;
good_metadata.gamma = 1.0f;
good_metadata.offsetSdr = 0.0f;
good_metadata.offsetHdr = 0.0f;
good_metadata.hdrCapacityMin = 1.0f;
good_metadata.hdrCapacityMax = 2.0f;
ultrahdr_metadata_struct metadata = good_metadata;
metadata.version = "1.1";
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad metadata version";
metadata = good_metadata;
metadata.minContentBoost = 3.0f;
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad metadata content boost";
metadata = good_metadata;
metadata.gamma = -0.1f;
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad metadata gamma";
metadata = good_metadata;
metadata.offsetSdr = -0.1f;
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad metadata offset sdr";
metadata = good_metadata;
metadata.offsetHdr = -0.1f;
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad metadata offset hdr";
metadata = good_metadata;
metadata.hdrCapacityMax = 0.5f;
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad metadata hdr capacity max";
metadata = good_metadata;
metadata.hdrCapacityMin = 0.5f;
ASSERT_NE(uHdrLib.encodeJPEGR(jpgImg.getImageHandle(), jpgImg.getImageHandle(), &metadata,
jpgImg.getImageHandle()),
OK)
<< "fail, API allows bad metadata hdr capacity min";
}
/* Test Decode API invalid arguments */
TEST(JpegRTest, DecodeAPIWithInvalidArgs) {
JpegR uHdrLib;
UhdrCompressedStructWrapper jpgImg(16, 16);
jpegr_uncompressed_struct destImage{};
size_t outSize = 16 * 16 * 8;
std::unique_ptr<uint8_t[]> data = std::make_unique<uint8_t[]>(outSize);
destImage.data = data.get();
// test jpegr image
ASSERT_NE(uHdrLib.decodeJPEGR(nullptr, &destImage), OK)
<< "fail, API allows nullptr for jpegr img";
ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage), OK)
<< "fail, API allows nullptr for jpegr img";
ASSERT_TRUE(jpgImg.allocateMemory());
// test dest image
ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), nullptr), OK)
<< "fail, API allows nullptr for dest";
destImage.data = nullptr;
ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage), OK)
<< "fail, API allows nullptr for dest";
destImage.data = data.get();
// test max display boost
ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, 0.5), OK)
<< "fail, API allows invalid max display boost";
// test output format
ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, FLT_MAX, nullptr,
static_cast<ultrahdr_output_format>(-1)),
OK)
<< "fail, API allows invalid output format";
ASSERT_NE(uHdrLib.decodeJPEGR(jpgImg.getImageHandle(), &destImage, FLT_MAX, nullptr,
static_cast<ultrahdr_output_format>(ULTRAHDR_OUTPUT_MAX + 1)),
OK)
<< "fail, API allows invalid output format";
}
TEST(JpegRTest, writeXmpThenRead) {
ultrahdr_metadata_struct metadata_expected;
metadata_expected.version = "1.0";
metadata_expected.maxContentBoost = 1.25f;
metadata_expected.minContentBoost = 0.75f;
metadata_expected.gamma = 1.0f;
metadata_expected.offsetSdr = 0.0f;
metadata_expected.offsetHdr = 0.0f;
metadata_expected.hdrCapacityMin = 1.0f;
metadata_expected.hdrCapacityMax = metadata_expected.maxContentBoost;
const std::string nameSpace = "http://ns.adobe.com/xap/1.0/\0";
const int nameSpaceLength = nameSpace.size() + 1; // need to count the null terminator
std::string xmp = generateXmpForSecondaryImage(metadata_expected);
std::vector<uint8_t> xmpData;
xmpData.reserve(nameSpaceLength + xmp.size());
xmpData.insert(xmpData.end(), reinterpret_cast<const uint8_t*>(nameSpace.c_str()),
reinterpret_cast<const uint8_t*>(nameSpace.c_str()) + nameSpaceLength);
xmpData.insert(xmpData.end(), reinterpret_cast<const uint8_t*>(xmp.c_str()),
reinterpret_cast<const uint8_t*>(xmp.c_str()) + xmp.size());
ultrahdr_metadata_struct metadata_read;
EXPECT_TRUE(getMetadataFromXMP(xmpData.data(), xmpData.size(), &metadata_read));
EXPECT_FLOAT_EQ(metadata_expected.maxContentBoost, metadata_read.maxContentBoost);
EXPECT_FLOAT_EQ(metadata_expected.minContentBoost, metadata_read.minContentBoost);
EXPECT_FLOAT_EQ(metadata_expected.gamma, metadata_read.gamma);
EXPECT_FLOAT_EQ(metadata_expected.offsetSdr, metadata_read.offsetSdr);
EXPECT_FLOAT_EQ(metadata_expected.offsetHdr, metadata_read.offsetHdr);
EXPECT_FLOAT_EQ(metadata_expected.hdrCapacityMin, metadata_read.hdrCapacityMin);
EXPECT_FLOAT_EQ(metadata_expected.hdrCapacityMax, metadata_read.hdrCapacityMax);
}
class JpegRAPIEncodeAndDecodeTest
: public ::testing::TestWithParam<std::tuple<ultrahdr_color_gamut, ultrahdr_color_gamut>> {
public:
JpegRAPIEncodeAndDecodeTest()
: mP010ColorGamut(std::get<0>(GetParam())), mYuv420ColorGamut(std::get<1>(GetParam())){};
const ultrahdr_color_gamut mP010ColorGamut;
const ultrahdr_color_gamut mYuv420ColorGamut;
};
/* Test Encode API-0 and Decode */
TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI0AndDecodeTest) {
// reference encode
UhdrUnCompressedStructWrapper rawImg(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg.allocateMemory());
ASSERT_TRUE(rawImg.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg.allocateMemory());
JpegR uHdrLib;
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK);
// encode with luma stride set
{
UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2.setImageStride(kImageWidth + 18, 0));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set
{
UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2.setImageStride(kImageWidth + 18, kImageWidth + 28));
ASSERT_TRUE(rawImg2.setChromaMode(false));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with chroma stride set
{
UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2.setImageStride(0, kImageWidth + 34));
ASSERT_TRUE(rawImg2.setChromaMode(false));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set but no chroma ptr
{
UhdrUnCompressedStructWrapper rawImg2(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2.setImageStride(kImageWidth, kImageWidth + 38));
ASSERT_TRUE(rawImg2.allocateMemory());
ASSERT_TRUE(rawImg2.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
auto jpg1 = jpgImg.getImageHandle();
#ifdef DUMP_OUTPUT
if (!writeFile("encode_api0_output.jpeg", jpg1->data, jpg1->length)) {
std::cerr << "unable to write output file" << std::endl;
}
#endif
ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api0_output.rgb"));
}
/* Test Encode API-1 and Decode */
TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI1AndDecodeTest) {
UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImgP010.allocateMemory());
ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg420.allocateMemory());
ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg.allocateMemory());
JpegR uHdrLib;
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle(), kQuality, nullptr),
OK);
// encode with luma stride set p010
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set p010
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
ASSERT_TRUE(rawImg2P010.setChromaMode(false));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with chroma stride set p010
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
ASSERT_TRUE(rawImg2P010.setChromaMode(false));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set but no chroma ptr p010
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 64, kImageWidth + 256));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma stride set 420
{
UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 14, 0));
ASSERT_TRUE(rawImg2420.allocateMemory());
ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set 420
{
UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 46, kImageWidth / 2 + 34));
ASSERT_TRUE(rawImg2420.setChromaMode(false));
ASSERT_TRUE(rawImg2420.allocateMemory());
ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with chroma stride set 420
{
UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg2420.setImageStride(0, kImageWidth / 2 + 38));
ASSERT_TRUE(rawImg2420.setChromaMode(false));
ASSERT_TRUE(rawImg2420.allocateMemory());
ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set but no chroma ptr 420
{
UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 26, kImageWidth / 2 + 44));
ASSERT_TRUE(rawImg2420.allocateMemory());
ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(),
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle(), kQuality, nullptr),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
auto jpg1 = jpgImg.getImageHandle();
#ifdef DUMP_OUTPUT
if (!writeFile("encode_api1_output.jpeg", jpg1->data, jpg1->length)) {
std::cerr << "unable to write output file" << std::endl;
}
#endif
ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api1_output.rgb"));
}
/* Test Encode API-2 and Decode */
TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI2AndDecodeTest) {
UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImgP010.allocateMemory());
ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg420.allocateMemory());
ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg.allocateMemory());
UhdrCompressedStructWrapper jpgSdr(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgSdr.allocateMemory());
auto sdr = jpgSdr.getImageHandle();
ASSERT_TRUE(readFile(kSdrJpgFileName, sdr->data, sdr->maxLength, sdr->length));
JpegR uHdrLib;
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg420.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK);
// encode with luma stride set
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
ASSERT_TRUE(rawImg2P010.setChromaMode(false));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with chroma stride set
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
ASSERT_TRUE(rawImg2P010.setChromaMode(false));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), rawImg420.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma stride set
{
UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 128, 0));
ASSERT_TRUE(rawImg2420.allocateMemory());
ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set
{
UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg2420.setImageStride(kImageWidth + 128, kImageWidth + 256));
ASSERT_TRUE(rawImg2420.setChromaMode(false));
ASSERT_TRUE(rawImg2420.allocateMemory());
ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with chroma stride set
{
UhdrUnCompressedStructWrapper rawImg2420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg2420.setImageColorGamut(mYuv420ColorGamut));
ASSERT_TRUE(rawImg2420.setImageStride(0, kImageWidth + 64));
ASSERT_TRUE(rawImg2420.setChromaMode(false));
ASSERT_TRUE(rawImg2420.allocateMemory());
ASSERT_TRUE(rawImg2420.loadRawResource(kYCbCr420FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), rawImg2420.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
auto jpg1 = jpgImg.getImageHandle();
#ifdef DUMP_OUTPUT
if (!writeFile("encode_api2_output.jpeg", jpg1->data, jpg1->length)) {
std::cerr << "unable to write output file" << std::endl;
}
#endif
ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api2_output.rgb"));
}
/* Test Encode API-3 and Decode */
TEST_P(JpegRAPIEncodeAndDecodeTest, EncodeAPI3AndDecodeTest) {
UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImgP010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImgP010.allocateMemory());
ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg.allocateMemory());
UhdrCompressedStructWrapper jpgSdr(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgSdr.allocateMemory());
auto sdr = jpgSdr.getImageHandle();
ASSERT_TRUE(readFile(kSdrJpgFileName, sdr->data, sdr->maxLength, sdr->length));
JpegR uHdrLib;
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImgP010.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg.getImageHandle()),
OK);
// encode with luma stride set
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, 0));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 128, kImageWidth + 256));
ASSERT_TRUE(rawImg2P010.setChromaMode(false));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with chroma stride set
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(0, kImageWidth + 64));
ASSERT_TRUE(rawImg2P010.setChromaMode(false));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
// encode with luma and chroma stride set and no chroma ptr
{
UhdrUnCompressedStructWrapper rawImg2P010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImg2P010.setImageColorGamut(mP010ColorGamut));
ASSERT_TRUE(rawImg2P010.setImageStride(kImageWidth + 32, kImageWidth + 256));
ASSERT_TRUE(rawImg2P010.allocateMemory());
ASSERT_TRUE(rawImg2P010.loadRawResource(kYCbCrP010FileName));
UhdrCompressedStructWrapper jpgImg2(kImageWidth, kImageHeight);
ASSERT_TRUE(jpgImg2.allocateMemory());
ASSERT_EQ(uHdrLib.encodeJPEGR(rawImg2P010.getImageHandle(), sdr,
ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
jpgImg2.getImageHandle()),
OK);
auto jpg1 = jpgImg.getImageHandle();
auto jpg2 = jpgImg2.getImageHandle();
ASSERT_EQ(jpg1->length, jpg2->length);
ASSERT_EQ(0, memcmp(jpg1->data, jpg2->data, jpg1->length));
}
auto jpg1 = jpgImg.getImageHandle();
#ifdef DUMP_OUTPUT
if (!writeFile("encode_api3_output.jpeg", jpg1->data, jpg1->length)) {
std::cerr << "unable to write output file" << std::endl;
}
#endif
ASSERT_NO_FATAL_FAILURE(decodeJpegRImg(jpg1, "decode_api3_output.rgb"));
}
INSTANTIATE_TEST_SUITE_P(
JpegRAPIParameterizedTests, JpegRAPIEncodeAndDecodeTest,
::testing::Combine(::testing::Values(ULTRAHDR_COLORGAMUT_BT709, ULTRAHDR_COLORGAMUT_P3,
ULTRAHDR_COLORGAMUT_BT2100),
::testing::Values(ULTRAHDR_COLORGAMUT_BT709, ULTRAHDR_COLORGAMUT_P3,
ULTRAHDR_COLORGAMUT_BT2100)));
// ============================================================================
// Profiling
// ============================================================================
class Profiler {
public:
void timerStart() { gettimeofday(&mStartingTime, nullptr); }
void timerStop() { gettimeofday(&mEndingTime, nullptr); }
int64_t elapsedTime() {
struct timeval elapsedMicroseconds;
elapsedMicroseconds.tv_sec = mEndingTime.tv_sec - mStartingTime.tv_sec;
elapsedMicroseconds.tv_usec = mEndingTime.tv_usec - mStartingTime.tv_usec;
return elapsedMicroseconds.tv_sec * 1000000 + elapsedMicroseconds.tv_usec;
}
private:
struct timeval mStartingTime;
struct timeval mEndingTime;
};
class JpegRBenchmark : public JpegR {
public:
void BenchmarkGenerateGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr p010Image,
ultrahdr_metadata_ptr metadata, jr_uncompressed_ptr map);
void BenchmarkApplyGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr map,
ultrahdr_metadata_ptr metadata, jr_uncompressed_ptr dest);
private:
const int kProfileCount = 10;
};
void JpegRBenchmark::BenchmarkGenerateGainMap(jr_uncompressed_ptr yuv420Image,
jr_uncompressed_ptr p010Image,
ultrahdr_metadata_ptr metadata,
jr_uncompressed_ptr map) {
ASSERT_EQ(yuv420Image->width, p010Image->width);
ASSERT_EQ(yuv420Image->height, p010Image->height);
Profiler profileGenerateMap;
profileGenerateMap.timerStart();
for (auto i = 0; i < kProfileCount; i++) {
ASSERT_EQ(OK,
generateGainMap(yuv420Image, p010Image, ultrahdr_transfer_function::ULTRAHDR_TF_HLG,
metadata, map));
if (i != kProfileCount - 1) delete[] static_cast<uint8_t*>(map->data);
}
profileGenerateMap.timerStop();
ALOGE("Generate Gain Map:- Res = %i x %i, time = %f ms", yuv420Image->width, yuv420Image->height,
profileGenerateMap.elapsedTime() / (kProfileCount * 1000.f));
}
void JpegRBenchmark::BenchmarkApplyGainMap(jr_uncompressed_ptr yuv420Image, jr_uncompressed_ptr map,
ultrahdr_metadata_ptr metadata,
jr_uncompressed_ptr dest) {
Profiler profileRecMap;
profileRecMap.timerStart();
for (auto i = 0; i < kProfileCount; i++) {
ASSERT_EQ(OK,
applyGainMap(yuv420Image, map, metadata, ULTRAHDR_OUTPUT_HDR_HLG,
metadata->maxContentBoost /* displayBoost */, dest));
}
profileRecMap.timerStop();
ALOGE("Apply Gain Map:- Res = %i x %i, time = %f ms", yuv420Image->width, yuv420Image->height,
profileRecMap.elapsedTime() / (kProfileCount * 1000.f));
}
TEST(JpegRTest, ProfileGainMapFuncs) {
UhdrUnCompressedStructWrapper rawImgP010(kImageWidth, kImageHeight, YCbCr_p010);
ASSERT_TRUE(rawImgP010.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT2100));
ASSERT_TRUE(rawImgP010.allocateMemory());
ASSERT_TRUE(rawImgP010.loadRawResource(kYCbCrP010FileName));
UhdrUnCompressedStructWrapper rawImg420(kImageWidth, kImageHeight, YCbCr_420);
ASSERT_TRUE(rawImg420.setImageColorGamut(ultrahdr_color_gamut::ULTRAHDR_COLORGAMUT_BT709));
ASSERT_TRUE(rawImg420.allocateMemory());
ASSERT_TRUE(rawImg420.loadRawResource(kYCbCr420FileName));
ultrahdr_metadata_struct metadata = {.version = "1.0"};
jpegr_uncompressed_struct map = {.data = NULL,
.width = 0,
.height = 0,
.colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED};
{
auto rawImg = rawImgP010.getImageHandle();
if (rawImg->luma_stride == 0) rawImg->luma_stride = rawImg->width;
if (!rawImg->chroma_data) {
uint16_t* data = reinterpret_cast<uint16_t*>(rawImg->data);
rawImg->chroma_data = data + rawImg->luma_stride * rawImg->height;
rawImg->chroma_stride = rawImg->luma_stride;
}
}
{
auto rawImg = rawImg420.getImageHandle();
if (rawImg->luma_stride == 0) rawImg->luma_stride = rawImg->width;
if (!rawImg->chroma_data) {
uint8_t* data = reinterpret_cast<uint8_t*>(rawImg->data);
rawImg->chroma_data = data + rawImg->luma_stride * rawImg->height;
rawImg->chroma_stride = rawImg->luma_stride / 2;
}
}
JpegRBenchmark benchmark;
ASSERT_NO_FATAL_FAILURE(benchmark.BenchmarkGenerateGainMap(rawImg420.getImageHandle(),
rawImgP010.getImageHandle(), &metadata,
&map));
const int dstSize = kImageWidth * kImageWidth * 4;
auto bufferDst = std::make_unique<uint8_t[]>(dstSize);
jpegr_uncompressed_struct dest = {.data = bufferDst.get(),
.width = 0,
.height = 0,
.colorGamut = ULTRAHDR_COLORGAMUT_UNSPECIFIED};
ASSERT_NO_FATAL_FAILURE(
benchmark.BenchmarkApplyGainMap(rawImg420.getImageHandle(), &map, &metadata, &dest));
}
} // namespace android::ultrahdr