From 186bf7f5e94e06774df34572301cae9f6a2e2845 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Wed, 30 Jul 2025 18:59:22 +0800 Subject: [PATCH 1/3] fix encode flush and memleak Signed-off-by: chenzhaohui Change-Id: I783627e6aaf7dfe46cf6532812b5adbe9a2237ef --- .../stream/src/file_source_stream.cpp | 2 ++ .../image/libextplugin/include/ext_encoder.h | 1 + .../image/libextplugin/src/ext_encoder.cpp | 27 ++++++++++--------- 3 files changed, 18 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/plugins/common/libs/image/libextplugin/include/ext_encoder.h b/plugins/common/libs/image/libextplugin/include/ext_encoder.h index 6e1c56133..a52fe7f2b 100644 --- a/plugins/common/libs/image/libextplugin/include/ext_encoder.h +++ b/plugins/common/libs/image/libextplugin/include/ext_encoder.h @@ -120,6 +120,7 @@ private: std::shared_ptr AssembleGainmapImageItem(sptr& surfaceBuffer, ColorManager::ColorSpaceName color, const PlEncodeOptions& opts); + void FlushEncodeSurfaceBuffer(sptr& surfaceBuffer); uint32_t AssembleSdrImageItem(sptr& surfaceBuffer, SkImageInfo sdrInfo, std::vector& inputImgs); uint32_t AssembleHeifHdrPicture( diff --git a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp index a64b200fd..5a3ed84fe 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())); + FlushEncodeSurfaceBuffer(surfaceBuffer); } std::vector inputImgs; std::shared_ptr primaryItem = AssemblePrimaryImageItem(surfaceBuffer, opts); @@ -796,6 +797,15 @@ static sptr AllocSurfaceBuffer(int32_t width, int32_t height, return sb; } +void ExtEncoder::FlushEncodeSurfaceBuffer(sptr& surfaceBuffer) +{ + if (surfaceBuffer && (surfaceBuffer->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE)) { + GSError err = surfaceBuffer->FlushCache(); + bool cond = err != GSERROR_OK; + CHECK_ERROR_PRINT_LOG(cond, "FlushCache failed, GSError=%{public}d", err); + } +} + sptr ExtEncoder::ConvertToSurfaceBuffer(PixelMap* pixelmap) { bool cond = pixelmap->GetHeight() <= 0 || pixelmap->GetWidth() <= 0; @@ -836,12 +846,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); - } - } + FlushEncodeSurfaceBuffer(surfaceBuffer); return surfaceBuffer; } @@ -852,6 +857,7 @@ sptr ExtEncoder::ConvertPixelMapToDmaBuffer(std::shared_ptr(reinterpret_cast(pixelmap->GetFd())); + FlushEncodeSurfaceBuffer(surfaceBuffer); } return surfaceBuffer; } @@ -1160,6 +1166,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())); + FlushEncodeSurfaceBuffer(gainMapSptr); HdrMetadata metadata = GetHdrMetadata(mainSptr, gainMapSptr); ColorManager::ColorSpaceName colorspaceName = @@ -1513,6 +1520,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())); + FlushEncodeSurfaceBuffer(hdrSurfaceBuffer); VpeUtils::SetSbMetadataType(hdrSurfaceBuffer, CM_IMAGE_HDR_VIVID_SINGLE); SetHdrColorSpaceType(hdrSurfaceBuffer); VpeSurfaceBuffers buffers = { @@ -1730,12 +1738,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); - } - } + FlushEncodeSurfaceBuffer(baseSptr); uint32_t errorCode = EncodeHeifPicture(baseSptr, baseInfo, sdrIsSRGB); RecycleResources(); return errorCode; -- Gitee From 657e3ea984e9d9edd758cd920eb34e33b74199b9 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Wed, 30 Jul 2025 20:08:16 +0800 Subject: [PATCH 2/3] fix encode flush and memleak Signed-off-by: chenzhaohui Change-Id: Ibef758737e6c35546d0c1df87c6723281ee55617 --- plugins/common/libs/image/libextplugin/include/ext_encoder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/common/libs/image/libextplugin/include/ext_encoder.h b/plugins/common/libs/image/libextplugin/include/ext_encoder.h index a52fe7f2b..99217af5d 100644 --- a/plugins/common/libs/image/libextplugin/include/ext_encoder.h +++ b/plugins/common/libs/image/libextplugin/include/ext_encoder.h @@ -78,6 +78,7 @@ private: #if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) sptr ConvertToSurfaceBuffer(Media::PixelMap* pixelmap); sptr ConvertPixelMapToDmaBuffer(std::shared_ptr pixelmap); + void FlushEncodeSurfaceBuffer(sptr& surfaceBuffer); uint32_t EncodeSdrImage(ExtWStream& outputStream); uint32_t EncodeDualVivid(ExtWStream& outputStream); uint32_t EncodeSingleVivid(ExtWStream& outputStream); @@ -120,7 +121,6 @@ private: std::shared_ptr AssembleGainmapImageItem(sptr& surfaceBuffer, ColorManager::ColorSpaceName color, const PlEncodeOptions& opts); - void FlushEncodeSurfaceBuffer(sptr& surfaceBuffer); uint32_t AssembleSdrImageItem(sptr& surfaceBuffer, SkImageInfo sdrInfo, std::vector& inputImgs); uint32_t AssembleHeifHdrPicture( -- Gitee From 393101476bda14eec6600749b1d12d2a1eaebad5 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Wed, 30 Jul 2025 21:59:46 +0800 Subject: [PATCH 3/3] fix encode flush and memleak Signed-off-by: chenzhaohui Change-Id: Idb4f30240253b23e49bf39e81f2063fd1627c807 --- .../innerkitsimpl/utils/include/image_utils.h | 6 ++++ .../innerkitsimpl/utils/src/image_utils.cpp | 35 +++++++++---------- .../image/libextplugin/include/ext_encoder.h | 1 - .../image/libextplugin/src/ext_encoder.cpp | 21 ++++------- 4 files changed, 29 insertions(+), 34 deletions(-) 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..6a132c59d 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -981,13 +981,9 @@ void ImageUtils::ArrayToBytes(const uint8_t* data, uint32_t length, vector& surfaceBuffer) { -#if !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) - if (!pixelMap || pixelMap->GetAllocatorType() != AllocatorType::DMA_ALLOC) { - return; - } - SurfaceBuffer* surfaceBuffer = static_cast(pixelMap->GetFd()); if (surfaceBuffer && (surfaceBuffer->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE)) { GSError err = surfaceBuffer->Map(); if (err != GSERROR_OK) { @@ -999,6 +995,18 @@ void ImageUtils::FlushSurfaceBuffer(PixelMap* pixelMap) IMAGE_LOGE("ImageUtils FlushCache failed, GSError=%{public}d", err); } } +} +#endif + +void ImageUtils::FlushSurfaceBuffer(PixelMap* pixelMap) +{ +#if !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) + if (!pixelMap || pixelMap->GetAllocatorType() != AllocatorType::DMA_ALLOC) { + return; + } + sptr surfaceBuffer = + sptr(reinterpret_cast(pixelMap->GetFd())); + DoFlushSurfaceBuffer(surfaceBuffer); #else return; #endif @@ -1010,18 +1018,9 @@ void ImageUtils::FlushContextSurfaceBuffer(ImagePlugin::DecodeContext& context) if (context.pixelsBuffer.context == nullptr || context.allocatorType != AllocatorType::DMA_ALLOC) { return; } - SurfaceBuffer* surfaceBuffer = static_cast(context.pixelsBuffer.context); - if (surfaceBuffer && (surfaceBuffer->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE)) { - GSError err = surfaceBuffer->Map(); - if (err != GSERROR_OK) { - IMAGE_LOGE("ImageUtils Map failed, GSError=%{public}d", err); - return; - } - err = surfaceBuffer->FlushCache(); - if (err != GSERROR_OK) { - IMAGE_LOGE("ImageUtils FlushCache failed, GSError=%{public}d", err); - } - } + sptr surfaceBuffer = + sptr(reinterpret_cast(context.pixelsBuffer.context)); + DoFlushSurfaceBuffer(surfaceBuffer); #else return; #endif diff --git a/plugins/common/libs/image/libextplugin/include/ext_encoder.h b/plugins/common/libs/image/libextplugin/include/ext_encoder.h index 99217af5d..6e1c56133 100644 --- a/plugins/common/libs/image/libextplugin/include/ext_encoder.h +++ b/plugins/common/libs/image/libextplugin/include/ext_encoder.h @@ -78,7 +78,6 @@ private: #if !defined(_WIN32) && !defined(_APPLE) && !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) sptr ConvertToSurfaceBuffer(Media::PixelMap* pixelmap); sptr ConvertPixelMapToDmaBuffer(std::shared_ptr pixelmap); - void FlushEncodeSurfaceBuffer(sptr& surfaceBuffer); uint32_t EncodeSdrImage(ExtWStream& outputStream); uint32_t EncodeDualVivid(ExtWStream& outputStream); uint32_t EncodeSingleVivid(ExtWStream& outputStream); diff --git a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp index 5a3ed84fe..bc8816300 100644 --- a/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp +++ b/plugins/common/libs/image/libextplugin/src/ext_encoder.cpp @@ -737,7 +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())); - FlushEncodeSurfaceBuffer(surfaceBuffer); + ImageUtils::DoFlushSurfaceBuffer(surfaceBuffer); } std::vector inputImgs; std::shared_ptr primaryItem = AssemblePrimaryImageItem(surfaceBuffer, opts); @@ -797,15 +797,6 @@ static sptr AllocSurfaceBuffer(int32_t width, int32_t height, return sb; } -void ExtEncoder::FlushEncodeSurfaceBuffer(sptr& surfaceBuffer) -{ - if (surfaceBuffer && (surfaceBuffer->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE)) { - GSError err = surfaceBuffer->FlushCache(); - bool cond = err != GSERROR_OK; - CHECK_ERROR_PRINT_LOG(cond, "FlushCache failed, GSError=%{public}d", err); - } -} - sptr ExtEncoder::ConvertToSurfaceBuffer(PixelMap* pixelmap) { bool cond = pixelmap->GetHeight() <= 0 || pixelmap->GetWidth() <= 0; @@ -846,7 +837,7 @@ sptr ExtEncoder::ConvertToSurfaceBuffer(PixelMap* pixelmap) dstSize -= dstStride; src += srcStride; } - FlushEncodeSurfaceBuffer(surfaceBuffer); + ImageUtils::DoFlushSurfaceBuffer(surfaceBuffer); return surfaceBuffer; } @@ -857,7 +848,7 @@ sptr ExtEncoder::ConvertPixelMapToDmaBuffer(std::shared_ptr(reinterpret_cast(pixelmap->GetFd())); - FlushEncodeSurfaceBuffer(surfaceBuffer); + ImageUtils::DoFlushSurfaceBuffer(surfaceBuffer); } return surfaceBuffer; } @@ -1166,7 +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())); - FlushEncodeSurfaceBuffer(gainMapSptr); + ImageUtils::DoFlushSurfaceBuffer(gainMapSptr); HdrMetadata metadata = GetHdrMetadata(mainSptr, gainMapSptr); ColorManager::ColorSpaceName colorspaceName = @@ -1520,7 +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())); - FlushEncodeSurfaceBuffer(hdrSurfaceBuffer); + ImageUtils::DoFlushSurfaceBuffer(hdrSurfaceBuffer); VpeUtils::SetSbMetadataType(hdrSurfaceBuffer, CM_IMAGE_HDR_VIVID_SINGLE); SetHdrColorSpaceType(hdrSurfaceBuffer); VpeSurfaceBuffers buffers = { @@ -1738,7 +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"); - FlushEncodeSurfaceBuffer(baseSptr); + ImageUtils::DoFlushSurfaceBuffer(baseSptr); uint32_t errorCode = EncodeHeifPicture(baseSptr, baseInfo, sdrIsSRGB); RecycleResources(); return errorCode; -- Gitee