blob: 22d3f94f8cc255ce159f104b04956cc25d015348 [file] [log] [blame]
/*
* Copyright 2023 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 <fstream>
#include <iostream>
#include <cstring>
#include <benchmark/benchmark.h>
#include "ultrahdr_api.h"
#ifdef __ANDROID__
std::string kTestImagesPath = "/sdcard/test/UltrahdrBenchmarkTestRes-1.2/";
#ifdef LOG_NDEBUG
#include "android/log.h"
#ifndef LOG_TAG
#define LOG_TAG "UHDR_BENCHMARK"
#endif
#ifndef ALOGE
#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
#else
#define ALOGE(...) ((void)0)
#endif
#else
std::string kTestImagesPath = "./data/UltrahdrBenchmarkTestRes-1.2/";
#ifdef LOG_NDEBUG
#include <cstdio>
#define ALOGE(...) \
do { \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\n"); \
} while (0)
#else
#define ALOGE(...) ((void)0)
#endif
#endif
std::vector<std::string> kDecodeAPITestImages = {
"mountains_singlechannelgainmap.jpg",
"mountains_multichannelgainmap.jpg",
"mountains_singlechannelgamma.jpg",
"mountains_multichannelgamma.jpg",
};
std::vector<std::string> kEncodeApi0TestImages12MpName = {
"mountains_rgba1010102.raw",
"mountains_rgba16F.raw",
"mountains_p010.p010",
};
std::vector<std::pair<std::string, std::string>> kEncodeApi1TestImages12MpName = {
{"mountains_rgba1010102.raw", "mountains_rgba8888.raw"},
{"mountains_rgba16F.raw", "mountains_rgba8888.raw"},
{"mountains_p010.p010", "mountains_yuv420.yuv"},
};
using TestParamsDecodeAPI = std::tuple<std::string, uhdr_color_transfer_t, uhdr_img_fmt_t, bool>;
using TestParamsEncoderAPI0 =
std::tuple<std::string, int, int, uhdr_color_gamut_t, uhdr_color_transfer_t, int, float>;
using TestParamsEncoderAPI1 =
std::tuple<std::string, std::string, int, int, uhdr_color_gamut_t, uhdr_color_transfer_t,
uhdr_color_gamut_t, int, float, uhdr_enc_preset_t>;
std::vector<TestParamsDecodeAPI> testParamsDecodeAPI;
std::vector<TestParamsEncoderAPI0> testParamsAPI0;
std::vector<TestParamsEncoderAPI1> testParamsAPI1;
std::string imgFmtToString(const uhdr_img_fmt of) {
switch (of) {
case UHDR_IMG_FMT_32bppRGBA8888:
return "rgba8888";
case UHDR_IMG_FMT_64bppRGBAHalfFloat:
return "64rgbaHalftoFloat";
case UHDR_IMG_FMT_32bppRGBA1010102:
return "rgba1010102";
default:
return "Unknown";
}
}
std::string colorGamutToString(const uhdr_color_gamut_t cg) {
switch (cg) {
case UHDR_CG_BT_709:
return "bt709";
case UHDR_CG_DISPLAY_P3:
return "p3";
case UHDR_CG_BT_2100:
return "bt2100";
default:
return "Unknown";
}
}
std::string tfToString(const uhdr_color_transfer_t of) {
switch (of) {
case UHDR_CT_LINEAR:
return "linear";
case UHDR_CT_HLG:
return "hlg";
case UHDR_CT_PQ:
return "pq";
case UHDR_CT_SRGB:
return "srgb";
default:
return "Unknown";
}
}
#define READ_BYTES(DESC, ADDR, LEN) \
DESC.read(static_cast<char*>(ADDR), (LEN)); \
if (DESC.gcount() != (LEN)) { \
ALOGE("Failed to read: %u bytes, read: %zu bytes", LEN, DESC.gcount()); \
return false; \
}
static bool loadFile(const char* filename, uhdr_raw_image_t* handle) {
std::ifstream ifd(filename, std::ios::binary);
if (ifd.good()) {
if (handle->fmt == UHDR_IMG_FMT_24bppYCbCrP010) {
const int bpp = 2;
READ_BYTES(ifd, handle->planes[UHDR_PLANE_Y], handle->w * handle->h * bpp)
READ_BYTES(ifd, handle->planes[UHDR_PLANE_UV], (handle->w / 2) * (handle->h / 2) * bpp * 2)
return true;
} else if (handle->fmt == UHDR_IMG_FMT_32bppRGBA1010102 ||
handle->fmt == UHDR_IMG_FMT_32bppRGBA8888 ||
handle->fmt == UHDR_IMG_FMT_64bppRGBAHalfFloat) {
const int bpp = handle->fmt == UHDR_IMG_FMT_64bppRGBAHalfFloat ? 8 : 4;
READ_BYTES(ifd, handle->planes[UHDR_PLANE_PACKED], handle->w * handle->h * bpp)
return true;
} else if (handle->fmt == UHDR_IMG_FMT_12bppYCbCr420) {
READ_BYTES(ifd, handle->planes[UHDR_PLANE_Y], handle->w * handle->h)
READ_BYTES(ifd, handle->planes[UHDR_PLANE_U], (handle->w / 2) * (handle->h / 2))
READ_BYTES(ifd, handle->planes[UHDR_PLANE_V], (handle->w / 2) * (handle->h / 2))
return true;
}
return false;
}
ALOGE("Unable to open file: %s", filename);
return false;
}
static bool loadFile(const char* filename, void*& result, int length) {
std::ifstream ifd(filename, std::ios::binary | std::ios::ate);
if (ifd.good()) {
int size = ifd.tellg();
if (size < length) {
ALOGE("Requested to read %d bytes from file: %s, file contains only %d bytes", length,
filename, size);
return false;
}
ifd.seekg(0, std::ios::beg);
result = malloc(length);
if (result == nullptr) {
ALOGE("Failed to allocate memory to store contents of file: %s", filename);
return false;
}
READ_BYTES(ifd, result, length)
return true;
}
ALOGE("Unable to open file: %s", filename);
return false;
}
class DecBenchmark {
public:
std::string mUhdrFile;
uhdr_color_transfer_t mTf;
uhdr_img_fmt_t mOfmt;
bool mEnableGLES;
uhdr_compressed_image_t mUhdrImg{};
DecBenchmark(TestParamsDecodeAPI testParams) {
mUhdrFile = std::get<0>(testParams);
mTf = std::get<1>(testParams);
mOfmt = std::get<2>(testParams);
mEnableGLES = std::get<3>(testParams);
}
~DecBenchmark() {
if (mUhdrImg.data) {
free(mUhdrImg.data);
mUhdrImg.data = nullptr;
}
}
bool fillJpegImageHandle(uhdr_compressed_image_t* uhdrImg, std::string mUhdrFile);
};
bool DecBenchmark::fillJpegImageHandle(uhdr_compressed_image_t* uhdrImg, std::string filename) {
std::ifstream ifd(filename, std::ios::binary | std::ios::ate);
if (ifd.good()) {
int size = ifd.tellg();
uhdrImg->capacity = size;
uhdrImg->data_sz = size;
uhdrImg->data = nullptr;
uhdrImg->cg = UHDR_CG_UNSPECIFIED;
uhdrImg->ct = UHDR_CT_UNSPECIFIED;
uhdrImg->range = UHDR_CR_UNSPECIFIED;
ifd.close();
return loadFile(filename.c_str(), uhdrImg->data, size);
}
return false;
}
class EncBenchmark {
public:
std::string mHdrFile, mSdrFile;
uhdr_color_gamut_t mHdrCg, mSdrCg;
uhdr_img_fmt_t mHdrCf, mSdrCf;
int mWidth, mHeight;
uhdr_color_transfer_t mHdrCt, mSdrCt = UHDR_CT_SRGB;
int mUseMultiChannelGainMap;
int mMapDimensionScaleFactor = 1;
float mGamma;
uhdr_enc_preset_t mEncPreset;
uhdr_raw_image_t mHdrImg{}, mSdrImg{};
EncBenchmark(TestParamsEncoderAPI0 testParams) {
mHdrFile = std::get<0>(testParams);
mWidth = std::get<1>(testParams);
mHeight = std::get<2>(testParams);
mHdrCg = std::get<3>(testParams);
mHdrCt = std::get<4>(testParams);
mUseMultiChannelGainMap = std::get<5>(testParams);
mGamma = std::get<6>(testParams);
};
EncBenchmark(TestParamsEncoderAPI1 testParams) {
mHdrFile = std::get<0>(testParams);
mSdrFile = std::get<1>(testParams);
mWidth = std::get<2>(testParams);
mHeight = std::get<3>(testParams);
mHdrCg = std::get<4>(testParams);
mHdrCt = std::get<5>(testParams);
mSdrCg = std::get<6>(testParams);
mUseMultiChannelGainMap = std::get<7>(testParams);
mGamma = std::get<8>(testParams);
mEncPreset = std::get<9>(testParams);
}
~EncBenchmark() {
int count = sizeof mHdrImg.planes / sizeof mHdrImg.planes[0];
for (int i = 0; i < count; i++) {
if (mHdrImg.planes[i]) {
free(mHdrImg.planes[i]);
mHdrImg.planes[i] = nullptr;
}
if (mSdrImg.planes[i]) {
free(mSdrImg.planes[i]);
mSdrImg.planes[i] = nullptr;
}
}
}
bool fillRawImageHandle(uhdr_raw_image_t* rawImg, int width, int height, std::string file,
uhdr_img_fmt_t cf, uhdr_color_gamut_t cg, uhdr_color_transfer_t ct);
};
bool EncBenchmark::fillRawImageHandle(uhdr_raw_image_t* rawImg, int width, int height,
std::string file, uhdr_img_fmt_t cf, uhdr_color_gamut_t cg,
uhdr_color_transfer_t ct) {
rawImg->fmt = cf;
rawImg->cg = cg;
rawImg->ct = ct;
rawImg->w = width;
rawImg->h = height;
if (cf == UHDR_IMG_FMT_24bppYCbCrP010) {
const int bpp = 2;
rawImg->range = std::rand() % 2 ? UHDR_CR_FULL_RANGE : UHDR_CR_LIMITED_RANGE;
rawImg->planes[UHDR_PLANE_Y] = malloc(width * height * bpp);
rawImg->planes[UHDR_PLANE_UV] = malloc((width / 2) * (height / 2) * bpp * 2);
rawImg->planes[UHDR_PLANE_V] = nullptr;
rawImg->stride[UHDR_PLANE_Y] = width;
rawImg->stride[UHDR_PLANE_UV] = width;
rawImg->stride[UHDR_PLANE_V] = 0;
return loadFile(file.c_str(), rawImg);
} else if (cf == UHDR_IMG_FMT_32bppRGBA1010102 || cf == UHDR_IMG_FMT_32bppRGBA8888 ||
cf == UHDR_IMG_FMT_64bppRGBAHalfFloat) {
const int bpp = cf == UHDR_IMG_FMT_64bppRGBAHalfFloat ? 8 : 4;
rawImg->range = UHDR_CR_FULL_RANGE;
rawImg->planes[UHDR_PLANE_PACKED] = malloc(width * height * bpp);
rawImg->planes[UHDR_PLANE_UV] = nullptr;
rawImg->planes[UHDR_PLANE_V] = nullptr;
rawImg->stride[UHDR_PLANE_PACKED] = width;
rawImg->stride[UHDR_PLANE_UV] = 0;
rawImg->stride[UHDR_PLANE_V] = 0;
return loadFile(file.c_str(), rawImg);
} else if (cf == UHDR_IMG_FMT_12bppYCbCr420) {
rawImg->range = UHDR_CR_FULL_RANGE;
rawImg->planes[UHDR_PLANE_Y] = malloc(width * height);
rawImg->planes[UHDR_PLANE_U] = malloc((width / 2) * (height / 2));
rawImg->planes[UHDR_PLANE_V] = malloc((width / 2) * (height / 2));
rawImg->stride[UHDR_PLANE_Y] = width;
rawImg->stride[UHDR_PLANE_U] = width / 2;
rawImg->stride[UHDR_PLANE_V] = width / 2;
return loadFile(file.c_str(), rawImg);
}
return false;
}
static void BM_UHDRDecode(benchmark::State& s, TestParamsDecodeAPI testVectors) {
DecBenchmark benchmark(testVectors);
s.SetLabel(benchmark.mUhdrFile + ", OutputFormat: " + imgFmtToString(benchmark.mOfmt) +
", ColorTransfer: " + tfToString(benchmark.mTf) +
", enableGLES: " + (benchmark.mEnableGLES ? "true" : "false"));
benchmark.mUhdrFile = kTestImagesPath + "jpegr/" + benchmark.mUhdrFile;
if (!benchmark.fillJpegImageHandle(&benchmark.mUhdrImg, benchmark.mUhdrFile)) {
s.SkipWithError("unable to load file : " + benchmark.mUhdrFile);
return;
}
#define RET_IF_ERR(x) \
{ \
uhdr_error_info_t status = (x); \
if (status.error_code != UHDR_CODEC_OK) { \
uhdr_release_decoder(decHandle); \
s.SkipWithError(status.has_detail ? status.detail : "Unknown error"); \
return; \
} \
}
uhdr_codec_private_t* decHandle = uhdr_create_decoder();
for (auto _ : s) {
RET_IF_ERR(uhdr_dec_set_image(decHandle, &benchmark.mUhdrImg))
RET_IF_ERR(uhdr_dec_set_out_color_transfer(decHandle, benchmark.mTf))
RET_IF_ERR(uhdr_dec_set_out_img_format(decHandle, benchmark.mOfmt))
RET_IF_ERR(uhdr_enable_gpu_acceleration(decHandle, benchmark.mEnableGLES))
RET_IF_ERR(uhdr_decode(decHandle))
uhdr_reset_decoder(decHandle);
}
uhdr_release_decoder(decHandle);
#undef RET_IF_ERR
}
#define RET_IF_ERR(x) \
{ \
uhdr_error_info_t status = (x); \
if (status.error_code != UHDR_CODEC_OK) { \
uhdr_release_encoder(encHandle); \
s.SkipWithError(status.has_detail ? status.detail : "Unknown error"); \
return; \
} \
}
static void BM_UHDREncode_Api0(benchmark::State& s, TestParamsEncoderAPI0 testVectors) {
EncBenchmark benchmark(testVectors);
s.SetLabel(
benchmark.mHdrFile + ", " + std::to_string(benchmark.mWidth) + "x" +
std::to_string(benchmark.mHeight) + ", " + colorGamutToString(benchmark.mHdrCg) + ", " +
(benchmark.mHdrFile.find("rgba16F") != std::string::npos ? "linear"
: tfToString(benchmark.mHdrCt)) +
", " +
(benchmark.mUseMultiChannelGainMap == 0 ? "singlechannelgainmap" : "multichannelgainmap") +
", gamma: " + std::to_string(benchmark.mGamma));
if (benchmark.mHdrFile.find("p010") != std::string::npos) {
benchmark.mHdrFile = kTestImagesPath + "p010/" + benchmark.mHdrFile;
benchmark.mHdrCf = UHDR_IMG_FMT_24bppYCbCrP010;
} else if (benchmark.mHdrFile.find("rgba1010102") != std::string::npos) {
benchmark.mHdrFile = kTestImagesPath + "rgba1010102/" + benchmark.mHdrFile;
benchmark.mHdrCf = UHDR_IMG_FMT_32bppRGBA1010102;
} else if (benchmark.mHdrFile.find("rgba16F") != std::string::npos) {
benchmark.mHdrFile = kTestImagesPath + "rgba16F/" + benchmark.mHdrFile;
benchmark.mHdrCf = UHDR_IMG_FMT_64bppRGBAHalfFloat;
benchmark.mHdrCt = UHDR_CT_LINEAR;
} else {
s.SkipWithError("Invalid file format : " + benchmark.mHdrFile);
return;
}
if (!benchmark.fillRawImageHandle(&benchmark.mHdrImg, benchmark.mWidth, benchmark.mHeight,
benchmark.mHdrFile, benchmark.mHdrCf, benchmark.mHdrCg,
benchmark.mHdrCt)) {
s.SkipWithError("unable to load file : " + benchmark.mHdrFile);
return;
}
uhdr_codec_private_t* encHandle = uhdr_create_encoder();
for (auto _ : s) {
RET_IF_ERR(uhdr_enc_set_raw_image(encHandle, &benchmark.mHdrImg, UHDR_HDR_IMG))
RET_IF_ERR(
uhdr_enc_set_using_multi_channel_gainmap(encHandle, benchmark.mUseMultiChannelGainMap))
RET_IF_ERR(uhdr_enc_set_gainmap_scale_factor(encHandle, benchmark.mMapDimensionScaleFactor))
RET_IF_ERR(uhdr_enc_set_gainmap_gamma(encHandle, benchmark.mGamma))
RET_IF_ERR(uhdr_encode(encHandle))
uhdr_reset_encoder(encHandle);
}
uhdr_release_encoder(encHandle);
}
static void BM_UHDREncode_Api1(benchmark::State& s, TestParamsEncoderAPI1 testVectors) {
EncBenchmark benchmark(testVectors);
s.SetLabel(
benchmark.mHdrFile + ", " + benchmark.mSdrFile + ", " + std::to_string(benchmark.mWidth) +
"x" + std::to_string(benchmark.mHeight) + ", hdrCg: " + colorGamutToString(benchmark.mHdrCg) +
", hdrCt: " +
(benchmark.mHdrFile.find("rgba16F") != std::string::npos ? "linear"
: tfToString(benchmark.mHdrCt)) +
", sdrCg: " + colorGamutToString(benchmark.mSdrCg) + ", " +
(benchmark.mUseMultiChannelGainMap == 0 ? "singlechannelgainmap" : "multichannelgainmap") +
", gamma: " + std::to_string(benchmark.mGamma) + ", " +
(benchmark.mEncPreset == UHDR_USAGE_BEST_QUALITY ? "best_quality" : "realtime"));
if (benchmark.mHdrFile.find("p010") != std::string::npos) {
benchmark.mHdrFile = kTestImagesPath + "p010/" + benchmark.mHdrFile;
benchmark.mHdrCf = UHDR_IMG_FMT_24bppYCbCrP010;
} else if (benchmark.mHdrFile.find("rgba1010102") != std::string::npos) {
benchmark.mHdrFile = kTestImagesPath + "rgba1010102/" + benchmark.mHdrFile;
benchmark.mHdrCf = UHDR_IMG_FMT_32bppRGBA1010102;
} else if (benchmark.mHdrFile.find("rgba16F") != std::string::npos) {
benchmark.mHdrFile = kTestImagesPath + "rgba16F/" + benchmark.mHdrFile;
benchmark.mHdrCf = UHDR_IMG_FMT_64bppRGBAHalfFloat;
benchmark.mHdrCt = UHDR_CT_LINEAR;
} else {
s.SkipWithError("Invalid hdr file format : " + benchmark.mHdrFile);
return;
}
if (benchmark.mSdrFile.find("yuv420") != std::string::npos) {
benchmark.mSdrFile = kTestImagesPath + "yuv420/" + benchmark.mSdrFile;
benchmark.mSdrCf = UHDR_IMG_FMT_12bppYCbCr420;
} else if (benchmark.mSdrFile.find("rgba8888") != std::string::npos) {
benchmark.mSdrFile = kTestImagesPath + "rgba8888/" + benchmark.mSdrFile;
benchmark.mSdrCf = UHDR_IMG_FMT_32bppRGBA8888;
} else {
s.SkipWithError("Invalid sdr file format : " + benchmark.mSdrFile);
return;
}
if (!benchmark.fillRawImageHandle(&benchmark.mHdrImg, benchmark.mWidth, benchmark.mHeight,
benchmark.mHdrFile, benchmark.mHdrCf, benchmark.mHdrCg,
benchmark.mHdrCt)) {
s.SkipWithError("unable to load file : " + benchmark.mHdrFile);
return;
}
if (!benchmark.fillRawImageHandle(&benchmark.mSdrImg, benchmark.mWidth, benchmark.mHeight,
benchmark.mSdrFile, benchmark.mSdrCf, benchmark.mSdrCg,
benchmark.mSdrCt)) {
s.SkipWithError("unable to load sdr file : " + benchmark.mSdrFile);
return;
}
uhdr_codec_private_t* encHandle = uhdr_create_encoder();
for (auto _ : s) {
RET_IF_ERR(uhdr_enc_set_raw_image(encHandle, &benchmark.mHdrImg, UHDR_HDR_IMG))
RET_IF_ERR(uhdr_enc_set_raw_image(encHandle, &benchmark.mSdrImg, UHDR_SDR_IMG))
RET_IF_ERR(
uhdr_enc_set_using_multi_channel_gainmap(encHandle, benchmark.mUseMultiChannelGainMap))
RET_IF_ERR(uhdr_enc_set_gainmap_scale_factor(encHandle, benchmark.mMapDimensionScaleFactor))
RET_IF_ERR(uhdr_enc_set_gainmap_gamma(encHandle, benchmark.mGamma))
RET_IF_ERR(uhdr_enc_set_preset(encHandle, benchmark.mEncPreset))
RET_IF_ERR(uhdr_encode(encHandle))
uhdr_reset_encoder(encHandle);
}
uhdr_release_encoder(encHandle);
}
void addTestVectors() {
for (const auto& uhdrFile : kDecodeAPITestImages) {
/* Decode API - uhdrFile, colorTransfer, imgFormat, enableGLES */
testParamsDecodeAPI.push_back({uhdrFile, UHDR_CT_HLG, UHDR_IMG_FMT_32bppRGBA1010102, false});
testParamsDecodeAPI.push_back({uhdrFile, UHDR_CT_PQ, UHDR_IMG_FMT_32bppRGBA1010102, false});
testParamsDecodeAPI.push_back(
{uhdrFile, UHDR_CT_LINEAR, UHDR_IMG_FMT_64bppRGBAHalfFloat, false});
testParamsDecodeAPI.push_back({uhdrFile, UHDR_CT_HLG, UHDR_IMG_FMT_32bppRGBA1010102, true});
testParamsDecodeAPI.push_back({uhdrFile, UHDR_CT_PQ, UHDR_IMG_FMT_32bppRGBA1010102, true});
testParamsDecodeAPI.push_back(
{uhdrFile, UHDR_CT_LINEAR, UHDR_IMG_FMT_64bppRGBAHalfFloat, true});
testParamsDecodeAPI.push_back({uhdrFile, UHDR_CT_SRGB, UHDR_IMG_FMT_32bppRGBA8888, false});
}
for (const auto& hdrFile : kEncodeApi0TestImages12MpName) {
/* Encode API 0 - hdrFile, width, height, hdrColorGamut, hdrColorTransfer,
useMultiChannelGainmap, gamma */
testParamsAPI0.push_back({hdrFile, 4080, 3072, UHDR_CG_BT_2100, UHDR_CT_PQ, 0, 1.0f});
testParamsAPI0.push_back({hdrFile, 4080, 3072, UHDR_CG_BT_2100, UHDR_CT_PQ, 1, 1.0f});
testParamsAPI0.push_back({hdrFile, 4080, 3072, UHDR_CG_BT_2100, UHDR_CT_PQ, 0, 1.571f});
testParamsAPI0.push_back({hdrFile, 4080, 3072, UHDR_CG_BT_2100, UHDR_CT_PQ, 1, 1.616f});
}
for (const auto& inputFiles : kEncodeApi1TestImages12MpName) {
/* Encode API 1 - hdrFile, sdrFile, width, height, hdrColorGamut, hdrColorTransfer,
sdrColorGamut, useMultiChannelGainmap, gamma, encPreset */
testParamsAPI1.push_back({inputFiles.first, inputFiles.second, 4080, 3072, UHDR_CG_BT_2100,
UHDR_CT_PQ, UHDR_CG_BT_709, 0, 1.0f, UHDR_USAGE_REALTIME});
testParamsAPI1.push_back({inputFiles.first, inputFiles.second, 4080, 3072, UHDR_CG_BT_2100,
UHDR_CT_PQ, UHDR_CG_BT_709, 1, 1.0f, UHDR_USAGE_REALTIME});
testParamsAPI1.push_back({inputFiles.first, inputFiles.second, 4080, 3072, UHDR_CG_BT_2100,
UHDR_CT_PQ, UHDR_CG_BT_709, 0, 1.571f, UHDR_USAGE_REALTIME});
testParamsAPI1.push_back({inputFiles.first, inputFiles.second, 4080, 3072, UHDR_CG_BT_2100,
UHDR_CT_PQ, UHDR_CG_BT_709, 0, 1.0f, UHDR_USAGE_BEST_QUALITY});
testParamsAPI1.push_back({inputFiles.first, inputFiles.second, 4080, 3072, UHDR_CG_BT_2100,
UHDR_CT_PQ, UHDR_CG_BT_709, 1, 1.571f, UHDR_USAGE_REALTIME});
testParamsAPI1.push_back({inputFiles.first, inputFiles.second, 4080, 3072, UHDR_CG_BT_2100,
UHDR_CT_PQ, UHDR_CG_BT_709, 1, 1.0f, UHDR_USAGE_BEST_QUALITY});
testParamsAPI1.push_back({inputFiles.first, inputFiles.second, 4080, 3072, UHDR_CG_BT_2100,
UHDR_CT_PQ, UHDR_CG_BT_709, 0, 1.571f, UHDR_USAGE_BEST_QUALITY});
testParamsAPI1.push_back({inputFiles.first, inputFiles.second, 4080, 3072, UHDR_CG_BT_2100,
UHDR_CT_PQ, UHDR_CG_BT_709, 1, 1.571f, UHDR_USAGE_BEST_QUALITY});
}
}
void registerBenchmarks() {
for (auto& param : testParamsDecodeAPI) {
benchmark::RegisterBenchmark("BM_UHDRDecode", BM_UHDRDecode, param)
->Unit(benchmark::kMillisecond);
}
for (auto& param : testParamsAPI0) {
benchmark::RegisterBenchmark("BM_UHDREncode_Api0", BM_UHDREncode_Api0, param)
->Unit(benchmark::kMillisecond);
}
for (auto& param : testParamsAPI1) {
benchmark::RegisterBenchmark("BM_UHDREncode_Api1", BM_UHDREncode_Api1, param)
->Unit(benchmark::kMillisecond);
}
}
int main(int argc, char** argv) {
addTestVectors();
registerBenchmarks();
benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks(nullptr, nullptr);
benchmark::Shutdown();
return 0;
}