From 6ceafb5790f8c350a3e9142c805dcb65f5579834 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Wed, 13 Aug 2025 18:04:40 +0800 Subject: [PATCH 1/3] fix heif encode flush surface buffer Signed-off-by: chenzhaohui Change-Id: I27a877bd54f8aa5530129c05a454245017e70f8f --- .../test/unittest/jpg_yuv_test.cpp | 1 + .../test/unittest/pixel_astc_test.cpp | 2 +- .../unittest/pixel_map_test/pixel_map_test.cpp | 2 +- .../test/unittest/post_proc_test.cpp | 1 + .../test/unittest/scan_line_filter_test.cpp | 1 + .../innerkitsimpl/utils/include/image_utils.h | 7 +++++++ .../innerkitsimpl/utils/src/image_utils.cpp | 13 +++++++++++-- .../image/libextplugin/src/ext_encoder.cpp | 18 ++++++------------ 8 files changed, 29 insertions(+), 16 deletions(-) diff --git a/frameworks/innerkitsimpl/test/unittest/jpg_yuv_test.cpp b/frameworks/innerkitsimpl/test/unittest/jpg_yuv_test.cpp index d78b7761a..3afa31144 100644 --- a/frameworks/innerkitsimpl/test/unittest/jpg_yuv_test.cpp +++ b/frameworks/innerkitsimpl/test/unittest/jpg_yuv_test.cpp @@ -34,6 +34,7 @@ using namespace OHOS::ImageSourceUtil; namespace OHOS { namespace Multimedia { +using Rect = OHOS::Media::Rect; static const std::string IMAGE_INPUT_JPG_PATH = "/data/local/tmp/image/"; static const std::string IMAGE_OUTPUT_JPG_PATH = "/data/local/tmp/"; static const std::string IMAGE_INPUT_YUV_PATH3 = "/data/local/tmp/image/P010.yuv"; diff --git a/frameworks/innerkitsimpl/test/unittest/pixel_astc_test.cpp b/frameworks/innerkitsimpl/test/unittest/pixel_astc_test.cpp index efeb27d24..bcc878f4c 100644 --- a/frameworks/innerkitsimpl/test/unittest/pixel_astc_test.cpp +++ b/frameworks/innerkitsimpl/test/unittest/pixel_astc_test.cpp @@ -28,7 +28,7 @@ using namespace testing::ext; using namespace OHOS::Media; namespace OHOS { namespace Multimedia { - +using Rect = OHOS::Media::Rect; constexpr uint8_t ASTC_MAGIC_0 = 0x13; // ASTC MAGIC ID 0x13 constexpr uint8_t ASTC_MAGIC_1 = 0xAB; // ASTC MAGIC ID 0xAB constexpr uint8_t ASTC_MAGIC_2 = 0xA1; // ASTC MAGIC ID 0xA1 diff --git a/frameworks/innerkitsimpl/test/unittest/pixel_map_test/pixel_map_test.cpp b/frameworks/innerkitsimpl/test/unittest/pixel_map_test/pixel_map_test.cpp index e2c12207d..622cfd010 100644 --- a/frameworks/innerkitsimpl/test/unittest/pixel_map_test/pixel_map_test.cpp +++ b/frameworks/innerkitsimpl/test/unittest/pixel_map_test/pixel_map_test.cpp @@ -30,7 +30,7 @@ using namespace testing::ext; using namespace OHOS::Media; namespace OHOS { namespace Multimedia { - +using Rect = OHOS::Media::Rect; constexpr int8_t ARGB_8888_BYTES = 4; const uint8_t red = 0xFF; const uint8_t green = 0x8F; diff --git a/frameworks/innerkitsimpl/test/unittest/post_proc_test.cpp b/frameworks/innerkitsimpl/test/unittest/post_proc_test.cpp index fbdb85008..511204956 100644 --- a/frameworks/innerkitsimpl/test/unittest/post_proc_test.cpp +++ b/frameworks/innerkitsimpl/test/unittest/post_proc_test.cpp @@ -30,6 +30,7 @@ using namespace OHOS::Media; namespace OHOS { namespace Multimedia { +using Rect = OHOS::Media::Rect; static const std::string IMAGE_INPUT_JPEG_PATH = "/data/local/tmp/image/test.jpg"; static const std::string IMAGE_INPUT_JPG_PATH_EXACTSIZE = "/data/local/tmp/image/800-500.jpg"; static constexpr int32_t IMAGE_INPUT_JPG_WIDTH = 800; diff --git a/frameworks/innerkitsimpl/test/unittest/scan_line_filter_test.cpp b/frameworks/innerkitsimpl/test/unittest/scan_line_filter_test.cpp index e94bc420c..19474cc1c 100644 --- a/frameworks/innerkitsimpl/test/unittest/scan_line_filter_test.cpp +++ b/frameworks/innerkitsimpl/test/unittest/scan_line_filter_test.cpp @@ -30,6 +30,7 @@ using namespace testing::ext; using namespace OHOS::Media; namespace OHOS { namespace Multimedia { +using Rect = OHOS::Media::Rect; class ScanLineFilterTest : public testing::Test { public: ScanLineFilterTest() {} diff --git a/frameworks/innerkitsimpl/utils/include/image_utils.h b/frameworks/innerkitsimpl/utils/include/image_utils.h index fd8261b66..4968f232f 100644 --- a/frameworks/innerkitsimpl/utils/include/image_utils.h +++ b/frameworks/innerkitsimpl/utils/include/image_utils.h @@ -21,6 +21,10 @@ #include #include "image_type.h" #include "iosfwd" +#if !defined(CROSS_PLATFORM) +#include "surface_type.h" +#include "surface_buffer.h" +#endif namespace OHOS { namespace MultimediaPlugin { class PluginServer; } } namespace OHOS { namespace ImagePlugin { struct DecodeContext; } } @@ -157,6 +161,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 FlushSurfaceBuffer(sptr& surfaceBuffer); +#endif private: static uint32_t RegisterPluginServer(); static uint32_t SaveDataToFile(const std::string& fileName, const char* data, const size_t& totalSize); diff --git a/frameworks/innerkitsimpl/utils/src/image_utils.cpp b/frameworks/innerkitsimpl/utils/src/image_utils.cpp index a62f547e2..2d0f26738 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -47,8 +47,6 @@ #include #endif #if !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM) -#include "surface_type.h" -#include "surface_buffer.h" #include "bundle_mgr_interface.h" #include "iservice_registry.h" #include "ipc_skeleton.h" @@ -982,6 +980,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 167ce5642..f67bfe38f 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::FlushSurfaceBuffer(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::FlushSurfaceBuffer(surfaceBuffer); return surfaceBuffer; } @@ -852,6 +848,7 @@ sptr ExtEncoder::ConvertPixelMapToDmaBuffer(std::shared_ptr(reinterpret_cast(pixelmap->GetFd())); + ImageUtils::FlushSurfaceBuffer(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::FlushSurfaceBuffer(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::FlushSurfaceBuffer(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::FlushSurfaceBuffer(baseSptr); uint32_t errorCode = EncodeHeifPicture(baseSptr, baseInfo, sdrIsSRGB); RecycleResources(); return errorCode; -- Gitee From ebb8c0196e89d40f061016d16b525e564b5c8625 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Wed, 13 Aug 2025 18:24:03 +0800 Subject: [PATCH 2/3] fix heif encode flush surface buffer Signed-off-by: chenzhaohui Change-Id: Ib28fbc9e0ea84c284696636a188925b797cc0531 --- frameworks/innerkitsimpl/utils/src/image_utils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/innerkitsimpl/utils/src/image_utils.cpp b/frameworks/innerkitsimpl/utils/src/image_utils.cpp index 2d0f26738..6ef30c429 100644 --- a/frameworks/innerkitsimpl/utils/src/image_utils.cpp +++ b/frameworks/innerkitsimpl/utils/src/image_utils.cpp @@ -981,7 +981,7 @@ void ImageUtils::ArrayToBytes(const uint8_t* data, uint32_t length, vector& surfaceBuffer) +void ImageUtils::FlushSurfaceBuffer(sptr& surfaceBuffer) { if (surfaceBuffer && (surfaceBuffer->GetUsage() & BUFFER_USAGE_MEM_MMZ_CACHE)) { GSError err = surfaceBuffer->FlushCache(); -- Gitee From 7c7118bde8e23a2b52c69439b62e623a1afb4a84 Mon Sep 17 00:00:00 2001 From: chenzhaohui Date: Wed, 13 Aug 2025 18:49:05 +0800 Subject: [PATCH 3/3] fix heif encode flush surface buffer Signed-off-by: chenzhaohui Change-Id: I1b817e1216814c044787211f8ee3309a5460436a --- .../test/unittest/pixel_map_test/pixel_map_astc_test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/innerkitsimpl/test/unittest/pixel_map_test/pixel_map_astc_test.cpp b/frameworks/innerkitsimpl/test/unittest/pixel_map_test/pixel_map_astc_test.cpp index dfae6c6fd..3646f0349 100644 --- a/frameworks/innerkitsimpl/test/unittest/pixel_map_test/pixel_map_astc_test.cpp +++ b/frameworks/innerkitsimpl/test/unittest/pixel_map_test/pixel_map_astc_test.cpp @@ -28,6 +28,7 @@ using namespace testing::ext; using namespace OHOS::Media; namespace OHOS { namespace Multimedia { +using Rect = OHOS::Media::Rect; constexpr uint8_t ASTC_MAGIC_0 = 0x13; // ASTC MAGIC ID 0x13 constexpr uint8_t ASTC_MAGIC_1 = 0xAB; // ASTC MAGIC ID 0xAB constexpr uint8_t ASTC_MAGIC_2 = 0xA1; // ASTC MAGIC ID 0xA1 -- Gitee