From 072e87d487e4008481f09625a513223ec5fc576d Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Fri, 18 Jul 2025 17:27:58 +0800 Subject: [PATCH 1/2] fix heif auxiliaryImage color range Signed-off-by: chenzhaohui Change-Id: I4084fdcf8d4f5945ac1e3462cbfc6cfe240fd766 --- .../src/image_format_convert_utils.cpp | 4 ++-- .../include/heif_impl/HeifDecoderImpl.h | 2 +- .../include/heif_impl/hevc_sw_decode_param.h | 12 +++++++++- .../image/libextplugin/src/ext_decoder.cpp | 3 +-- .../image/libextplugin/src/ext_encoder.cpp | 23 ++++++++++--------- .../src/heif_impl/HeifDecoderImpl.cpp | 11 ++++++--- 6 files changed, 35 insertions(+), 20 deletions(-) diff --git a/frameworks/innerkitsimpl/converter/src/image_format_convert_utils.cpp b/frameworks/innerkitsimpl/converter/src/image_format_convert_utils.cpp index 1894cf1d9..d4f52297d 100644 --- a/frameworks/innerkitsimpl/converter/src/image_format_convert_utils.cpp +++ b/frameworks/innerkitsimpl/converter/src/image_format_convert_utils.cpp @@ -1216,8 +1216,8 @@ static bool RGBToYuv(const uint8_t *srcBuffer, const RGBDataInfo &rgbInfo, Pixel } srcParam.buffer = copySrcBuffer.get(); } - srcParam.width = copyWidth; - srcParam.height = copyHeight; + srcParam.width = static_cast(copyWidth); + srcParam.height = static_cast(copyHeight); srcParam.format = srcFormat; DestConvertParam destParam = {destInfo.width, destInfo.height}; diff --git a/plugins/common/libs/image/libextplugin/include/heif_impl/HeifDecoderImpl.h b/plugins/common/libs/image/libextplugin/include/heif_impl/HeifDecoderImpl.h index 7c9860cad..b888c8c02 100644 --- a/plugins/common/libs/image/libextplugin/include/heif_impl/HeifDecoderImpl.h +++ b/plugins/common/libs/image/libextplugin/include/heif_impl/HeifDecoderImpl.h @@ -151,7 +151,7 @@ private: void SetColorSpaceInfo(HeifFrameInfo* info, const std::shared_ptr& image); - void GetGainmapColorSpace(ColorManager::ColorSpaceName &gainmapColor); + void GetAuxiliaryColorSpace(ColorManager::ColorSpaceName &auxiliaryColor); void SetHardwareDecodeErrMsg(const uint32_t width, const uint32_t height); diff --git a/plugins/common/libs/image/libextplugin/include/heif_impl/hevc_sw_decode_param.h b/plugins/common/libs/image/libextplugin/include/heif_impl/hevc_sw_decode_param.h index 6376d42e6..edd48324c 100644 --- a/plugins/common/libs/image/libextplugin/include/heif_impl/hevc_sw_decode_param.h +++ b/plugins/common/libs/image/libextplugin/include/heif_impl/hevc_sw_decode_param.h @@ -16,11 +16,21 @@ #ifndef PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEVC_SW_DECODE_PARAM_H #define PLUGINS_COMMON_LIBS_IMAGE_LIBEXTPLUGIN_INCLUDE_HEVC_SW_DECODE_PARAM_H -#include "hardware/imagecodec/grid_info.h" #include "image_type.h" namespace OHOS { namespace ImagePlugin { +struct GridInfo { + uint32_t displayWidth = 0; + uint32_t displayHeight = 0; + bool enableGrid = false; + uint32_t cols = 0; + uint32_t rows = 0; + uint32_t tileWidth = 0; + uint32_t tileHeight = 0; + uint8_t colorRangeflag = 1; // 0 -> limitRange:[16,235], 1 -> fullRange:[0, 255] +}; + struct HevcSoftDecodeParam { GridInfo gridInfo {}; Media::PixelFormat srcpixFmt = Media::PixelFormat::UNKNOWN; diff --git a/plugins/common/libs/image/libextplugin/src/ext_decoder.cpp b/plugins/common/libs/image/libextplugin/src/ext_decoder.cpp index 0c61644d1..f9cfacc19 100644 --- a/plugins/common/libs/image/libextplugin/src/ext_decoder.cpp +++ b/plugins/common/libs/image/libextplugin/src/ext_decoder.cpp @@ -51,7 +51,6 @@ #ifdef HEIF_HW_DECODE_ENABLE #include "heif_impl/HeifDecoder.h" #include "heif_impl/HeifDecoderImpl.h" -#include "hardware/heif_hw_decoder.h" #endif #include "color_utils.h" #include "heif_parser.h" @@ -2799,7 +2798,7 @@ bool ExtDecoder::DecodeHeifAuxiliaryMap(DecodeContext& context, AuxiliaryPicture if (SkImageInfo::ByteSizeOverflowed(tempByteCount)) { IMAGE_LOGE("Image too large, dstInfo_height: %{public}d, dstInfo_width: %{public}d", dstInfo.height(), dstInfo.width()); - return ERR_IMAGE_TOO_LARGE; + return false; } uint64_t byteCount = tempByteCount; context.info.size.width = width; diff --git a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp index c01fb3b4f..efc79789d 100644 --- a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp +++ b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp @@ -1381,26 +1381,27 @@ uint32_t ExtEncoder::AssembleHeifFragmentMap(std::vector& inputImgs) HeifEncodeItemInfo itemInfo = GetHeifEncodeItemInfo(AuxiliaryPictureType::FRAGMENT_MAP); auto item = InitAuxiliaryImageItem(itemInfo.itemId, itemInfo.itemName); bool sdrIsSRGB = fragmentMap->GetContentPixel()->GetToSdrColorSpaceIsSRGB(); - SkImageInfo fragmentInfo = GetSkInfo(fragmentMap->GetContentPixel().get(), false, sdrIsSRGB); -#ifdef USE_M133_SKIA - sk_sp iccProfile = icc_from_color_space(fragmentInfo, nullptr, nullptr); -#else - sk_sp iccProfile = icc_from_color_space(fragmentInfo); -#endif - cond = !AssembleICCImageProperty(iccProfile, item.sharedProperties); - CHECK_ERROR_RETURN_RET_LOG(cond, ERR_IMAGE_INVALID_PARAMETER, - "%{public}s AssembleICCImageProperty failed", __func__); item.pixelBuffer = sptr::MakeSptr(fragmentMapSptr->GetBufferHandle()); + ColorManager::ColorSpaceName colorSpaceName = + sdrIsSRGB ? ColorManager::ColorSpaceName::SRGB_LIMIT : ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT; + ColourInfo colorInfo; + GetColourInfo(colorSpaceName, colorInfo); std::string auxTypeStr = itemInfo.itemType; uint32_t litePropertiesSize = sizeof(PropertyType::AUX_TYPE) + UINT32_BYTES_NUM + auxTypeStr.length() + PLACE_HOLDER_LENGTH; litePropertiesSize += (sizeof(PropertyType::COLOR_TYPE) + sizeof(ColorType)); + litePropertiesSize += (sizeof(PropertyType::COLOR_INFO) + sizeof(ColourInfo)); litePropertiesSize += (sizeof(PropertyType::RLOC_INFO) + sizeof(RelativeLocation)); item.liteProperties.resize(litePropertiesSize); size_t offset = 0; - ColorType colorType = ColorType::RICC; - cond = !FillLitePropertyItem(item.liteProperties, offset, PropertyType::COLOR_TYPE, &colorType, sizeof(ColorType)); + ColorType colorType = ColorType::NCLX; + + cond = !FillLitePropertyItem(item.liteProperties, offset, + PropertyType::COLOR_TYPE, &colorType, sizeof(ColorType)); CHECK_ERROR_RETURN_RET_LOG(cond, ERR_IMAGE_INVALID_PARAMETER, "%{public}s Fill color type failed", __func__); + cond = !FillLitePropertyItem(item.liteProperties, offset, + PropertyType::COLOR_INFO, &colorInfo, sizeof(ColourInfo)); + CHECK_ERROR_RETURN_RET_LOG(cond, ERR_IMAGE_INVALID_PARAMETER, "%{public}s Fill colorInfo failed", __func__); cond = !FillLitePropertyItemByString(item.liteProperties, offset, PropertyType::AUX_TYPE, auxTypeStr); CHECK_ERROR_RETURN_RET_LOG(cond, ERR_IMAGE_INVALID_PARAMETER, "%{public}s Fill auxiliary type failed", __func__); RelativeLocation loc = GetFragmentRelLocation(fragmentMap); diff --git a/plugins/common/libs/image/libextplugin/src/heif_impl/HeifDecoderImpl.cpp b/plugins/common/libs/image/libextplugin/src/heif_impl/HeifDecoderImpl.cpp index 3bb8f0ed6..37fda2b2d 100644 --- a/plugins/common/libs/image/libextplugin/src/heif_impl/HeifDecoderImpl.cpp +++ b/plugins/common/libs/image/libextplugin/src/heif_impl/HeifDecoderImpl.cpp @@ -424,7 +424,7 @@ GSError HeifDecoderImpl::HwSetColorSpaceData(sptr& buffer, GridIn return GSERROR_NO_BUFFER; } if (isGainmapDecode_ || isAuxiliaryDecode_) { - GetGainmapColorSpace(colorSpaceName_); + GetAuxiliaryColorSpace(colorSpaceName_); } auto colorSpaceSearch = ColorUtils::COLORSPACE_NAME_TO_COLORINFO_MAP.find(colorSpaceName_); CM_ColorSpaceInfo colorSpaceInfo = @@ -1134,13 +1134,18 @@ void HeifDecoderImpl::SetSampleFormat(uint32_t sampleSize, ColorManager::ColorSp colorSpaceName_ = colorSpaceName; } -void HeifDecoderImpl::GetGainmapColorSpace(ColorManager::ColorSpaceName &gainmapColor) +void HeifDecoderImpl::GetAuxiliaryColorSpace(ColorManager::ColorSpaceName &auxiliaryColor) { if (gainmapImageInfo_.hasNclxColor) { - gainmapColor = ColorUtils::CicpToColorSpace(gainmapImageInfo_.nclxColor.colorPrimaries, + auxiliaryColor = ColorUtils::CicpToColorSpace(gainmapImageInfo_.nclxColor.colorPrimaries, gainmapImageInfo_.nclxColor.transferCharacteristics, gainmapImageInfo_.nclxColor.matrixCoefficients, gainmapImageInfo_.nclxColor.fullRangeFlag); } + if (auxiliaryImageInfo_.hasNclxColor) { + auxiliaryColor = ColorUtils::CicpToColorSpace(auxiliaryImageInfo_.nclxColor.colorPrimaries, + auxiliaryImageInfo_.nclxColor.transferCharacteristics, auxiliaryImageInfo_.nclxColor.matrixCoefficients, + auxiliaryImageInfo_.nclxColor.fullRangeFlag); + } } void HeifDecoderImpl::setDstBuffer(uint8_t *dstBuffer, size_t rowStride, void *context) -- Gitee From c609a51f0ab87fba9c7e22eb5c81c7365ca92a59 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Sat, 19 Jul 2025 15:18:51 +0800 Subject: [PATCH 2/2] fix heif auxiliaryImage color range Signed-off-by: chenzhaohui Change-Id: I7235abf71db09d3065bfbea4a7ce8a6ae7553686 --- plugins/common/libs/image/libextplugin/src/ext_encoder.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp index efc79789d..32d132212 100644 --- a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp +++ b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp @@ -1382,7 +1382,7 @@ uint32_t ExtEncoder::AssembleHeifFragmentMap(std::vector& inputImgs) auto item = InitAuxiliaryImageItem(itemInfo.itemId, itemInfo.itemName); bool sdrIsSRGB = fragmentMap->GetContentPixel()->GetToSdrColorSpaceIsSRGB(); item.pixelBuffer = sptr::MakeSptr(fragmentMapSptr->GetBufferHandle()); - ColorManager::ColorSpaceName colorSpaceName = + ColorManager::ColorSpaceName colorSpaceName = sdrIsSRGB ? ColorManager::ColorSpaceName::SRGB_LIMIT : ColorManager::ColorSpaceName::DISPLAY_P3_LIMIT; ColourInfo colorInfo; GetColourInfo(colorSpaceName, colorInfo); @@ -1395,7 +1395,6 @@ uint32_t ExtEncoder::AssembleHeifFragmentMap(std::vector& inputImgs) item.liteProperties.resize(litePropertiesSize); size_t offset = 0; ColorType colorType = ColorType::NCLX; - cond = !FillLitePropertyItem(item.liteProperties, offset, PropertyType::COLOR_TYPE, &colorType, sizeof(ColorType)); CHECK_ERROR_RETURN_RET_LOG(cond, ERR_IMAGE_INVALID_PARAMETER, "%{public}s Fill color type failed", __func__); -- Gitee