diff --git a/README.md b/README.md index 57983652..860ad3f1 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ To build libultrahdr, examples, unit tests: This will generate the following files under *{build_directory}*: -**libultrahdr.a**
Static link library for the ultrahdr API +**libuhdr.a**
Static link library for the ultrahdr API **ultrahdr_app**
Sample application demonstrating ultrahdr API @@ -72,7 +72,7 @@ This will generate the following files under *{build_directory}*: This will generate the following files under *{build_directory/Release}*: -**ultrahdr.lib**
Static link library for the ultrahdr API +**uhdr.lib**
Static link library for the ultrahdr API **ultrahdr_app.exe**
Sample application demonstrating ultrahdr API @@ -88,7 +88,7 @@ This will generate the following files under *{build_directory/Release}*: This will generate the following files under *{build_directory}*: -**ultrahdr.lib**
Static link library for the ultrahdr API +**uhdr.lib**
Static link library for the ultrahdr API **ultrahdr_app.exe**
Sample application demonstrating ultrahdr API @@ -113,7 +113,7 @@ environment. This will generate the following files under *{build_directory}*: -**libultrahdr.a**
Static link library for the ultrahdr API +**libuhdr.a**
Static link library for the ultrahdr API **ultrahdr_app.exe**
Sample application demonstrating ultrahdr API @@ -162,5 +162,5 @@ List of decode API: | metadata | (optional, default to NULL) Destination of metadata (gain map version, min/max content boost). | For more info: -- Refer to [jpegr.h](lib/include/ultrahdr/jpegr.h) for detailed description of various encode and decode api. +- Refer to [ultrahdr_api.h](lib/include/ultrahdr/ultrahdr_api.h) for detailed description of various encode and decode api. - Refer to [ultrahdr_app.cpp](examples/ultrahdr_app.cpp) for examples of its usage. diff --git a/examples/ultrahdr_app.cpp b/examples/ultrahdr_app.cpp index 121fa224..439d367c 100644 --- a/examples/ultrahdr_app.cpp +++ b/examples/ultrahdr_app.cpp @@ -23,15 +23,13 @@ #include #include +#include #include +#include #include #include -#include "ultrahdr/ultrahdrcommon.h" -#include "ultrahdr/gainmapmath.h" -#include "ultrahdr/jpegr.h" - -using namespace ultrahdr; +#include "ultrahdr/ultrahdr_api.h" const float BT601YUVtoRGBMatrix[9] = { 1, 0, 1.402, 1, (-0.202008 / 0.587), (-0.419198 / 0.587), 1.0, 1.772, 0.0}; @@ -316,7 +314,6 @@ bool UltraHdrAppInput::encode() { return false; } - JpegR jpegHdr; status_t status = UHDR_UNKNOWN_ERROR; #ifdef PROFILE_ENABLE const int profileCount = 10; @@ -325,30 +322,30 @@ bool UltraHdrAppInput::encode() { for (auto i = 0; i < profileCount; i++) { #endif if (mYuv420File == nullptr && mYuv420JpegFile == nullptr) { // api-0 - status = jpegHdr.encodeJPEGR(&mRawP010Image, mTf, &mJpegImgR, mQuality, nullptr); + status = ultrahdr_compress_api0(&mRawP010Image, mTf, &mJpegImgR, mQuality, nullptr); if (UHDR_NO_ERROR != status) { std::cerr << "Encountered error during encodeJPEGR call, error code " << status << std::endl; return false; } } else if (mYuv420File != nullptr && mYuv420JpegFile == nullptr) { // api-1 - status = - jpegHdr.encodeJPEGR(&mRawP010Image, &mRawYuv420Image, mTf, &mJpegImgR, mQuality, nullptr); + status = ultrahdr_compress_api1(&mRawP010Image, &mRawYuv420Image, mTf, &mJpegImgR, mQuality, + nullptr); if (UHDR_NO_ERROR != status) { std::cerr << "Encountered error during encodeJPEGR call, error code " << status << std::endl; return false; } } else if (mYuv420File != nullptr && mYuv420JpegFile != nullptr) { // api-2 - status = - jpegHdr.encodeJPEGR(&mRawP010Image, &mRawYuv420Image, &mYuv420JpegImage, mTf, &mJpegImgR); + status = ultrahdr_compress_api2(&mRawP010Image, &mRawYuv420Image, &mYuv420JpegImage, mTf, + &mJpegImgR); if (UHDR_NO_ERROR != status) { std::cerr << "Encountered error during encodeJPEGR call, error code " << status << std::endl; return false; } } else if (mYuv420File == nullptr && mYuv420JpegFile != nullptr) { // api-3 - status = jpegHdr.encodeJPEGR(&mRawP010Image, &mYuv420JpegImage, mTf, &mJpegImgR); + status = ultrahdr_compress_api3(&mRawP010Image, &mYuv420JpegImage, mTf, &mJpegImgR); if (UHDR_NO_ERROR != status) { std::cerr << "Encountered error during encodeJPEGR call, error code " << status << std::endl; @@ -367,13 +364,10 @@ bool UltraHdrAppInput::encode() { bool UltraHdrAppInput::decode() { if (mMode == 1 && !fillJpegRImageHandle()) return false; - std::vector iccData(0); - std::vector exifData(0); - jpegr_info_struct info{}; - JpegR jpegHdr; - status_t status = jpegHdr.getJPEGRInfo(&mJpegImgR, &info); + size_t imgWidth, imgHeight; + status_t status = get_image_dimensions(&mJpegImgR, &imgWidth, &imgHeight); if (UHDR_NO_ERROR == status) { - size_t outSize = info.width * info.height * ((mOf == ULTRAHDR_OUTPUT_HDR_LINEAR) ? 8 : 4); + size_t outSize = imgWidth * imgHeight * ((mOf == ULTRAHDR_OUTPUT_HDR_LINEAR) ? 8 : 4); mDestImage.data = malloc(outSize); if (mDestImage.data == nullptr) { std::cerr << "failed to allocate memory to store decoded output" << std::endl; @@ -385,8 +379,7 @@ bool UltraHdrAppInput::decode() { profileDecode.timerStart(); for (auto i = 0; i < profileCount; i++) { #endif - status = - jpegHdr.decodeJPEGR(&mJpegImgR, &mDestImage, FLT_MAX, nullptr, mOf, nullptr, nullptr); + status = ultrahdr_decompress(&mJpegImgR, &mDestImage, FLT_MAX, mOf, nullptr); if (UHDR_NO_ERROR != status) { std::cerr << "Encountered error during decodeJPEGR call, error code " << status << std::endl; @@ -401,7 +394,8 @@ bool UltraHdrAppInput::decode() { #endif writeFile("outrgb.raw", mDestImage.data, outSize); } else { - std::cerr << "Encountered error during getJPEGRInfo call, error code " << status << std::endl; + std::cerr << "Encountered error during getImageDimensions call, error code " << status + << std::endl; return false; } return true; @@ -440,9 +434,9 @@ bool UltraHdrAppInput::convertP010ToRGBImage() { float u0 = float(u[mRawP010Image.width * (i / 2) + (j / 2) * 2] >> 6); float v0 = float(v[mRawP010Image.width * (i / 2) + (j / 2) * 2] >> 6); - y0 = CLIP3(y0, 64.0f, 940.0f); - u0 = CLIP3(u0, 64.0f, 960.0f); - v0 = CLIP3(v0, 64.0f, 960.0f); + y0 = std::clamp(y0, 64.0f, 940.0f); + u0 = std::clamp(u0, 64.0f, 960.0f); + v0 = std::clamp(v0, 64.0f, 960.0f); y0 = (y0 - 64.0f) / 876.0f; u0 = (u0 - 64.0f) / 896.0f - 0.5f; @@ -452,9 +446,9 @@ bool UltraHdrAppInput::convertP010ToRGBImage() { float g = coeffs[3] * y0 + coeffs[4] * u0 + coeffs[5] * v0; float b = coeffs[6] * y0 + coeffs[7] * u0 + coeffs[8] * v0; - r = CLIP3(r * 1023.0f + 0.5f, 0.0f, 1023.0f); - g = CLIP3(g * 1023.0f + 0.5f, 0.0f, 1023.0f); - b = CLIP3(b * 1023.0f + 0.5f, 0.0f, 1023.0f); + r = std::clamp(r * 1023.0f + 0.5f, 0.0f, 1023.0f); + g = std::clamp(g * 1023.0f + 0.5f, 0.0f, 1023.0f); + b = std::clamp(b * 1023.0f + 0.5f, 0.0f, 1023.0f); int32_t r0 = int32_t(r); int32_t g0 = int32_t(g); @@ -504,9 +498,9 @@ bool UltraHdrAppInput::convertYuv420ToRGBImage() { g = g * 255.0f + 0.5f; b = b * 255.0f + 0.5f; - r = CLIP3(r, 0.0f, 255.0f); - g = CLIP3(g, 0.0f, 255.0f); - b = CLIP3(b, 0.0f, 255.0f); + r = std::clamp(r, 0.0f, 255.0f); + g = std::clamp(g, 0.0f, 255.0f); + b = std::clamp(b, 0.0f, 255.0f); int32_t r0 = int32_t(r); int32_t g0 = int32_t(g); @@ -557,9 +551,9 @@ bool UltraHdrAppInput::convertRgba8888ToYUV444Image() { u = u * 255.0f + 0.5f + 128.0f; v = v * 255.0f + 0.5f + 128.0f; - y = CLIP3(y, 0.0f, 255.0f); - u = CLIP3(u, 0.0f, 255.0f); - v = CLIP3(v, 0.0f, 255.0f); + y = std::clamp(y, 0.0f, 255.0f); + u = std::clamp(u, 0.0f, 255.0f); + v = std::clamp(v, 0.0f, 255.0f); yData[mDestYUV444Image.width * i + j] = uint8_t(y); uData[mDestYUV444Image.width * i + j] = uint8_t(u); @@ -618,9 +612,9 @@ bool UltraHdrAppInput::convertRgba1010102ToYUV444Image() { u = (u * 896.0f) + 64.0f + 512.0f + 0.5f; v = (v * 896.0f) + 64.0f + 512.0f + 0.5f; - y = CLIP3(y, 64.0f, 940.0f); - u = CLIP3(u, 64.0f, 960.0f); - v = CLIP3(v, 64.0f, 960.0f); + y = std::clamp(y, 64.0f, 940.0f); + u = std::clamp(u, 64.0f, 960.0f); + v = std::clamp(v, 64.0f, 960.0f); yData[mDestYUV444Image.width * i + j] = uint16_t(y); uData[mDestYUV444Image.width * i + j] = uint16_t(u); @@ -751,13 +745,13 @@ void UltraHdrAppInput::computeYUVHdrPSNR() { for (size_t i = 0; i < mDestYUV444Image.height; i++) { for (size_t j = 0; j < mDestYUV444Image.width; j++) { int ySrc = (yDataSrc[mRawP010Image.width * i + j] >> 6) & 0x3ff; - ySrc = CLIP3(ySrc, 64, 940); + ySrc = std::clamp(ySrc, 64, 940); int yDst = yDataDst[mDestYUV444Image.width * i + j] & 0x3ff; ySqError += (ySrc - yDst) * (ySrc - yDst); if (i % 2 == 0 && j % 2 == 0) { int uSrc = (uDataSrc[mRawP010Image.width * (i / 2) + (j / 2) * 2] >> 6) & 0x3ff; - uSrc = CLIP3(uSrc, 64, 960); + uSrc = std::clamp(uSrc, 64, 960); int uDst = uDataDst[mDestYUV444Image.width * i + j] & 0x3ff; uDst += uDataDst[mDestYUV444Image.width * i + j + 1] & 0x3ff; uDst += uDataDst[mDestYUV444Image.width * (i + 1) + j + 1] & 0x3ff; @@ -766,7 +760,7 @@ void UltraHdrAppInput::computeYUVHdrPSNR() { uSqError += (uSrc - uDst) * (uSrc - uDst); int vSrc = (vDataSrc[mRawP010Image.width * (i / 2) + (j / 2) * 2] >> 6) & 0x3ff; - vSrc = CLIP3(vSrc, 64, 960); + vSrc = std::clamp(vSrc, 64, 960); int vDst = vDataDst[mDestYUV444Image.width * i + j] & 0x3ff; vDst += vDataDst[mDestYUV444Image.width * i + j + 1] & 0x3ff; vDst += vDataDst[mDestYUV444Image.width * (i + 1) + j + 1] & 0x3ff;