• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }