From fc24976c35f3fb6bd25b7059b964d12a9aef6e49 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Thu, 31 Jul 2025 09:50:13 +0800 Subject: [PATCH 1/3] fix encode flush and imagesource memleak Signed-off-by: chenzhaohui Change-Id: I461300f90889b45cc4e9427eefb15fbc7d77f11c --- .../stream/src/file_source_stream.cpp | 2 ++ .../innerkitsimpl/utils/include/image_utils.h | 6 ++++++ .../innerkitsimpl/utils/src/image_utils.cpp | 11 +++++++++++ .../image/libextplugin/src/ext_encoder.cpp | 18 ++++++------------ 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/frameworks/innerkitsimpl/stream/src/file_source_stream.cpp b/frameworks/innerkitsimpl/stream/src/file_source_stream.cpp index 5a85cfa7b..b468c7111 100644 --- a/frameworks/innerkitsimpl/stream/src/file_source_stream.cpp +++ b/frameworks/innerkitsimpl/stream/src/file_source_stream.cpp @@ -115,6 +115,7 @@ unique_ptr FileSourceStream::CreateSourceStream(const int fd) FILE *filePtr = fdopen(dupFd, "rb"); if (filePtr == nullptr) { IMAGE_LOGE("[FileSourceStream]open file fail."); + close(dupFd); return nullptr; } bool useMmap = ShouldUseMmap(fd); @@ -151,6 +152,7 @@ unique_ptr FileSourceStream::CreateSourceStream( FILE *filePtr = fdopen(dupFd, "rb"); if (filePtr == nullptr) { IMAGE_LOGE("[FileSourceStream]open file fail."); + close(dupFd); return nullptr; } bool useMmap = ShouldUseMmap(fd); diff --git a/frameworks/innerkitsimpl/utils/include/image_utils.h b/frameworks/innerkitsimpl/utils/include/image_utils.h index 45fce12f0..f8323e603 100644 --- a/frameworks/innerkitsimpl/utils/include/image_utils.h +++ b/frameworks/innerkitsimpl/utils/include/image_utils.h @@ -21,6 +21,9 @@ #include #include "image_type.h" #include "iosfwd" +#if !defined(CROSS_PLATFORM) +#include "surface_buffer.h" +#endif namespace OHOS { namespace MultimediaPlugin { class PluginServer; } } namespace OHOS { namespace ImagePlugin { struct DecodeContext; } } @@ -80,6 +83,9 @@ public: static void FloatToBytes(float data, std::vector& bytes, uint32_t& offset, bool isBigEndian = true); static void Int32ToBytes(int32_t data, std::vector& bytes, uint32_t& offset, bool isBigEndian = true); static void ArrayToBytes(const uint8_t* data, uint32_t length, std::vector& bytes, uint32_t& offset); +#if !defined(CROSS_PLATFORM) + static void DoFlushSurfaceBuffer(sptr& surfaceBuffer); +#endif static void FlushSurfaceBuffer(PixelMap* pixelMap); static void FlushContextSurfaceBuffer(ImagePlugin::DecodeContext& context); static void InvalidateContextSurfaceBuffer(ImagePlugin::DecodeContext& context); diff --git a/frameworks/innerkitsimpl/utils/src/image_utils.cpp b/frameworks/innerkitsimpl/utils/src/image_utils.cpp index f33ae97c7..f908678d8 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -981,6 +981,17 @@ void ImageUtils::ArrayToBytes(const uint8_t* data, uint32_t length, vector& surfaceBuffer) +{ + if (surfaceBuffer && (surfaceBuffer->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE)) { + GSError err = surfaceBuffer->FlushCache(); + bool cond = err != GSERROR_OK; + CHECK_ERROR_PRINT_LOG(cond, "ImageUtils FlushCache failed, GSError=%{public}d", err); + } +} +#endif + void ImageUtils::FlushSurfaceBuffer(PixelMap* pixelMap) { #if !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) diff --git a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp index a64b200fd..bc8816300 100644 --- a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp +++ b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp @@ -737,6 +737,7 @@ uint32_t ExtEncoder::EncodeHeifByPixelmap(PixelMap* pixelmap, const PlEncodeOpti cond = pixelmap->GetFd() == nullptr; CHECK_ERROR_RETURN_RET_LOG(cond, ERR_IMAGE_INVALID_PARAMETER, "EncodeHeifByPixelmap pixelmap get fd failed"); surfaceBuffer = sptr(reinterpret_cast(pixelmap->GetFd())); + ImageUtils::DoFlushSurfaceBuffer(surfaceBuffer); } std::vector inputImgs; std::shared_ptr primaryItem = AssemblePrimaryImageItem(surfaceBuffer, opts); @@ -836,12 +837,7 @@ sptr ExtEncoder::ConvertToSurfaceBuffer(PixelMap* pixelmap) dstSize -= dstStride; src += srcStride; } - if (surfaceBuffer && (surfaceBuffer->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE)) { - GSError err = surfaceBuffer->FlushCache(); - if (err != GSERROR_OK) { - IMAGE_LOGE("FlushCache failed, GSError=%{public}d", err); - } - } + ImageUtils::DoFlushSurfaceBuffer(surfaceBuffer); return surfaceBuffer; } @@ -852,6 +848,7 @@ sptr ExtEncoder::ConvertPixelMapToDmaBuffer(std::shared_ptr(reinterpret_cast(pixelmap->GetFd())); + ImageUtils::DoFlushSurfaceBuffer(surfaceBuffer); } return surfaceBuffer; } @@ -1160,6 +1157,7 @@ uint32_t ExtEncoder::AssembleHeifHdrPicture( CHECK_ERROR_RETURN_RET_LOG(cond, ERR_IMAGE_INVALID_PARAMETER, "%{public}s, the gainPixelMap is nullptr or gainPixelMap is nonDMA", __func__); sptr gainMapSptr(reinterpret_cast(gainPixelMap->GetFd())); + ImageUtils::DoFlushSurfaceBuffer(gainMapSptr); HdrMetadata metadata = GetHdrMetadata(mainSptr, gainMapSptr); ColorManager::ColorSpaceName colorspaceName = @@ -1513,6 +1511,7 @@ uint32_t ExtEncoder::EncodeSdrImage(ExtWStream& outputStream) cond = baseSptr == nullptr; CHECK_ERROR_RETURN_RET_LOG(cond, IMAGE_RESULT_CREATE_SURFAC_FAILED, "EncodeSdrImage sdr buffer alloc failed"); sptr hdrSurfaceBuffer(reinterpret_cast(pixelmap_->GetFd())); + ImageUtils::DoFlushSurfaceBuffer(hdrSurfaceBuffer); VpeUtils::SetSbMetadataType(hdrSurfaceBuffer, CM_IMAGE_HDR_VIVID_SINGLE); SetHdrColorSpaceType(hdrSurfaceBuffer); VpeSurfaceBuffers buffers = { @@ -1730,12 +1729,7 @@ uint32_t ExtEncoder::EncodeEditScenePicture() sptr baseSptr(reinterpret_cast(mainPixelMap->GetFd())); cond = !baseSptr; CHECK_ERROR_RETURN_RET_LOG(cond, IMAGE_RESULT_CREATE_SURFAC_FAILED, "creat main pixels surfaceBuffer error"); - if (baseSptr->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE) { - GSError err = baseSptr->FlushCache(); - if (err != GSERROR_OK) { - IMAGE_LOGE("FlushCache failed, GSError=%{public}d", err); - } - } + ImageUtils::DoFlushSurfaceBuffer(baseSptr); uint32_t errorCode = EncodeHeifPicture(baseSptr, baseInfo, sdrIsSRGB); RecycleResources(); return errorCode; -- Gitee From 612a6f2297976ba0b52f05b50ae52bf9f9e7cc07 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Thu, 31 Jul 2025 10:07:19 +0800 Subject: [PATCH 2/3] fix encode flush and imagesource memleak Signed-off-by: chenzhaohui Change-Id: I483a9d50cdc7a1d6332797303f4a2e50ba9b5dab --- frameworks/innerkitsimpl/stream/src/file_packer_stream.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/innerkitsimpl/stream/src/file_packer_stream.cpp b/frameworks/innerkitsimpl/stream/src/file_packer_stream.cpp index dde431e90..3eac6a32a 100644 --- a/frameworks/innerkitsimpl/stream/src/file_packer_stream.cpp +++ b/frameworks/innerkitsimpl/stream/src/file_packer_stream.cpp @@ -76,6 +76,8 @@ FilePackerStream::FilePackerStream(const int fd) file_ = fdopen(dupFd, "wb"); if (file_ == nullptr) { IMAGE_LOGE("[FilePackerStream]open file fail. error:%{public}d", errno); + close(dupFd); + return; } } FilePackerStream::~FilePackerStream() -- Gitee From 6c76ef4297276844802241e7677e486e5c4ea8f0 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Thu, 31 Jul 2025 16:43:00 +0800 Subject: [PATCH 3/3] fix encode flush and imagesource memleak Signed-off-by: chenzhaohui Change-Id: I810cc0759b8f2d870ecd7a078a27c1c3fd8ec500 --- frameworks/innerkitsimpl/utils/include/image_utils.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/innerkitsimpl/utils/include/image_utils.h b/frameworks/innerkitsimpl/utils/include/image_utils.h index f8323e603..57feacf6a 100644 --- a/frameworks/innerkitsimpl/utils/include/image_utils.h +++ b/frameworks/innerkitsimpl/utils/include/image_utils.h @@ -83,9 +83,6 @@ public: static void FloatToBytes(float data, std::vector& bytes, uint32_t& offset, bool isBigEndian = true); static void Int32ToBytes(int32_t data, std::vector& bytes, uint32_t& offset, bool isBigEndian = true); static void ArrayToBytes(const uint8_t* data, uint32_t length, std::vector& bytes, uint32_t& offset); -#if !defined(CROSS_PLATFORM) - static void DoFlushSurfaceBuffer(sptr& surfaceBuffer); -#endif static void FlushSurfaceBuffer(PixelMap* pixelMap); static void FlushContextSurfaceBuffer(ImagePlugin::DecodeContext& context); static void InvalidateContextSurfaceBuffer(ImagePlugin::DecodeContext& context); @@ -163,6 +160,9 @@ public: static uint16_t GetRGBA1010102ColorG(uint32_t color); static uint16_t GetRGBA1010102ColorB(uint32_t color); static uint16_t GetRGBA1010102ColorA(uint32_t color); +#if !defined(CROSS_PLATFORM) + static void DoFlushSurfaceBuffer(sptr& surfaceBuffer); +#endif private: static uint32_t RegisterPluginServer(); static uint32_t SaveDataToFile(const std::string& fileName, const char* data, const size_t& totalSize); -- Gitee