From 91297094270598b4f9a729235917e43dde330e76 Mon Sep 17 00:00:00 2001 From: zhaona45 Date: Mon, 15 Dec 2025 17:13:33 +0800 Subject: [PATCH] adjust function lables Signed-off-by: zhaona45 --- .../entry/src/main/cpp/loadImageSource.cpp | 28 +- .../entry/src/main/cpp/loadReceiver.cpp | 468 ++++++++++-------- 2 files changed, 282 insertions(+), 214 deletions(-) diff --git a/ImageKit/ImageNativeSample/entry/src/main/cpp/loadImageSource.cpp b/ImageKit/ImageNativeSample/entry/src/main/cpp/loadImageSource.cpp index 5e3919ffa..058c1a8c5 100644 --- a/ImageKit/ImageNativeSample/entry/src/main/cpp/loadImageSource.cpp +++ b/ImageKit/ImageNativeSample/entry/src/main/cpp/loadImageSource.cpp @@ -18,6 +18,7 @@ #include #include #include +#include "napi/native_api.h" // [End editExif_operations_import] #include #include @@ -26,7 +27,6 @@ #include // [End packSource_import] #include -#include "napi/native_api.h" // [Start define_logInfo] #undef LOG_DOMAIN @@ -42,9 +42,12 @@ static std::set g_encodeSupportedFormats; static ImageSourceNative *g_thisImageSource = new ImageSourceNative(); // [End create_sourceClass] -// [Start decodingPixel_operations] +// [Start define_maxStringLength] const int MAX_STRING_LENGTH = 1024; -// 处理napi返回值。 +// [End define_maxStringLength] + +// [Start decodingPixel_operations] +// 返回ErrorCode。 napi_value ReturnErrorCode(napi_env env, Image_ErrorCode errCode, std::string funcName) { if (errCode != IMAGE_SUCCESS) { @@ -89,7 +92,9 @@ napi_value CreateImageSource(napi_env env, napi_callback_info info) Image_ErrorCode errCode = OH_ImageSourceNative_CreateFromUri(name, nameSize, &g_thisImageSource->source); return ReturnErrorCode(env, errCode, "OH_ImageSourceNative_CreateFromUri"); } +// [End decodingPixel_operations] +// [Start get_imageInfo] // 创建定义图片信息的结构体对象,并获取图片信息。 napi_value GetImageInfo(napi_env env, napi_callback_info info) { @@ -111,6 +116,7 @@ napi_value GetImageInfo(napi_env env, napi_callback_info info) g_thisImageSource->imageInfo = nullptr; return GetJsResult(env, width); // 返回获取到info信息的width。 } +// [End get_imageInfo] // [Start editExif_operations] // 获取指定property的value值。 @@ -132,13 +138,16 @@ napi_value GetImageProperty(napi_env env, napi_callback_info info) getKey.size = keySize; Image_String getValue; OH_LOG_INFO(LOG_APP, "OH_ImageSourceNative_GetImageProperty key: %{public}s.", getKey.data); - Image_ErrorCode errCode = OH_ImageSourceNative_GetImageProperty(g_thisImageSource->source, &getKey, &getValue); + Image_ErrorCode errCode = OH_ImageSourceNative_GetImagePropertyWithNull(g_thisImageSource->source, + &getKey, &getValue); if (errCode != IMAGE_SUCCESS) { OH_LOG_ERROR(LOG_APP, "OH_ImageSourceNative_GetImageProperty failed, errCode: %{public}d.", errCode); return GetJsResult(env, errCode); } napi_value resultNapi = nullptr; napi_create_string_utf8(env, getValue.data, getValue.size, &resultNapi); + free(getValue.data); + getValue.data = nullptr; return resultNapi; } @@ -177,6 +186,7 @@ napi_value ModifyImageProperty(napi_env env, napi_callback_info info) } // [End editExif_operations] +// [Start create_pixelMap] // 通过图片解码参数创建PixelMap对象。 napi_value CreatePixelMap(napi_env env, napi_callback_info info) { @@ -210,7 +220,9 @@ napi_value CreatePixelMap(napi_env env, napi_callback_info info) g_thisImageSource->pixelmapImageInfo = nullptr; return GetJsResult(env, errCode); } +// [End create_pixelMap] +// [Start get_frameCount] // 获取图像帧数。 napi_value GetFrameCount(napi_env env, napi_callback_info info) { @@ -222,7 +234,9 @@ napi_value GetFrameCount(napi_env env, napi_callback_info info) } return GetJsResult(env, g_thisImageSource->frameCnt); // 返回获取到的图像帧数。 } +// [End get_frameCount] +// [Start create_pixelmapList] // 通过图片解码参数创建Pixelmap列表。 napi_value CreatePixelmapList(napi_env env, napi_callback_info info) { @@ -237,7 +251,9 @@ napi_value CreatePixelmapList(napi_env env, napi_callback_info info) delete[] resVecPixMap; return ReturnErrorCode(env, errCode, "OH_ImageSourceNative_CreatePixelmapList"); } +// [End create_pixelmapList] +// [Start get_delayTimeList] // 获取图像延迟时间列表。 napi_value GetDelayTimeList(napi_env env, napi_callback_info info) { @@ -248,7 +264,9 @@ napi_value GetDelayTimeList(napi_env env, napi_callback_info info) delete[] delayTimeList; return ReturnErrorCode(env, errCode, "OH_ImageSourceNative_GetDelayTimeList"); } +// [End get_delayTimeList] +// [Start release_imageSource] // 释放资源。 napi_value ReleaseImageSource(napi_env env, napi_callback_info info) { @@ -258,7 +276,7 @@ napi_value ReleaseImageSource(napi_env env, napi_callback_info info) g_thisImageSource->resPixMap = nullptr; return ReturnErrorCode(env, errCode, "OH_ImageSourceNative_Release"); } -// [End decodingPixel_operations] +// [End release_imageSource] // [Start pack_source] Image_MimeType GetMimeTypeIfEncodable(const char *format) diff --git a/ImageKit/ImageNativeSample/entry/src/main/cpp/loadReceiver.cpp b/ImageKit/ImageNativeSample/entry/src/main/cpp/loadReceiver.cpp index 12ed1e149..30fa87661 100644 --- a/ImageKit/ImageNativeSample/entry/src/main/cpp/loadReceiver.cpp +++ b/ImageKit/ImageNativeSample/entry/src/main/cpp/loadReceiver.cpp @@ -29,7 +29,9 @@ #include #include +// [End receiver_import] +// [Start receiver_defineConst] #undef LOG_DOMAIN #define LOG_DOMAIN 0x3200 @@ -39,14 +41,19 @@ #define IMAGE_WIDTH 320 #define IMAGE_HEIGHT 480 #define IMAGE_CAPACITY 2 +// [End receiver_defineConst] +// [Start define_receiverInstance] static OH_ImageReceiverNative* g_receiver = nullptr; static std::mutex g_mutex; static std::condition_variable g_condVar; static bool g_imageReady = false; static OH_ImageNative* g_imageInfoResult = nullptr; +// [End define_receiverInstance] +// [Start receiver_utility] +// 处理napi返回值。 napi_value GetJsResultDemo(napi_env env, int result) { napi_value resultNapi = nullptr; @@ -54,6 +61,7 @@ napi_value GetJsResultDemo(napi_env env, int result) return resultNapi; } +// 将uint64_t转换为一个以null结尾的char数组。 std::unique_ptr ConvertUint64ToCharTemp(uint64_t value) { std::string strValue = std::to_string(value); @@ -63,180 +71,10 @@ std::unique_ptr ConvertUint64ToCharTemp(uint64_t value) return charBuffer; } +// [End receiver_utility] -// 获取图像大小。 -static napi_value GetImageSizeInfo(napi_env env, OH_ImageNative* image) -{ - OH_LOG_INFO(LOG_APP, "GetImageSizeInfo: enter, image=%{public}p", image); - - Image_Size imgSizeRead; - Image_ErrorCode errCode = OH_ImageNative_GetImageSize(image, &imgSizeRead); - OH_LOG_INFO(LOG_APP, "GetImageSizeInfo: GetImageSize errCode=%{public}d, width=%{public}d, height=%{public}d", - errCode, imgSizeRead.width, imgSizeRead.height); - - if (errCode == IMAGE_SUCCESS) { - napi_value resultObj; - napi_create_object(env, &resultObj); - - napi_value width; - napi_value height; - napi_create_int32(env, imgSizeRead.width, &width); - napi_create_int32(env, imgSizeRead.height, &height); - - napi_set_named_property(env, resultObj, "width", width); - napi_set_named_property(env, resultObj, "height", height); - - OH_LOG_INFO(LOG_APP, "GetImageSizeInfo: exit"); - return resultObj; - } - - OH_LOG_ERROR(LOG_APP, "GetImageSizeInfo: Failed to get image size"); - return nullptr; -} - -// 封装获取组件类型的函数。 -static size_t GetComponentTypeSize(OH_ImageNative* image, size_t& componentTypeSize) -{ - OH_LOG_INFO(LOG_APP, "GetComponentTypeSize: enter, image=%{public}p", image); - // 获取组件类型的大小。 - Image_ErrorCode errCode = OH_ImageNative_GetComponentTypes(image, nullptr, &componentTypeSize); - OH_LOG_INFO(LOG_APP, "GetComponentTypeSize: GetComponentTypes (query size) errCode=%{public}d," - "componentTypeSize=%{public}zu", errCode, componentTypeSize); - return componentTypeSize; -} - -// 获取组件信息。 -static napi_value GetComponentInfo(napi_env env, size_t componentTypeSize, OH_ImageNative* image, napi_value resultObj) -{ - if (componentTypeSize > 0) { - uint32_t* components = new uint32_t[componentTypeSize]; - Image_ErrorCode errCode = OH_ImageNative_GetComponentTypes(image, &components, &componentTypeSize); - OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetComponentTypes (get types) errCode=%{public}d," - "firstComponent=%{public}u", errCode, componentTypeSize > 0 ? components[0] : 0); - if (errCode != IMAGE_SUCCESS) { - OH_LOG_ERROR(LOG_APP, "GetImageInfoObject: GetComponentTypes (get types) failed"); - delete [] components; - return resultObj; - } - - OH_NativeBuffer* nativeBuffer = nullptr; - errCode = OH_ImageNative_GetByteBuffer(image, components[0], &nativeBuffer); - if (errCode == IMAGE_SUCCESS) { - OH_LOG_INFO(LOG_APP, "Get native buffer success."); - } - - size_t nativeBufferSize = 0; - errCode = OH_ImageNative_GetBufferSize(image, components[0], &nativeBufferSize); - OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetBufferSize errCode=%{public}d, nativeBufferSize=%{public}zu", - errCode, nativeBufferSize); - if (errCode == IMAGE_SUCCESS) { - napi_value bufSize; - napi_create_int32(env, static_cast(nativeBufferSize), &bufSize); - napi_set_named_property(env, resultObj, "bufferSize", bufSize); - } - - int32_t rowStride = 0; - errCode = OH_ImageNative_GetRowStride(image, components[0], &rowStride); - OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetRowStride errCode=%{public}d," - "rowStride=%{public}d", errCode, rowStride); - if (errCode == IMAGE_SUCCESS) { - napi_value jsRowStride; - napi_create_int32(env, rowStride, &jsRowStride); - napi_set_named_property(env, resultObj, "rowStride", jsRowStride); - } - - int32_t pixelStride = 0; - errCode = OH_ImageNative_GetPixelStride(image, components[0], &pixelStride); - OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetPixelStride errCode=%{public}d, pixelStride=%{public}d", - errCode, pixelStride); - if (errCode == IMAGE_SUCCESS) { - napi_value jsPixelStride; - napi_create_int32(env, pixelStride, &jsPixelStride); - napi_set_named_property(env, resultObj, "pixelStride", jsPixelStride); - } - delete [] components; - } - return resultObj; -} - -// 获取图像属性并封装为JS对象。 -static napi_value GetImageInfoObject(napi_env env, OH_ImageNative* image) -{ - OH_LOG_INFO(LOG_APP, "GetImageInfoObject: enter, image=%{public}p", image); - napi_value resultObj; - napi_create_object(env, &resultObj); - resultObj = GetImageSizeInfo(env, image); - - size_t componentTypeSize = 0; - componentTypeSize = GetComponentTypeSize(image, componentTypeSize); - if (componentTypeSize > 0) { - resultObj = GetComponentInfo(env, componentTypeSize, image, resultObj); - } - - int64_t timestamp = 0; - Image_ErrorCode errCode = OH_ImageNative_GetTimestamp(image, ×tamp); - OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetTimestamp errCode=%{public}d, timestamp=%{public}ld", - errCode, timestamp); - if (errCode == IMAGE_SUCCESS) { - napi_value jsTimestamp; - napi_create_int64(env, timestamp, &jsTimestamp); - napi_set_named_property(env, resultObj, "timestamp", jsTimestamp); - } - - OH_LOG_INFO(LOG_APP, "GetImageInfoObject: exit"); - return resultObj; -} - -// 同步等待。 -static OH_ImageNative* NotifyJsImageInfoSync() -{ - std::unique_lock lock(g_mutex); - g_imageReady = false; - g_imageInfoResult = nullptr; - - // 等待 OnCallback 回调通知 - bool ret = g_condVar.wait_for(lock, std::chrono::seconds(1), [] { - OH_LOG_INFO(LOG_APP, "NotifyJsImageInfoSync: wait_for wakeup, g_imageReady=%{public}d", g_imageReady); - return g_imageReady; - }); - if (!ret) { - OH_LOG_ERROR(LOG_APP, "NotifyJsImageInfoSync: wait_for timeout."); - return nullptr; - } - return g_imageInfoResult; -} - -static void OnCallback(OH_ImageReceiverNative* receiver) -{ - OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest buffer available."); - - OH_ImageNative* image = nullptr; - Image_ErrorCode errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image); - if (errCode != IMAGE_SUCCESS) { - OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver next image failed," - "errCode: %{public}d.", errCode); - OH_ImageNative_Release(image); - return; - } - - { - std::lock_guard lock(g_mutex); - g_imageInfoResult = image; - g_imageReady = true; - } - g_condVar.notify_one(); -} - -static Image_ErrorCode CreateReceiver(OH_ImageReceiverOptions* options, OH_ImageReceiverNative** receiver) -{ - Image_ErrorCode errCode = OH_ImageReceiverNative_Create(options, receiver); - if (errCode != IMAGE_SUCCESS) { - OH_LOG_ERROR(LOG_APP, "Create image receiver failed, errCode: %{public}d.", errCode); - return errCode; - } - return IMAGE_SUCCESS; -} - +// 初始化Receiver。 +// [Start set_receiverOptions] static Image_ErrorCode CreateAndConfigOptions(OH_ImageReceiverOptions** options) { Image_ErrorCode errCode = OH_ImageReceiverOptions_Create(options); @@ -259,7 +97,9 @@ static Image_ErrorCode CreateAndConfigOptions(OH_ImageReceiverOptions** options) } return IMAGE_SUCCESS; } +// [End set_receiverOptions] +// [Start get_receiverOptions] static Image_ErrorCode ValidateOptions(OH_ImageReceiverOptions* options) { Image_Size imgSizeRead; @@ -285,7 +125,44 @@ static Image_ErrorCode ValidateOptions(OH_ImageReceiverOptions* options) } return IMAGE_SUCCESS; } +// [End get_receiverOptions] + +// [Start create_receiver] +static Image_ErrorCode CreateReceiver(OH_ImageReceiverOptions* options, OH_ImageReceiverNative** receiver) +{ + Image_ErrorCode errCode = OH_ImageReceiverNative_Create(options, receiver); + if (errCode != IMAGE_SUCCESS) { + OH_LOG_ERROR(LOG_APP, "Create image receiver failed, errCode: %{public}d.", errCode); + return errCode; + } + return IMAGE_SUCCESS; +} +// [End create_receiver] + +// [Start define_callback] +static void OnCallback(OH_ImageReceiverNative* receiver) +{ + OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest buffer available."); + + OH_ImageNative* image = nullptr; + Image_ErrorCode errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image); + if (errCode != IMAGE_SUCCESS) { + OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver next image failed," + "errCode: %{public}d.", errCode); + OH_ImageNative_Release(image); + return; + } + + { + std::lock_guard lock(g_mutex); + g_imageInfoResult = image; + g_imageReady = true; + } + g_condVar.notify_one(); +} +// [End define_callback] +// [Start register_callback] static Image_ErrorCode RegisterCallbackAndQuery(OH_ImageReceiverNative* receiver) { uint64_t surfaceID = 0; @@ -317,7 +194,51 @@ static Image_ErrorCode RegisterCallbackAndQuery(OH_ImageReceiverNative* receiver OH_LOG_INFO(LOG_APP, "Get image receiver capacity: %{public}d.", capacity); return IMAGE_SUCCESS; } +// [End register_callback] + +// [Start init_receiver] +static napi_value ImageReceiverNativeCTest(napi_env env, napi_callback_info info) +{ + if (g_receiver != nullptr) { + OH_ImageReceiverNative_Off(g_receiver); + OH_ImageReceiverNative_Release(g_receiver); + g_receiver = nullptr; + } + + OH_ImageReceiverOptions* options = nullptr; + Image_ErrorCode errCode = CreateAndConfigOptions(&options); + if (errCode != IMAGE_SUCCESS) { + OH_LOG_ERROR(LOG_APP, "CreateAndConfigOptions failed errCode=%{public}d", errCode); + return GetJsResultDemo(env, errCode); + } + errCode = ValidateOptions(options); + if (errCode != IMAGE_SUCCESS) { + OH_LOG_ERROR(LOG_APP, "ValidateOptions failed errCode=%{public}d", errCode); + OH_ImageReceiverOptions_Release(options); + return GetJsResultDemo(env, errCode); + } + errCode = CreateReceiver(options, &g_receiver); + if (errCode != IMAGE_SUCCESS) { + OH_LOG_ERROR(LOG_APP, "CreateReceiver failed errCode=%{public}d", errCode); + OH_ImageReceiverOptions_Release(options); + return GetJsResultDemo(env, errCode); + } + errCode = RegisterCallbackAndQuery(g_receiver); + if (errCode != IMAGE_SUCCESS) { + OH_LOG_ERROR(LOG_APP, "RegisterCallbackAndQuery failed errCode=%{public}d", errCode); + OH_ImageReceiverOptions_Release(options); + OH_ImageReceiverNative_Release(g_receiver); + g_receiver = nullptr; + return GetJsResultDemo(env, errCode); + } + OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest create and config success."); + OH_ImageReceiverOptions_Release(options); + return GetJsResultDemo(env, IMAGE_SUCCESS); +} +// [End init_receiver] +// 启动拍照流。 +// [Start init_camera] Camera_ErrorCode InitCameraManagerAndInput(Camera_Manager*& cameraManager, Camera_Device*& cameras, uint32_t& size, @@ -351,7 +272,9 @@ Camera_ErrorCode InitCameraManagerAndInput(Camera_Manager*& cameraManager, } return CAMERA_OK; } +// [End init_camera] +// [Start get_cameraOutCapability] Camera_ErrorCode GetCameraOutputCapability(Camera_Manager* cameraManager, Camera_Device* cameras, uint32_t cameraDeviceIndex, @@ -366,7 +289,9 @@ Camera_ErrorCode GetCameraOutputCapability(Camera_Manager* cameraManager, } return ret; } +// [End get_cameraOutCapability] +// [Start create_captureSession] Camera_CaptureSession* CreateAndStartSession(Camera_Manager* cameraManager, Camera_Input* cameraInput, int sessionMode) { Camera_CaptureSession* captureSession = nullptr; @@ -392,8 +317,10 @@ Camera_CaptureSession* CreateAndStartSession(Camera_Manager* cameraManager, Came } return captureSession; } +// [End create_captureSession] -static Camera_ErrorCode StartPhotoSession(Camera_Manager* mgr, Camera_Input* input, Camera_PhotoOutput* photoOutput, +// [Start start_captureSession] +static Camera_ErrorCode StartCaptureSession(Camera_Manager* mgr, Camera_Input* input, Camera_PhotoOutput* photoOutput, Camera_CaptureSession** sessionOut) { *sessionOut = CreateAndStartSession(mgr, input, NORMAL_PHOTO); @@ -420,8 +347,10 @@ static Camera_ErrorCode StartPhotoSession(Camera_Manager* mgr, Camera_Input* inp } return ret; } +// [End start_captureSession] -Camera_ErrorCode NDKCameraPhotoOutput(char* str) +// [Start start_cameraSession] +Camera_ErrorCode StartTakePhoto(char* str) { Camera_Manager* cameraManager = nullptr; Camera_Device* cameras = nullptr; @@ -448,9 +377,9 @@ Camera_ErrorCode NDKCameraPhotoOutput(char* str) } Camera_CaptureSession* captureSession = nullptr; - ret = StartPhotoSession(cameraManager, cameraInput, photoOutput, &captureSession); + ret = StartCaptureSession(cameraManager, cameraInput, photoOutput, &captureSession); if (ret != CAMERA_OK) { - OH_LOG_ERROR(LOG_APP, "StartPhotoSession failed."); + OH_LOG_ERROR(LOG_APP, "StartCaptureSession failed."); return ret; } @@ -461,7 +390,9 @@ Camera_ErrorCode NDKCameraPhotoOutput(char* str) } return CAMERA_OK; } +// [End start_cameraSession] +// [Start load_cameraSession] static napi_value TakePhoto(napi_env env, napi_callback_info info) { if (g_receiver == nullptr) { @@ -476,49 +407,165 @@ static napi_value TakePhoto(napi_env env, napi_callback_info info) } auto surfaceId_c = ConvertUint64ToCharTemp(surfaceId); - Camera_ErrorCode photoRet = NDKCameraPhotoOutput(surfaceId_c.get()); + Camera_ErrorCode photoRet = StartTakePhoto(surfaceId_c.get()); return GetJsResultDemo(env, photoRet); } +// [Start load_cameraSession] -static napi_value ImageReceiverNativeCTest(napi_env env, napi_callback_info info) +// 获取接收到的图像信息。 +// [Start wait_callBack] +// 同步等待。 +static OH_ImageNative* NotifyJsImageInfoSync() { - if (g_receiver != nullptr) { - OH_ImageReceiverNative_Off(g_receiver); - OH_ImageReceiverNative_Release(g_receiver); - g_receiver = nullptr; + std::unique_lock lock(g_mutex); + g_imageReady = false; + g_imageInfoResult = nullptr; + + // 等待OnCallback回调通知。 + bool ret = g_condVar.wait_for(lock, std::chrono::seconds(1), [] { + OH_LOG_INFO(LOG_APP, "NotifyJsImageInfoSync: wait_for wakeup, g_imageReady=%{public}d", g_imageReady); + return g_imageReady; + }); + if (!ret) { + OH_LOG_ERROR(LOG_APP, "NotifyJsImageInfoSync: wait_for timeout."); + return nullptr; } + return g_imageInfoResult; +} +// [Start wait_callBack] - OH_ImageReceiverOptions* options = nullptr; - Image_ErrorCode errCode = CreateAndConfigOptions(&options); - if (errCode != IMAGE_SUCCESS) { - OH_LOG_ERROR(LOG_APP, "CreateAndConfigOptions failed errCode=%{public}d", errCode); - return GetJsResultDemo(env, errCode); +// [Start get_imageSize] +// 获取图片大小。 +static napi_value GetImageSizeInfo(napi_env env, OH_ImageNative* image) +{ + OH_LOG_INFO(LOG_APP, "GetImageSizeInfo: enter, image=%{public}p", image); + + Image_Size imgSizeRead; + Image_ErrorCode errCode = OH_ImageNative_GetImageSize(image, &imgSizeRead); + OH_LOG_INFO(LOG_APP, "GetImageSizeInfo: GetImageSize errCode=%{public}d, width=%{public}d, height=%{public}d", + errCode, imgSizeRead.width, imgSizeRead.height); + + if (errCode == IMAGE_SUCCESS) { + napi_value resultObj; + napi_create_object(env, &resultObj); + + napi_value width; + napi_value height; + napi_create_int32(env, imgSizeRead.width, &width); + napi_create_int32(env, imgSizeRead.height, &height); + + napi_set_named_property(env, resultObj, "width", width); + napi_set_named_property(env, resultObj, "height", height); + + OH_LOG_INFO(LOG_APP, "GetImageSizeInfo: exit"); + return resultObj; } - errCode = ValidateOptions(options); - if (errCode != IMAGE_SUCCESS) { - OH_LOG_ERROR(LOG_APP, "ValidateOptions failed errCode=%{public}d", errCode); - OH_ImageReceiverOptions_Release(options); - return GetJsResultDemo(env, errCode); + + OH_LOG_ERROR(LOG_APP, "GetImageSizeInfo: Failed to get image size"); + return nullptr; +} +// [End get_imageSize] + +// [Start get_componentType] +// 获取组件类型。 +static size_t GetComponentTypeSize(OH_ImageNative* image, size_t& componentTypeSize) +{ + OH_LOG_INFO(LOG_APP, "GetComponentTypeSize: enter, image=%{public}p", image); + // 获取组件类型的大小。 + Image_ErrorCode errCode = OH_ImageNative_GetComponentTypes(image, nullptr, &componentTypeSize); + OH_LOG_INFO(LOG_APP, "GetComponentTypeSize: GetComponentTypes (query size) errCode=%{public}d," + "componentTypeSize=%{public}zu", errCode, componentTypeSize); + return componentTypeSize; +} +// [End get_componentType] + +// [Start get_componentInfo] +// 获取组件信息。 +static napi_value GetComponentInfo(napi_env env, size_t componentTypeSize, OH_ImageNative* image, napi_value resultObj) +{ + if (componentTypeSize > 0) { + uint32_t* components = new uint32_t[componentTypeSize]; + Image_ErrorCode errCode = OH_ImageNative_GetComponentTypes(image, &components, &componentTypeSize); + OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetComponentTypes (get types) errCode=%{public}d," + "firstComponent=%{public}u", errCode, componentTypeSize > 0 ? components[0] : 0); + if (errCode != IMAGE_SUCCESS) { + OH_LOG_ERROR(LOG_APP, "GetImageInfoObject: GetComponentTypes (get types) failed"); + delete [] components; + return resultObj; + } + + OH_NativeBuffer* nativeBuffer = nullptr; + errCode = OH_ImageNative_GetByteBuffer(image, components[0], &nativeBuffer); + if (errCode == IMAGE_SUCCESS) { + OH_LOG_INFO(LOG_APP, "Get native buffer success."); + } + + size_t nativeBufferSize = 0; + errCode = OH_ImageNative_GetBufferSize(image, components[0], &nativeBufferSize); + OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetBufferSize errCode=%{public}d, nativeBufferSize=%{public}zu", + errCode, nativeBufferSize); + if (errCode == IMAGE_SUCCESS) { + napi_value bufSize; + napi_create_int32(env, static_cast(nativeBufferSize), &bufSize); + napi_set_named_property(env, resultObj, "bufferSize", bufSize); + } + + int32_t rowStride = 0; + errCode = OH_ImageNative_GetRowStride(image, components[0], &rowStride); + OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetRowStride errCode=%{public}d," + "rowStride=%{public}d", errCode, rowStride); + if (errCode == IMAGE_SUCCESS) { + napi_value jsRowStride; + napi_create_int32(env, rowStride, &jsRowStride); + napi_set_named_property(env, resultObj, "rowStride", jsRowStride); + } + + int32_t pixelStride = 0; + errCode = OH_ImageNative_GetPixelStride(image, components[0], &pixelStride); + OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetPixelStride errCode=%{public}d, pixelStride=%{public}d", + errCode, pixelStride); + if (errCode == IMAGE_SUCCESS) { + napi_value jsPixelStride; + napi_create_int32(env, pixelStride, &jsPixelStride); + napi_set_named_property(env, resultObj, "pixelStride", jsPixelStride); + } + delete [] components; } - errCode = CreateReceiver(options, &g_receiver); - if (errCode != IMAGE_SUCCESS) { - OH_LOG_ERROR(LOG_APP, "CreateReceiver failed errCode=%{public}d", errCode); - OH_ImageReceiverOptions_Release(options); - return GetJsResultDemo(env, errCode); + return resultObj; +} +// [End get_componentInfo] + +// [Start get_imageInfo] +// 获取图像属性并封装为napi对象。 +static napi_value GetImageInfoObject(napi_env env, OH_ImageNative* image) +{ + OH_LOG_INFO(LOG_APP, "GetImageInfoObject: enter, image=%{public}p", image); + napi_value resultObj; + napi_create_object(env, &resultObj); + resultObj = GetImageSizeInfo(env, image); + + size_t componentTypeSize = 0; + componentTypeSize = GetComponentTypeSize(image, componentTypeSize); + if (componentTypeSize > 0) { + resultObj = GetComponentInfo(env, componentTypeSize, image, resultObj); } - errCode = RegisterCallbackAndQuery(g_receiver); - if (errCode != IMAGE_SUCCESS) { - OH_LOG_ERROR(LOG_APP, "RegisterCallbackAndQuery failed errCode=%{public}d", errCode); - OH_ImageReceiverOptions_Release(options); - OH_ImageReceiverNative_Release(g_receiver); - g_receiver = nullptr; - return GetJsResultDemo(env, errCode); + + int64_t timestamp = 0; + Image_ErrorCode errCode = OH_ImageNative_GetTimestamp(image, ×tamp); + OH_LOG_INFO(LOG_APP, "GetImageInfoObject: GetTimestamp errCode=%{public}d, timestamp=%{public}ld", + errCode, timestamp); + if (errCode == IMAGE_SUCCESS) { + napi_value jsTimestamp; + napi_create_int64(env, timestamp, &jsTimestamp); + napi_set_named_property(env, resultObj, "timestamp", jsTimestamp); } - OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest create and config success."); - OH_ImageReceiverOptions_Release(options); - return GetJsResultDemo(env, IMAGE_SUCCESS); + + OH_LOG_INFO(LOG_APP, "GetImageInfoObject: exit"); + return resultObj; } +// [End get_imageInfo] +// [Start get_receiverImageInfo] static napi_value GetReceiverImageInfo(napi_env env, napi_callback_info info) { OH_ImageNative* image = NotifyJsImageInfoSync(); @@ -531,7 +578,10 @@ static napi_value GetReceiverImageInfo(napi_env env, napi_callback_info info) OH_ImageNative_Release(image); return resultObj; } +// [End get_receiverImageInfo] +// 释放receiver。 +// [Start release_receiver] static napi_value ReleaseImageReceiver(napi_env env, napi_callback_info info) { if (g_receiver == nullptr) { @@ -550,7 +600,7 @@ static napi_value ReleaseImageReceiver(napi_env env, napi_callback_info info) return GetJsResultDemo(env, errCode); } -// [End receiver_import] +// [End release_receiver] EXTERN_C_START napi_value InitReceiverDemo(napi_env env, napi_value exports) -- Gitee