From 0ed9d9b0fde50c366cc2e5d39d4f486f846e6301 Mon Sep 17 00:00:00 2001 From: zhaona45 Date: Wed, 23 Apr 2025 18:03:18 +0800 Subject: [PATCH] =?UTF-8?q?ImageReceiver=20on=E5=9B=9E=E8=B0=83=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BC=A0=E5=85=A5=E7=94=A8=E6=88=B7=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhaona45 --- .../common/ndk/image_receiver_native.cpp | 42 ++++++++++++++++++- .../include/image/image_receiver_native.h | 29 +++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/frameworks/kits/native/common/ndk/image_receiver_native.cpp b/frameworks/kits/native/common/ndk/image_receiver_native.cpp index 886b5118..8cfe4a30 100644 --- a/frameworks/kits/native/common/ndk/image_receiver_native.cpp +++ b/frameworks/kits/native/common/ndk/image_receiver_native.cpp @@ -51,17 +51,27 @@ namespace Media { ~ImageReceiverListener() override { callback_ = nullptr; + callbackArrive_ = nullptr; } void OnSurfaceBufferAvaliable() __attribute__((no_sanitize("cfi"))) override { - if (nullptr != callback_) { - callback_(receiver_); + if (isArriveCallback_) { + if (nullptr != callbackArrive_) { + callbackArrive_(receiver_, userData_); + } + } else { + if (nullptr != callback_) { + callback_(receiver_); + } } } OH_ImageReceiverNative* receiver_; OH_ImageReceiver_OnCallback callback_; + OH_ImageReceiver_ImageArriveCallback callbackArrive_ = nullptr; + void* userData_ = nullptr; + bool isArriveCallback_ = false; }; } // namespace Media } // namespace OHOS @@ -299,6 +309,28 @@ Image_ErrorCode OH_ImageReceiverNative_On(OH_ImageReceiverNative* receiver, OH_I auto listener = std::make_shared(receiver); listener->callback_ = callback; + listener->isArriveCallback_ = false; + receiver->ptrImgRcv->RegisterBufferAvaliableListener(listener); + return IMAGE_SUCCESS; +} + +MIDK_EXPORT +Image_ErrorCode OH_ImageReceiverNative_OnImageArrive(OH_ImageReceiverNative* receiver, + OH_ImageReceiver_ImageArriveCallback callback, void* userData) +{ + if (nullptr == receiver || nullptr == callback) { + IMAGE_LOGE("OH_ImageReceiverNative_On: Invalid parameter"); + return IMAGE_BAD_PARAMETER; + } + if (nullptr == receiver->ptrImgRcv) { + IMAGE_LOGE("Bad parameter: receiver data empty."); + return IMAGE_BAD_PARAMETER; + } + + auto listener = std::make_shared(receiver); + listener->callbackArrive_ = callback; + listener->userData_ = userData; + listener->isArriveCallback_ = true; receiver->ptrImgRcv->RegisterBufferAvaliableListener(listener); return IMAGE_SUCCESS; } @@ -319,6 +351,12 @@ Image_ErrorCode OH_ImageReceiverNative_Off(OH_ImageReceiverNative* receiver) return IMAGE_SUCCESS; } +MIDK_EXPORT +Image_ErrorCode OH_ImageReceiverNative_OffImageArrive(OH_ImageReceiverNative* receiver) +{ + return OH_ImageReceiverNative_Off(receiver); +} + MIDK_EXPORT Image_ErrorCode OH_ImageReceiverNative_GetSize(OH_ImageReceiverNative* receiver, Image_Size* size) { diff --git a/interfaces/kits/native/include/image/image_receiver_native.h b/interfaces/kits/native/include/image/image_receiver_native.h index 39d4f89a..fa8c9a85 100644 --- a/interfaces/kits/native/include/image/image_receiver_native.h +++ b/interfaces/kits/native/include/image/image_receiver_native.h @@ -75,6 +75,13 @@ typedef struct OH_ImageReceiverOptions OH_ImageReceiverOptions; */ typedef void (*OH_ImageReceiver_OnCallback)(OH_ImageReceiverNative *receiver); +/** + * @brief brief Callback for ImageArrive event. + * + * @since 20 + */ +typedef void (*OH_ImageReceiver_ImageArriveCallback)(OH_ImageReceiverNative *receiver, void *userData); + /** * @brief Creates an OH_ImageReceiverOptions object at the application layer. * @@ -222,6 +229,28 @@ Image_ErrorCode OH_ImageReceiverNative_On(OH_ImageReceiverNative* receiver, OH_I */ Image_ErrorCode OH_ImageReceiverNative_Off(OH_ImageReceiverNative* receiver); +/** + * Registers an {@link OH_ImageReceiver_ImageArriveCallback} callback + * + * @param receiver The OH_ImageReceiverNative object that handle the callback. + * @param callback A OH_ImageReceiver_ImageArriveCallback to register + * @return Returns {@link Image_ErrorCode} IMAGE_SUCCESS - if the operation is successful + * returns {@link Image_ErrorCode} IMAGE_BAD_PARAMETER - if bad parameter + * @since 20 +*/ +Image_ErrorCode OH_ImageReceiverNative_OnImageArrive(OH_ImageReceiverNative* receiver, + OH_ImageReceiver_ImageArriveCallback callback, void* userData); + +/** + * Unregisters an {@link OH_ImageReceiver_ImageArriveCallback} callback + * + * @param receiver The OH_ImageReceiverNative object that handle the callback. + * @return Returns {@link Image_ErrorCode} IMAGE_SUCCESS - if the operation is successful + * returns {@link Image_ErrorCode} IMAGE_BAD_PARAMETER - if bad parameter + * @since 20 +*/ +Image_ErrorCode OH_ImageReceiverNative_OffImageArrive(OH_ImageReceiverNative* receiver); + /** * @brief Obtains the size of the image receiver through an {@link OH_ImageReceiverNative} object. * -- Gitee