diff --git a/frameworks/innerkitsimpl/receiver/include/image_receiver.h b/frameworks/innerkitsimpl/receiver/include/image_receiver.h index f646bcf4163c4c82a2ddd6401d87cee2c1a9602c..bd5e721393f4fb8637a0f852d33ce122dded2c36 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 30a47ff168fa9810526ed1551c6cc36a42dd662c..67c1d0daf072d4a24e45a2ad111b33d7fd820e1d 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"); diff --git a/frameworks/kits/js/common/image_napi.cpp b/frameworks/kits/js/common/image_napi.cpp index 36028722e6f6941f0bd70513542e5881fdfb5073..4c5fd193a3eaa4327d90e8adbfa1362526c799c4 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 6d273cf160fa39daf1d247bc5553dc49e4db16fc..befb7245f245086b191e1d7b353b98d8a2fc6215 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 5b3737a67aa3015e0ece8a27dc3cafe64d1315ad..ab85d94bdcca13f241de7b24861b1a6e03aa2096 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 {