From 7962a398d3fa4578389335efa7fb72b776fb47be Mon Sep 17 00:00:00 2001 From: caochuan Date: Fri, 11 Feb 2022 11:04:01 +0800 Subject: [PATCH] add release buffer. Signed-off-by: caochuan --- .../innerkitsimpl/receiver/include/image_receiver.h | 1 + .../innerkitsimpl/receiver/src/image_receiver.cpp | 9 +++++++++ frameworks/kits/js/common/image_napi.cpp | 10 +++++++++- frameworks/kits/js/common/image_receiver_napi.cpp | 4 ++-- interfaces/kits/js/common/include/image_napi.h | 6 +++++- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/frameworks/innerkitsimpl/receiver/include/image_receiver.h b/frameworks/innerkitsimpl/receiver/include/image_receiver.h index f646bcf41..0b8288f1f 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); + int32_t 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..0f622527c 100644 --- a/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp +++ b/frameworks/innerkitsimpl/receiver/src/image_receiver.cpp @@ -115,6 +115,11 @@ namespace OHOS { return 0; } + int32_t ImageReceiver::ReleaseBuffer(OHOS::sptr buffer) + { + return (iraContext_->GetReceiverBufferConsumer())->ReleaseBuffer(buffer, -1); + } + void ImageReceiverSurfaceListener ::OnBufferAvailable() { HiLog::Debug(LABEL, "OnBufferAvailable"); @@ -200,6 +205,10 @@ namespace OHOS { sptr listenerConsumerSerface = iraContext_->GetReceiverBufferConsumer(); SurfaceError surfaceError = listenerConsumerSerface->AcquireBuffer(buffer, flushFence, timestamp, damage); while (surfaceError == SURFACE_ERROR_OK) { + if (bufferBefore != nullptr) { + ReleaseBuffer(bufferBefore); + bufferBefore = nullptr; + } 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..19d992d5a 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; @@ -94,6 +95,10 @@ static void CommonCallbackRoutine(napi_env env, ImageAsyncContext* &context, void ImageNapi::NativeRelease() { if (sSurfaceBuffer_ != nullptr) { + if (imageReceiver_ != nullptr) { + imageReceiver_->ReleaseBuffer(sSurfaceBuffer_); + imageReceiver_ = nullptr; + } sSurfaceBuffer_ = nullptr; } } @@ -150,6 +155,7 @@ napi_value ImageNapi::Constructor(napi_env env, napi_callback_info info) if (reference != nullptr) { reference->env_ = env; reference->sSurfaceBuffer_ = staticInstance_; + reference->imageReceiver_ = staticImageReceiverInstance_; status = napi_wrap(env, thisVar, reinterpret_cast(reference.get()), ImageNapi::Destructor, nullptr, &(reference->wrapper_)); if (status == napi_ok) { @@ -174,7 +180,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 +196,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(); 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