From 495388ed79103125c76eca15ea4534dad7b75a19 Mon Sep 17 00:00:00 2001 From: zhang-xiaobo1997 Date: Wed, 16 Feb 2022 16:16:48 +0800 Subject: [PATCH 1/2] Add release buffer in imagerReciever Signed-off-by: zhang-xiaobo1997 --- .../receiver/include/image_receiver.h | 1 + .../receiver/src/image_receiver.cpp | 18 ++++++++++++++++++ frameworks/kits/js/common/image_napi.cpp | 13 ++++++++++++- .../kits/js/common/image_receiver_napi.cpp | 4 ++-- interfaces/kits/js/common/include/image_napi.h | 6 +++++- 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/frameworks/innerkitsimpl/receiver/include/image_receiver.h b/frameworks/innerkitsimpl/receiver/include/image_receiver.h index f646bcf41..bd5e72139 100644 --- a/frameworks/innerkitsimpl/receiver/include/image_receiver.h +++ b/frameworks/innerkitsimpl/receiver/include/image_receiver.h @@ -66,6 +66,7 @@ public: OHOS::sptr buffer, InitializationOptions initializationOpts); int32_t SaveBufferAsImage(int &fd, InitializationOptions initializationOpts); + void ReleaseBuffer(OHOS::sptr &buffer); std::unique_ptr getSurfacePixelMap(InitializationOptions initializationOpts); void RegisterBufferAvaliableListener( std::shared_ptr surfaceBufferAvaliableListener) diff --git a/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp b/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp index 30a47ff16..e7fd22530 100644 --- a/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp +++ b/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp @@ -115,6 +115,23 @@ namespace OHOS { return 0; } + void ImageReceiver::ReleaseBuffer(OHOS::sptr &buffer) + { + if (buffer != nullptr) { + if (iraContext_ != nullptr) { + auto listenerConsumerSerface = iraContext_->GetReceiverBufferConsumer(); + if (listenerConsumerSerface != nullptr) { + listenerConsumerSerface->ReleaseBuffer(buffer, -1); + } else { + HiLog::Debug(LABEL, "listenerConsumerSerface == nullptr"); + } + } else { + HiLog::Debug(LABEL, "iraContext_ == nullptr"); + } + buffer = nullptr; + } + } + void ImageReceiverSurfaceListener ::OnBufferAvailable() { HiLog::Debug(LABEL, "OnBufferAvailable"); @@ -200,6 +217,7 @@ namespace OHOS { sptr listenerConsumerSerface = iraContext_->GetReceiverBufferConsumer(); SurfaceError surfaceError = listenerConsumerSerface->AcquireBuffer(buffer, flushFence, timestamp, damage); while (surfaceError == SURFACE_ERROR_OK) { + ReleaseBuffer(bufferBefore); bufferBefore = buffer; surfaceError = listenerConsumerSerface->AcquireBuffer(buffer, flushFence, timestamp, damage); } diff --git a/frameworks/kits/js/common/image_napi.cpp b/frameworks/kits/js/common/image_napi.cpp index 36028722e..4c5fd193a 100644 --- a/frameworks/kits/js/common/image_napi.cpp +++ b/frameworks/kits/js/common/image_napi.cpp @@ -33,6 +33,7 @@ namespace { namespace OHOS { namespace Media { static const std::string CLASS_NAME = "ImageNapi"; +std::shared_ptr ImageNapi::staticImageReceiverInstance_ = nullptr; sptr ImageNapi::staticInstance_ = nullptr; napi_ref ImageNapi::sConstructor_ = nullptr; @@ -93,6 +94,10 @@ static void CommonCallbackRoutine(napi_env env, ImageAsyncContext* &context, void ImageNapi::NativeRelease() { + if (imageReceiver_ != nullptr) { + imageReceiver_->ReleaseBuffer(sSurfaceBuffer_); + imageReceiver_ = nullptr; + } if (sSurfaceBuffer_ != nullptr) { sSurfaceBuffer_ = nullptr; } @@ -150,6 +155,8 @@ napi_value ImageNapi::Constructor(napi_env env, napi_callback_info info) if (reference != nullptr) { reference->env_ = env; reference->sSurfaceBuffer_ = staticInstance_; + reference->imageReceiver_ = staticImageReceiverInstance_; + staticImageReceiverInstance_ = nullptr; status = napi_wrap(env, thisVar, reinterpret_cast(reference.get()), ImageNapi::Destructor, nullptr, &(reference->wrapper_)); if (status == napi_ok) { @@ -174,7 +181,8 @@ void ImageNapi::Destructor(napi_env env, void *nativeObject, void *finalize) } } -napi_value ImageNapi::Create(napi_env env, sptr surfaceBuffer) +napi_value ImageNapi::Create(napi_env env, sptr surfaceBuffer, + std::shared_ptr imageReceiver) { napi_status status; napi_value constructor = nullptr, result = nullptr; @@ -189,6 +197,7 @@ napi_value ImageNapi::Create(napi_env env, sptr surfaceBuffer) status = napi_get_reference_value(env, sConstructor_, &constructor); if (IMG_IS_OK(status)) { staticInstance_ = surfaceBuffer; + staticImageReceiverInstance_ = imageReceiver; status = napi_new_instance(env, constructor, 0, nullptr, &result); if (status == napi_ok) { IMAGE_FUNCTION_OUT(); @@ -407,6 +416,8 @@ napi_value ImageNapi::JsRelease(napi_env env, napi_callback_info info) return result; } + context.release(); + IMAGE_FUNCTION_OUT(); return result; } diff --git a/frameworks/kits/js/common/image_receiver_napi.cpp b/frameworks/kits/js/common/image_receiver_napi.cpp index 6d273cf16..befb7245f 100644 --- a/frameworks/kits/js/common/image_receiver_napi.cpp +++ b/frameworks/kits/js/common/image_receiver_napi.cpp @@ -610,7 +610,7 @@ napi_value ImageReceiverNapi::JsReadLatestImage(napi_env env, napi_callback_info DoCallBackTest(surfacebuffer); } #endif - result = ImageNapi::Create(env, surfacebuffer); + result = ImageNapi::Create(env, surfacebuffer, native); if (result == nullptr) { IMAGE_ERR("ImageNapi Create failed"); context->status = ERR_IMAGE_INIT_ABNORMAL; @@ -656,7 +656,7 @@ napi_value ImageReceiverNapi::JsReadNextImage(napi_env env, napi_callback_info i DoCallBackTest(surfacebuffer); } #endif - result = ImageNapi::Create(env, surfacebuffer); + result = ImageNapi::Create(env, surfacebuffer, native); if (result == nullptr) { IMAGE_ERR("ImageNapi Create failed"); context->status = ERR_IMAGE_INIT_ABNORMAL; diff --git a/interfaces/kits/js/common/include/image_napi.h b/interfaces/kits/js/common/include/image_napi.h index 5b3737a67..ab85d94bd 100644 --- a/interfaces/kits/js/common/include/image_napi.h +++ b/interfaces/kits/js/common/include/image_napi.h @@ -28,6 +28,7 @@ #include #include "napi/native_api.h" #include "napi/native_node_api.h" +#include "image_receiver.h" namespace OHOS { namespace Media { @@ -37,7 +38,8 @@ public: ImageNapi(); ~ImageNapi(); static napi_value Init(napi_env env, napi_value exports); - static napi_value Create(napi_env env, sptr surfaceBuffer); + static napi_value Create(napi_env env, sptr surfaceBuffer, + std::shared_ptr imageReceiver); void NativeRelease(); private: @@ -56,10 +58,12 @@ private: static napi_ref sConstructor_; static sptr staticInstance_; + static std::shared_ptr staticImageReceiverInstance_; napi_env env_ = nullptr; napi_ref wrapper_ = nullptr; sptr sSurfaceBuffer_; + std::shared_ptr imageReceiver_; }; struct ImageAsyncContext { -- Gitee From 59abc2e73ad2805592970655fb6c60c086804d8d Mon Sep 17 00:00:00 2001 From: zhang-xiaobo1997 Date: Wed, 16 Feb 2022 21:48:20 +0800 Subject: [PATCH 2/2] Add release surface buffer Signed-off-by: zhang-xiaobo1997 --- frameworks/innerkitsimpl/receiver/src/image_receiver.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp b/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp index e7fd22530..67c1d0daf 100644 --- a/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp +++ b/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp @@ -217,7 +217,6 @@ namespace OHOS { sptr listenerConsumerSerface = iraContext_->GetReceiverBufferConsumer(); SurfaceError surfaceError = listenerConsumerSerface->AcquireBuffer(buffer, flushFence, timestamp, damage); while (surfaceError == SURFACE_ERROR_OK) { - ReleaseBuffer(bufferBefore); bufferBefore = buffer; surfaceError = listenerConsumerSerface->AcquireBuffer(buffer, flushFence, timestamp, damage); } -- Gitee