From bc509f43888d72544282f5bdaeb180f7ef48d525 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Wed, 13 Aug 2025 15:56:10 +0800 Subject: [PATCH] fix heif swdecode gainmap Signed-off-by: chenzhaohui Change-Id: Ic73dbf643dc33e1d058a6e3dcd72bb15d2f20be8 --- .../include/heif_impl/HeifDecoderImpl.h | 4 ++-- .../src/heif_impl/HeifDecoderImpl.cpp | 21 +++++++------------ .../src/heif_impl/heif_parser/heif_parser.cpp | 2 +- 3 files changed, 11 insertions(+), 16 deletions(-) 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 b88496496..b0ea30aba 100644 --- a/plugins/common/libs/image/libextplugin/include/heif_impl/HeifDecoderImpl.h +++ b/plugins/common/libs/image/libextplugin/include/heif_impl/HeifDecoderImpl.h @@ -125,9 +125,9 @@ private: bool SwDecodeImage(std::shared_ptr &image, HevcSoftDecodeParam ¶m, GridInfo &gridInfo, bool isPrimary); bool SwDecodeAuxiliaryImage(std::shared_ptr &gainmapImage, - GridInfo &gainmapGridInfo, sptr *outputBuf); + GridInfo &gainmapGridInfo, uint8_t *auxiliaryDstMemory); bool DoSwDecodeAuxiliaryImage(std::shared_ptr &gainmapImage, GridInfo &gainmapGridInfo, - sptr &output, sptr *outputBuf); + sptr &output, uint8_t *auxiliaryDstMemory); bool SwDecodeGrids(Media::ImageFwkExtManager &extManager, std::shared_ptr &image, HevcSoftDecodeParam ¶m); 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 48448d038..1388cb3e9 100644 --- a/plugins/common/libs/image/libextplugin/src/heif_impl/HeifDecoderImpl.cpp +++ b/plugins/common/libs/image/libextplugin/src/heif_impl/HeifDecoderImpl.cpp @@ -522,7 +522,7 @@ bool HeifDecoderImpl::SwDecode(bool isSharedMemory) gridInfo_, Media::PixelFormat::UNKNOWN, outPixelFormat_, dstMemory_, 0, static_cast(dstRowStride_), dstHwBuffer_, - isSharedMemory, nullptr, 0 + isSharedMemory, nullptr, static_cast(dstRowStride_) }; bool decodeRes = SwDecodeImage(primaryImage_, param, gridInfo_, true); if (!decodeRes) { @@ -552,8 +552,7 @@ bool HeifDecoderImpl::DoDecodeAuxiliaryImage(std::shared_ptr &auxilia return false; } if (!decodeRes) { - sptr swHwBuffer; - bool swdecodeRes = SwDecodeAuxiliaryImage(auxiliaryImage, auxiliaryGridInfo, &swHwBuffer); + bool swdecodeRes = SwDecodeAuxiliaryImage(auxiliaryImage, auxiliaryGridInfo, auxiliaryDstMemory); if (!swdecodeRes) { IMAGE_LOGE("HeifDecoderImpl::SwDecodeAuxiliaryImage failed too"); return false; @@ -880,7 +879,7 @@ bool HeifDecoderImpl::SwDecodeSingleImage(ImageFwkExtManager &extManager, } bool HeifDecoderImpl::SwDecodeAuxiliaryImage(std::shared_ptr &gainmapImage, - GridInfo &gainmapGridInfo, sptr *outputBuf) + GridInfo &gainmapGridInfo, uint8_t *auxiliaryDstMemory) { ImageTrace trace("HeifDecoderImpl::SwdecodeGainmap"); uint32_t width = gainmapImage->GetOriginalWidth(); @@ -896,7 +895,7 @@ bool HeifDecoderImpl::SwDecodeAuxiliaryImage(std::shared_ptr &gainmap GSError ret = output->Alloc(config); bool cond = ret != GSERROR_OK; CHECK_ERROR_RETURN_RET_LOG(cond, false, "output->alloc(config)faild, GSError=%{public}d", ret); - if (!DoSwDecodeAuxiliaryImage(gainmapImage, gainmapGridInfo, output, outputBuf)) { + if (!DoSwDecodeAuxiliaryImage(gainmapImage, gainmapGridInfo, output, auxiliaryDstMemory)) { IMAGE_LOGE("HDR-IMAGE SwDecodeGainmap failed"); } return true; @@ -916,9 +915,9 @@ Media::PixelFormat GetDecodeHeifFormat(std::shared_ptr &heifImage) } bool HeifDecoderImpl::DoSwDecodeAuxiliaryImage(std::shared_ptr &gainmapImage, GridInfo &gainmapgridInfo, - sptr &output, sptr *outputBuf) + sptr &output, uint8_t *auxiliaryDstMemory) { - bool cond = (output == nullptr || outputBuf == nullptr); + bool cond = (output == nullptr); CHECK_ERROR_RETURN_RET(cond, false); PixelFormat gainmapSrcFmt = GetDecodeHeifFormat(gainmapImage); PixelFormat gainmapDstFmt = PixelFormat::UNKNOWN; @@ -927,14 +926,11 @@ bool HeifDecoderImpl::DoSwDecodeAuxiliaryImage(std::shared_ptr &gainm return false; } uint32_t gainmapRowStride; - uint8_t *gainmapDstBuffer; if (isGainmapDecode_) { gainmapDstFmt = PixelFormat::RGBA_8888; - gainmapDstBuffer = gainmapDstMemory_; gainmapRowStride = static_cast(gainmapDstRowStride_); } else { gainmapDstFmt = outPixelFormat_; - gainmapDstBuffer = auxiliaryDstMemory_; gainmapRowStride = static_cast(auxiliaryDstRowStride_); } OH_NativeBuffer_Planes *dataPlanesInfo = nullptr; @@ -950,7 +946,7 @@ bool HeifDecoderImpl::DoSwDecodeAuxiliaryImage(std::shared_ptr &gainm uint32_t gainmapMemorySize = gainmapStride * static_cast(output->GetHeight()); HevcSoftDecodeParam gainmapParam { gainmapgridInfo, gainmapSrcFmt, gainmapDstFmt, - gainmapDstBuffer, gainmapMemorySize, + auxiliaryDstMemory, gainmapMemorySize, gainmapStride, nullptr, false, static_cast(nativeBuffer), gainmapRowStride }; if (!SwDecodeImage(gainmapImage, gainmapParam, gainmapgridInfo, false)) { @@ -958,7 +954,6 @@ bool HeifDecoderImpl::DoSwDecodeAuxiliaryImage(std::shared_ptr &gainm IMAGE_LOGE("HDR-IMAGE SwDecodeImage failed"); return false; } - *outputBuf = output; if (output != nullptr) { ImageUtils::SurfaceBuffer_Unreference(nativeBuffer); } @@ -1069,7 +1064,7 @@ bool HeifDecoderImpl::SwApplyAlphaImage(std::shared_ptr &masterImage, std::unique_ptr alphaMemory = std::make_unique(alphaMemorySize); HevcSoftDecodeParam param { alphaGridInfo, Media::PixelFormat::UNKNOWN, alphaDstFmt, - alphaMemory.get(), alphaMemorySize, alphaStride, nullptr, false, nullptr, 0 + alphaMemory.get(), alphaMemorySize, alphaStride, nullptr, false, nullptr, alphaStride }; bool decodeRes = SwDecodeImage(alphaImage, param, alphaGridInfo, false); bool cond = !decodeRes; diff --git a/plugins/common/libs/image/libextplugin/src/heif_impl/heif_parser/heif_parser.cpp b/plugins/common/libs/image/libextplugin/src/heif_impl/heif_parser/heif_parser.cpp index 26f4cc669..b1650e302 100644 --- a/plugins/common/libs/image/libextplugin/src/heif_impl/heif_parser/heif_parser.cpp +++ b/plugins/common/libs/image/libextplugin/src/heif_impl/heif_parser/heif_parser.cpp @@ -249,7 +249,7 @@ heif_error HeifParser::GetItemData(heif_item_id itemId, std::vector *ou } std::string item_type = infe_box->GetItemType(); - auto items = ilocBox_->GetItems(); + const auto& items = ilocBox_->GetItems(); const HeifIlocBox::Item *ilocItem = nullptr; for (const auto &item: items) { if (item.itemId == itemId) { -- Gitee