1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "image_receiver_mdk_kits.h"
17 #include "image_receiver_napi_listener.h"
18 #include "image_napi.h"
19
20 #include <map>
21
22 namespace OHOS {
23 namespace Media {
24 using ImageReceiverNapiEnvFunc = int32_t (*)(napi_env env, struct ImageReceiverArgs* args);
25 using ImageReceiverNapiCtxFunc = int32_t (*)(ImageReceiverNapi* native, struct ImageReceiverArgs* args);
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
GetNativeReceiver(ImageReceiverNapi * napi)29 static ImageReceiver* GetNativeReceiver(ImageReceiverNapi* napi)
30 {
31 if (napi == nullptr) {
32 return nullptr;
33 }
34 return napi->GetNative();
35 }
36
CheckAndGetReceiver(ImageReceiverNapi * native,const struct ImageReceiverArgs * args)37 static ImageReceiver* CheckAndGetReceiver(ImageReceiverNapi* native, const struct ImageReceiverArgs* args)
38 {
39 if (args == nullptr) {
40 return nullptr;
41 }
42 return GetNativeReceiver(native);
43 }
44
ImageReceiverNapiCreate(napi_env env,struct ImageReceiverArgs * args)45 static int32_t ImageReceiverNapiCreate(napi_env env, struct ImageReceiverArgs* args)
46 {
47 if (args == nullptr) {
48 return IMAGE_RESULT_JNI_ENV_ABNORMAL;
49 }
50
51 ImageReceiverCreateArgs createArgs;
52 createArgs.width = args->inNum0;
53 createArgs.height = args->inNum1;
54 createArgs.format = args->inNum2;
55 createArgs.capicity = args->inNum3;
56 *(args->outValue) = ImageReceiverNapi::CreateImageReceiverJsObject(env, createArgs);
57 if (*(args->outValue) == nullptr) {
58 return IMAGE_RESULT_BAD_PARAMETER;
59 }
60 return IMAGE_RESULT_SUCCESS;
61 }
62
ImageReceiverNapiGetReceiverId(ImageReceiverNapi * native,struct ImageReceiverArgs * args)63 static int32_t ImageReceiverNapiGetReceiverId(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
64 {
65 auto receiver = CheckAndGetReceiver(native, args);
66 if (receiver == nullptr || receiver->iraContext_ == nullptr || args->id == nullptr) {
67 return IMAGE_RESULT_BAD_PARAMETER;
68 }
69 auto sId = receiver->iraContext_->GetReceiverKey();
70 if (sId.empty() || sId.c_str() == nullptr || args->inLen < sId.size()) {
71 return IMAGE_RESULT_BAD_PARAMETER;
72 }
73 memcpy_s(args->id, args->inLen, sId.c_str(), sId.size());
74 return IMAGE_RESULT_SUCCESS;
75 }
76
ImageReceiverNapiReadLatestImage(ImageReceiverNapi * native,struct ImageReceiverArgs * args)77 static int32_t ImageReceiverNapiReadLatestImage(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
78 {
79 auto receiver = CheckAndGetReceiver(native, args);
80 if (receiver == nullptr || args->inEnv == nullptr) {
81 return IMAGE_RESULT_JNI_ENV_ABNORMAL;
82 }
83 auto image = receiver->LastNativeImage();
84 if (image == nullptr) {
85 return IMAGE_RESULT_BAD_PARAMETER;
86 }
87 *(args->outValue) = ImageNapi::Create(args->inEnv, image);
88 return IMAGE_RESULT_SUCCESS;
89 }
90
ImageReceiverNapiReadNextImage(ImageReceiverNapi * native,struct ImageReceiverArgs * args)91 static int32_t ImageReceiverNapiReadNextImage(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
92 {
93 auto receiver = CheckAndGetReceiver(native, args);
94 if (receiver == nullptr || args->inEnv == nullptr) {
95 return IMAGE_RESULT_JNI_ENV_ABNORMAL;
96 }
97 auto image = receiver->NextNativeImage();
98 if (image == nullptr) {
99 return IMAGE_RESULT_BAD_PARAMETER;
100 }
101 *(args->outValue) = ImageNapi::Create(args->inEnv, image);
102 return IMAGE_RESULT_SUCCESS;
103 }
104
ImageReceiverNapiOn(ImageReceiverNapi * native,struct ImageReceiverArgs * args)105 static int32_t ImageReceiverNapiOn(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
106 {
107 auto receiver = CheckAndGetReceiver(native, args);
108 if (receiver == nullptr || args->callback == nullptr) {
109 return IMAGE_RESULT_JNI_ENV_ABNORMAL;
110 }
111 std::shared_ptr<ImageReceiverNapiListener> listener = std::make_shared<ImageReceiverNapiListener>();
112 listener->callBack = args->callback;
113 receiver->RegisterBufferAvaliableListener(listener);
114 return IMAGE_RESULT_SUCCESS;
115 }
116
ImageReceiverNapiGetSize(ImageReceiverNapi * native,struct ImageReceiverArgs * args)117 static int32_t ImageReceiverNapiGetSize(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
118 {
119 auto receiver = CheckAndGetReceiver(native, args);
120 if (receiver == nullptr || receiver->iraContext_ == nullptr || args->outSize == nullptr) {
121 return IMAGE_RESULT_JNI_ENV_ABNORMAL;
122 }
123 args->outSize->width = receiver->iraContext_->GetWidth();
124 args->outSize->height = receiver->iraContext_->GetHeight();
125 return IMAGE_RESULT_SUCCESS;
126 }
127
ImageReceiverNapiGetCapacity(ImageReceiverNapi * native,struct ImageReceiverArgs * args)128 static int32_t ImageReceiverNapiGetCapacity(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
129 {
130 auto receiver = CheckAndGetReceiver(native, args);
131 if (receiver == nullptr || receiver->iraContext_ == nullptr) {
132 return IMAGE_RESULT_JNI_ENV_ABNORMAL;
133 }
134 *(args->outNum0) = receiver->iraContext_->GetCapicity();
135 return IMAGE_RESULT_SUCCESS;
136 }
137
ImageReceiverNapiGetFormat(ImageReceiverNapi * native,struct ImageReceiverArgs * args)138 static int32_t ImageReceiverNapiGetFormat(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
139 {
140 auto receiver = CheckAndGetReceiver(native, args);
141 if (receiver == nullptr || receiver->iraContext_ == nullptr) {
142 return IMAGE_RESULT_JNI_ENV_ABNORMAL;
143 }
144 *(args->outNum0) = receiver->iraContext_->GetFormat();
145 return IMAGE_RESULT_SUCCESS;
146 }
147 static const std::map<int32_t, ImageReceiverNapiEnvFunc> g_EnvFunctions = {
148 {ENV_FUNC_IMAGE_RECEIVER_CREATE, ImageReceiverNapiCreate},
149 };
150 static const std::map<int32_t, ImageReceiverNapiCtxFunc> g_CtxFunctions = {
151 {CTX_FUNC_IMAGE_RECEIVER_GET_RECEIVER_ID, ImageReceiverNapiGetReceiverId},
152 {CTX_FUNC_IMAGE_RECEIVER_READ_LATEST_IMAGE, ImageReceiverNapiReadLatestImage},
153 {CTX_FUNC_IMAGE_RECEIVER_READ_NEXT_IMAGE, ImageReceiverNapiReadNextImage},
154 {CTX_FUNC_IMAGE_RECEIVER_ON, ImageReceiverNapiOn},
155 {CTX_FUNC_IMAGE_RECEIVER_GET_SIZE, ImageReceiverNapiGetSize},
156 {CTX_FUNC_IMAGE_RECEIVER_GET_CAPACITY, ImageReceiverNapiGetCapacity},
157 {CTX_FUNC_IMAGE_RECEIVER_GET_FORMAT, ImageReceiverNapiGetFormat},
158 };
159
160 MIDK_EXPORT
ImageReceiverNativeEnvCall(int32_t mode,napi_env env,struct ImageReceiverArgs * args)161 int32_t ImageReceiverNativeEnvCall(int32_t mode, napi_env env, struct ImageReceiverArgs* args)
162 {
163 auto funcSearch = g_EnvFunctions.find(mode);
164 if (funcSearch == g_EnvFunctions.end()) {
165 return IMAGE_RESULT_BAD_PARAMETER;
166 }
167 return funcSearch->second(env, args);
168 }
169
170 MIDK_EXPORT
ImageReceiverNativeCtxCall(int32_t mode,ImageReceiverNapi * native,struct ImageReceiverArgs * args)171 int32_t ImageReceiverNativeCtxCall(int32_t mode, ImageReceiverNapi* native, struct ImageReceiverArgs* args)
172 {
173 auto funcSearch = g_CtxFunctions.find(mode);
174 if (funcSearch == g_CtxFunctions.end()) {
175 return IMAGE_RESULT_BAD_PARAMETER;
176 }
177 return funcSearch->second(native, args);
178 }
179
180 MIDK_EXPORT
ImageReceiver_Unwrap(napi_env env,napi_value value)181 ImageReceiverNapi* ImageReceiver_Unwrap(napi_env env, napi_value value)
182 {
183 napi_valuetype valueType;
184 napi_typeof(env, value, &valueType);
185 if (valueType != napi_object) {
186 return nullptr;
187 }
188 std::unique_ptr<ImageReceiverNapi> receiverNapi = nullptr;
189 napi_status status = napi_unwrap(env, value, reinterpret_cast<void**>(&receiverNapi));
190 if ((status == napi_ok) && receiverNapi != nullptr) {
191 return receiverNapi.release();
192 }
193 return nullptr;
194 }
195 #ifdef __cplusplus
196 };
197 #endif
198 } // namespace Media
199 } // namespace OHOS
200