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_test.h"
17 #include "node_api.h"
18 #include <string>
19 #include "hilog/log.h"
20
21 #define IMAGE_LOG_TAG "IMAGE_RECEIVER_TAGLOG"
22 #define IMAGE_LOG_DOMAIN 0x3200
23 #define LOG(fmt, ...) (void)OH_LOG_Print(LOG_APP, LOG_INFO, IMAGE_LOG_DOMAIN, IMAGE_LOG_TAG, fmt, ##__VA_ARGS__)
24
25 namespace {
26 constexpr uint32_t NUM_0 = 0;
27 constexpr uint32_t NUM_1 = 1;
28 constexpr uint32_t NUM_2 = 2;
29 constexpr uint32_t NUM_3 = 3;
30 constexpr uint32_t NUM_4 = 4;
31 constexpr size_t ID_SIZE = 64;
32 }
33
34 namespace OHOS {
35 namespace Media {
36
37 uint32_t ImageReceiverNDKTest::sOnEvnentCount = 0;
38
CheckArgs(size_t count,const napi_value * argValues,size_t exceptCount)39 static bool CheckArgs(size_t count, const napi_value* argValues, size_t exceptCount)
40 {
41 if (count != exceptCount) {
42 return false;
43 }
44 for (size_t i = NUM_0; i < count; i++) {
45 if (argValues[i] == nullptr) {
46 return false;
47 }
48 }
49 return true;
50 }
51
JsCreateImageReceiver(napi_env env,napi_callback_info info)52 napi_value ImageReceiverNDKTest::JsCreateImageReceiver(napi_env env, napi_callback_info info)
53 {
54 napi_value udfVar = nullptr;
55 napi_value thisVar = nullptr;
56 napi_value argValue[NUM_4] = {0};
57 size_t argCount = NUM_4;
58 struct OhosImageReceiverInfo receiverInfo;
59 napi_value receiver = nullptr;
60 napi_get_undefined(env, &udfVar);
61 if (napi_get_cb_info(env, info, &argCount, argValue, &thisVar, nullptr) != napi_ok ||
62 !CheckArgs(argCount, argValue, NUM_4) ||
63 napi_get_value_int32(env, argValue[NUM_0], &(receiverInfo.width)) != napi_ok ||
64 napi_get_value_int32(env, argValue[NUM_1], &(receiverInfo.height)) != napi_ok ||
65 napi_get_value_int32(env, argValue[NUM_2], &(receiverInfo.format)) != napi_ok ||
66 napi_get_value_int32(env, argValue[NUM_3], &(receiverInfo.capicity)) != napi_ok) {
67 return udfVar;
68 }
69 int32_t res = OH_Image_Receiver_CreateImageReceiver(env, receiverInfo, &receiver);
70 if (res != IMAGE_RESULT_SUCCESS || receiver == nullptr) {
71 return udfVar;
72 }
73 return receiver;
74 }
75
getNativeReceiver(napi_env env,napi_callback_info info)76 static ImageReceiverNative* getNativeReceiver(napi_env env, napi_callback_info info)
77 {
78 napi_value thisVar = nullptr;
79 napi_value argValue[NUM_1] = {0};
80 size_t argCount = NUM_1;
81
82 if (napi_get_cb_info(env, info, &argCount, argValue, &thisVar, nullptr) != napi_ok ||
83 argCount < NUM_1 || argValue[NUM_0] == nullptr) {
84 return nullptr;
85 }
86 return OH_Image_Receiver_InitImageReceiverNative(env, argValue[NUM_0]);
87 }
88
JsGetReceivingSurfaceId(napi_env env,napi_callback_info info)89 napi_value ImageReceiverNDKTest::JsGetReceivingSurfaceId(napi_env env, napi_callback_info info)
90 {
91 napi_value result = nullptr;
92 napi_get_undefined(env, &result);
93
94 ImageReceiverNative* native = getNativeReceiver(env, info);
95 if (native == nullptr) {
96 return result;
97 }
98 char buf[ID_SIZE] = {0};
99 int32_t res = OH_Image_Receiver_GetReceivingSurfaceId(native, buf, ID_SIZE);
100 if (res != IMAGE_RESULT_SUCCESS) {
101 return result;
102 }
103 LOG("JsGetReceivingSurfaceId IN [%{public}x]", buf[0]);
104 LOG("JsGetReceivingSurfaceId IN [%{public}c]", *buf);
105 LOG("JsGetReceivingSurfaceId IN [%{public}s]", buf);
106 napi_create_string_utf8(env, buf, NAPI_AUTO_LENGTH, &result);
107 return result;
108 }
109
JsReadLatestImage(napi_env env,napi_callback_info info)110 napi_value ImageReceiverNDKTest::JsReadLatestImage(napi_env env, napi_callback_info info)
111 {
112 napi_value result = nullptr;
113 napi_get_undefined(env, &result);
114
115 ImageReceiverNative* native = getNativeReceiver(env, info);
116 if (native == nullptr) {
117 return result;
118 }
119
120 int32_t res = OH_Image_Receiver_ReadLatestImage(native, &result);
121 if (res != IMAGE_RESULT_SUCCESS) {
122 napi_get_undefined(env, &result);
123 return result;
124 }
125 return result;
126 }
127
JsReadNextImage(napi_env env,napi_callback_info info)128 napi_value ImageReceiverNDKTest::JsReadNextImage(napi_env env, napi_callback_info info)
129 {
130 napi_value result = nullptr;
131 napi_get_undefined(env, &result);
132
133 ImageReceiverNative* native = getNativeReceiver(env, info);
134 if (native == nullptr) {
135 return result;
136 }
137
138 int32_t res = OH_Image_Receiver_ReadNextImage(native, &result);
139 if (res != IMAGE_RESULT_SUCCESS) {
140 napi_get_undefined(env, &result);
141 return result;
142 }
143 return result;
144 }
OnEvent()145 void ImageReceiverNDKTest::OnEvent()
146 {
147 LOG("ImageReceiverNDKTest::OnEvent IN [%{public}p]", &sOnEvnentCount);
148 sOnEvnentCount++;
149 }
150
JsOn(napi_env env,napi_callback_info info)151 napi_value ImageReceiverNDKTest::JsOn(napi_env env, napi_callback_info info)
152 {
153 napi_value result = nullptr;
154 napi_get_undefined(env, &result);
155
156 ImageReceiverNative* native = getNativeReceiver(env, info);
157 if (native == nullptr) {
158 return result;
159 }
160
161 sOnEvnentCount = NUM_0;
162 int32_t res = OH_Image_Receiver_On(native, OnEvent);
163 napi_create_int32(env, res, &result);
164 return result;
165 }
166
JsReceiverRelease(napi_env env,napi_callback_info info)167 napi_value ImageReceiverNDKTest::JsReceiverRelease(napi_env env, napi_callback_info info)
168 {
169 napi_value result = nullptr;
170 napi_get_undefined(env, &result);
171
172 ImageReceiverNative *native = getNativeReceiver(env, info);
173 if (native == nullptr)
174 {
175 return result;
176 }
177
178 int32_t res = OH_Image_Receiver_Release(native);
179 napi_create_int32(env, res, &result);
180 return result;
181 }
182
setInt32NamedProperty(napi_env env,napi_value object,const char * utf8name,int32_t value)183 static void setInt32NamedProperty(napi_env env, napi_value object, const char* utf8name, int32_t value)
184 {
185 napi_value tmp;
186 napi_create_int32(env, value, &tmp);
187 napi_set_named_property(env, object, utf8name, tmp);
188 }
189
setByteArrayNamedProperty(napi_env env,napi_value object,const char * utf8name,uint8_t * buffer,size_t size)190 static void setByteArrayNamedProperty(napi_env env, napi_value object,
191 const char* utf8name, uint8_t* buffer, size_t size)
192 {
193 napi_value tmp;
194 napi_create_external_arraybuffer(env, buffer, size,
195 [](napi_env env, void* data, void* hint) { }, nullptr, &tmp);
196 napi_set_named_property(env, object, utf8name, tmp);
197 }
198
JsGetSize(napi_env env,napi_callback_info info)199 napi_value ImageReceiverNDKTest::JsGetSize(napi_env env, napi_callback_info info)
200 {
201 napi_value result = nullptr;
202 napi_get_undefined(env, &result);
203
204 ImageReceiverNative* native = getNativeReceiver(env, info);
205 if (native == nullptr) {
206 return result;
207 }
208 struct OhosImageSize size;
209 int32_t res = OH_Image_Receiver_GetSize(native, &size);
210 if (res != IMAGE_RESULT_SUCCESS) {
211 return result;
212 }
213
214 napi_create_object(env, &result);
215 setInt32NamedProperty(env, result, "width", size.width);
216 setInt32NamedProperty(env, result, "height", size.height);
217 return result;
218 }
219
JsGetCapacity(napi_env env,napi_callback_info info)220 napi_value ImageReceiverNDKTest::JsGetCapacity(napi_env env, napi_callback_info info)
221 {
222 napi_value result = nullptr;
223 napi_get_undefined(env, &result);
224
225 ImageReceiverNative* native = getNativeReceiver(env, info);
226 if (native == nullptr) {
227 return result;
228 }
229 int32_t capacity;
230 int32_t res = OH_Image_Receiver_GetCapacity(native, &capacity);
231 if (res != IMAGE_RESULT_SUCCESS) {
232 return result;
233 }
234 napi_create_int32(env, capacity, &result);
235 return result;
236 }
237
JsGetFormat(napi_env env,napi_callback_info info)238 napi_value ImageReceiverNDKTest::JsGetFormat(napi_env env, napi_callback_info info)
239 {
240 napi_value result = nullptr;
241 napi_get_undefined(env, &result);
242
243 ImageReceiverNative* native = getNativeReceiver(env, info);
244 if (native == nullptr) {
245 return result;
246 }
247 int32_t format;
248 int32_t res = OH_Image_Receiver_GetFormat(native, &format);
249 if (res != IMAGE_RESULT_SUCCESS) {
250 return result;
251 }
252 napi_create_int32(env, format, &result);
253 return result;
254 }
255
JsGetOnEventCount(napi_env env,napi_callback_info info)256 napi_value ImageReceiverNDKTest::JsGetOnEventCount(napi_env env, napi_callback_info info)
257 {
258 napi_value result = nullptr;
259 napi_create_uint32(env, sOnEvnentCount, &result);
260 return result;
261 }
262
getNativeImage(napi_env env,napi_callback_info info)263 static ImageNative* getNativeImage(napi_env env, napi_callback_info info)
264 {
265 napi_value thisVar = nullptr;
266 napi_value argValue[NUM_1] = {0};
267 size_t argCount = NUM_1;
268
269 if (napi_get_cb_info(env, info, &argCount, argValue, &thisVar, nullptr) != napi_ok ||
270 argCount < NUM_1 || argValue[NUM_0] == nullptr) {
271 return nullptr;
272 }
273 return OH_Image_InitImageNative(env, argValue[NUM_0]);
274 }
275
JsImageRelease(napi_env env,napi_callback_info info)276 napi_value ImageReceiverNDKTest::JsImageRelease(napi_env env, napi_callback_info info)
277 {
278 napi_value result = nullptr;
279 napi_get_undefined(env, &result);
280
281 ImageNative *native = getNativeImage(env, info);
282 if (native == nullptr)
283 {
284 return result;
285 }
286
287 int32_t res = OH_Image_Release(native);
288 napi_create_int32(env, res, &result);
289 return result;
290 }
291
JsImageClipRect(napi_env env,napi_callback_info info)292 napi_value ImageReceiverNDKTest::JsImageClipRect(napi_env env, napi_callback_info info)
293 {
294 napi_value result = nullptr;
295 napi_get_undefined(env, &result);
296
297 ImageNative* native = getNativeImage(env, info);
298 if (native == nullptr) {
299 return result;
300 }
301 struct OhosImageRect rect;
302 int32_t res = OH_Image_ClipRect(native, &rect);
303 if (res != IMAGE_RESULT_SUCCESS) {
304 return result;
305 }
306
307 napi_create_object(env, &result);
308 setInt32NamedProperty(env, result, "x", rect.x);
309 setInt32NamedProperty(env, result, "y", rect.y);
310 setInt32NamedProperty(env, result, "width", rect.width);
311 setInt32NamedProperty(env, result, "height", rect.height);
312 return result;
313 }
314
JsImageSize(napi_env env,napi_callback_info info)315 napi_value ImageReceiverNDKTest::JsImageSize(napi_env env, napi_callback_info info)
316 {
317 napi_value result = nullptr;
318 napi_get_undefined(env, &result);
319
320 ImageNative* native = getNativeImage(env, info);
321 if (native == nullptr) {
322 return result;
323 }
324 struct OhosImageSize size;
325 int32_t res = OH_Image_Size(native, &size);
326 if (res != IMAGE_RESULT_SUCCESS) {
327 return result;
328 }
329 napi_create_object(env, &result);
330 setInt32NamedProperty(env, result, "width", size.width);
331 setInt32NamedProperty(env, result, "height", size.height);
332 return result;
333 }
334
JsImageFormat(napi_env env,napi_callback_info info)335 napi_value ImageReceiverNDKTest::JsImageFormat(napi_env env, napi_callback_info info)
336 {
337 napi_value result = nullptr;
338 napi_get_undefined(env, &result);
339
340 ImageNative* native = getNativeImage(env, info);
341 if (native == nullptr) {
342 return result;
343 }
344 int32_t format;
345 int32_t res = OH_Image_Format(native, &format);
346 if (res != IMAGE_RESULT_SUCCESS) {
347 return result;
348 }
349 napi_create_uint32(env, format, &result);
350 return result;
351 }
352
JsImageGetComponent(napi_env env,napi_callback_info info)353 napi_value ImageReceiverNDKTest::JsImageGetComponent(napi_env env, napi_callback_info info)
354 {
355 napi_value result = nullptr;
356 napi_value thisVar = nullptr;
357 napi_value argValue[NUM_2] = {0};
358 size_t argCount = NUM_2;
359
360 napi_get_undefined(env, &result);
361
362 if (napi_get_cb_info(env, info, &argCount, argValue, &thisVar, nullptr) != napi_ok ||
363 !CheckArgs(argCount, argValue, NUM_2)) {
364 return result;
365 }
366 ImageNative* native = OH_Image_InitImageNative(env, argValue[NUM_0]);
367 if (native == nullptr) {
368 return result;
369 }
370 int32_t componentType;
371 napi_get_value_int32(env, argValue[NUM_1], &componentType);
372
373 struct OhosImageComponent component;
374 int32_t res = OH_Image_GetComponent(native, componentType, &component);
375 if (res != IMAGE_RESULT_SUCCESS) {
376 return result;
377 }
378
379 napi_create_object(env, &result);
380 LOG("ImageReceiverNDKTest::JsImageGetComponent IN [%{public}p]", component.byteBuffer);
381 setByteArrayNamedProperty(env, result, "byteBuffer", component.byteBuffer, component.size);
382 setInt32NamedProperty(env, result, "componentType", component.componentType);
383 setInt32NamedProperty(env, result, "rowStride", component.rowStride);
384 setInt32NamedProperty(env, result, "pixelStride", component.pixelStride);
385 return result;
386 }
387 }
388 }