1 /*
2 * Copyright (c) 2025 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 #include "napi/native_api.h"
16 #include <cstdint>
17 #include <hilog/log.h>
18 #include <multimedia/player_framework/native_avcodec_base.h>
19 #include <native_image/native_image.h>
20 #include <native_window/external_window.h>
21 #include <native_buffer/native_buffer.h>
22 #include "ace/xcomponent/native_interface_xcomponent.h"
23 #include "NativeBufferTest.h"
24 #include "nativewindow.h"
25 #define SUCCESS 0
addNativeBufferTest1(std::vector<napi_property_descriptor> & descData)26 void addNativeBufferTest1(std::vector<napi_property_descriptor>& descData)
27 {
28 descData.push_back({"testNativeBufferEBUFULL", nullptr, testNativeBufferEBUFULL,
29 nullptr, nullptr, nullptr, napi_default, nullptr});
30 descData.push_back({"testNativeBufferSMPTECFULL", nullptr, testNativeBufferSMPTECFULL,
31 nullptr, nullptr, nullptr, napi_default, nullptr});
32 descData.push_back({"testNativeBufferEBULIMIT", nullptr, testNativeBufferEBULIMIT,
33 nullptr, nullptr, nullptr, napi_default, nullptr});
34 descData.push_back({"testNativeBufferSMPTECLIMIT", nullptr, testNativeBufferSMPTECLIMIT,
35 nullptr, nullptr, nullptr, napi_default, nullptr});
36 descData.push_back({"testNativeBufferADOBERGBFULL", nullptr, testNativeBufferADOBERGBFULL,
37 nullptr, nullptr, nullptr, napi_default, nullptr});
38 descData.push_back({"testNativeLINEARSRGB", nullptr, testNativeLINEARSRGB,
39 nullptr, nullptr, nullptr, napi_default, nullptr});
40 descData.push_back({"testNativeBufferLINEARBT709", nullptr, testNativeBufferLINEARBT709,
41 nullptr, nullptr, nullptr, napi_default, nullptr});
42 descData.push_back({"testNativeLINEARP3", nullptr, testNativeLINEARP3,
43 nullptr, nullptr, nullptr, napi_default, nullptr});
44 descData.push_back({"testNativeBufferLINEARBT2020", nullptr, testNativeBufferLINEARBT2020,
45 nullptr, nullptr, nullptr, napi_default, nullptr});
46 descData.push_back({"testNativeBufferDISPLAYSRGB", nullptr, testNativeBufferDISPLAYSRGB,
47 nullptr, nullptr, nullptr, napi_default, nullptr});
48 descData.push_back({"testNativeBufferDISPLAYP3SRGB", nullptr, testNativeBufferDISPLAYP3SRGB,
49 nullptr, nullptr, nullptr, napi_default, nullptr});
50 }
addNativeBufferTest(std::vector<napi_property_descriptor> & descData)51 void addNativeBufferTest(std::vector<napi_property_descriptor>& descData)
52 {
53 addNativeBufferTest1(descData);
54 descData.push_back({"testNativeBufferDISPLAYP3HLG", nullptr, testNativeBufferDISPLAYP3HLG,
55 nullptr, nullptr, nullptr, napi_default, nullptr});
56 descData.push_back({"testNativeBufferDISPLAYP3PQ", nullptr, testNativeBufferDISPLAYP3PQ,
57 nullptr, nullptr, nullptr, napi_default, nullptr});
58 descData.push_back({"testNativeBufferDISPLAYBT2020SRGB", nullptr, testNativeBufferDISPLAYBT2020SRGB,
59 nullptr, nullptr, nullptr, napi_default, nullptr});
60 descData.push_back({"testNativeBufferDISPLAYBT2020HLG", nullptr, testNativeBufferDISPLAYBT2020HLG,
61 nullptr, nullptr, nullptr, napi_default, nullptr});
62 descData.push_back({"testNativeBufferDISPLAYBT2020PQ", nullptr, testNativeBufferDISPLAYBT2020PQ,
63 nullptr, nullptr, nullptr, napi_default, nullptr});
64 descData.push_back({"ColorX", nullptr, ColorX, nullptr, nullptr, nullptr, napi_default, nullptr});
65 descData.push_back({"ColorY", nullptr, ColorY, nullptr, nullptr, nullptr, napi_default, nullptr});
66 descData.push_back({"Smpte2086Red", nullptr, Smpte2086Red, nullptr, nullptr, nullptr, napi_default, nullptr});
67 descData.push_back({"Smpte2086Green", nullptr, Smpte2086Green, nullptr, nullptr, nullptr, napi_default, nullptr});
68 descData.push_back({"Smpte2086Blue", nullptr, Smpte2086Blue, nullptr, nullptr, nullptr, napi_default, nullptr});
69 descData.push_back({"Smpte2086WhitePoint", nullptr, Smpte2086WhitePoint,
70 nullptr, nullptr, nullptr, napi_default, nullptr});
71 descData.push_back({"Smpte2086MaxLum", nullptr, Smpte2086MaxLum,
72 nullptr, nullptr, nullptr, napi_default, nullptr});
73 descData.push_back({"Smpte2086MinLum", nullptr, Smpte2086MinLum,
74 nullptr, nullptr, nullptr, napi_default, nullptr});
75 descData.push_back({"Cta861MaxContentLightLevel", nullptr, Cta861MaxContentLightLevel,
76 nullptr, nullptr, nullptr, napi_default, nullptr});
77 descData.push_back({"Cta861MaxFrameAverageLightLevel", nullptr, Cta861MaxFrameAverageLightLevel,
78 nullptr, nullptr, nullptr, napi_default, nullptr});
79 }
testNativeBufferEBUFULL(napi_env env,napi_callback_info info)80 napi_value testNativeBufferEBUFULL(napi_env env, napi_callback_info info)
81 {
82 napi_value result = nullptr;
83 InitNativeWindow *initNative = new InitNativeWindow();
84 OHNativeWindow *nativeWindow = nullptr;
85 nativeWindow = initNative->returnNativeWindow();
86 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_BT601_EBU_FULL);
87 napi_create_int32(env, res, &result);
88 return result;
89 }
90
testNativeBufferSMPTECFULL(napi_env env,napi_callback_info info)91 napi_value testNativeBufferSMPTECFULL(napi_env env, napi_callback_info info)
92 {
93 napi_value result = nullptr;
94 InitNativeWindow *initNative = new InitNativeWindow();
95 OHNativeWindow *nativeWindow = nullptr;
96 nativeWindow = initNative->returnNativeWindow();
97 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_BT601_SMPTE_C_FULL);
98 napi_create_int32(env, res, &result);
99 return result;
100 }
101
testNativeBufferEBULIMIT(napi_env env,napi_callback_info info)102 napi_value testNativeBufferEBULIMIT(napi_env env, napi_callback_info info)
103 {
104 napi_value result = nullptr;
105 InitNativeWindow *initNative = new InitNativeWindow();
106 OHNativeWindow *nativeWindow = nullptr;
107 nativeWindow = initNative->returnNativeWindow();
108 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_BT601_EBU_LIMIT);
109 napi_create_int32(env, res, &result);
110 return result;
111 }
112
testNativeBufferSMPTECLIMIT(napi_env env,napi_callback_info info)113 napi_value testNativeBufferSMPTECLIMIT(napi_env env, napi_callback_info info)
114 {
115 napi_value result = nullptr;
116 InitNativeWindow *initNative = new InitNativeWindow();
117 OHNativeWindow *nativeWindow = nullptr;
118 nativeWindow = initNative->returnNativeWindow();
119 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_BT601_SMPTE_C_LIMIT);
120 napi_create_int32(env, res, &result);
121 return result;
122 }
123
testNativeBufferADOBERGBFULL(napi_env env,napi_callback_info info)124 napi_value testNativeBufferADOBERGBFULL(napi_env env, napi_callback_info info)
125 {
126 napi_value result = nullptr;
127 InitNativeWindow *initNative = new InitNativeWindow();
128 OHNativeWindow *nativeWindow = nullptr;
129 nativeWindow = initNative->returnNativeWindow();
130 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_ADOBERGB_FULL);
131 napi_create_int32(env, res, &result);
132 return result;
133 }
134
testNativeLINEARSRGB(napi_env env,napi_callback_info info)135 napi_value testNativeLINEARSRGB(napi_env env, napi_callback_info info)
136 {
137 napi_value result = nullptr;
138 InitNativeWindow *initNative = new InitNativeWindow();
139 OHNativeWindow *nativeWindow = nullptr;
140 nativeWindow = initNative->returnNativeWindow();
141 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_LINEAR_SRGB);
142 napi_create_int32(env, res, &result);
143 return result;
144 }
145
testNativeBufferLINEARBT709(napi_env env,napi_callback_info info)146 napi_value testNativeBufferLINEARBT709(napi_env env, napi_callback_info info)
147 {
148 napi_value result = nullptr;
149 InitNativeWindow *initNative = new InitNativeWindow();
150 OHNativeWindow *nativeWindow = nullptr;
151 nativeWindow = initNative->returnNativeWindow();
152 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_LINEAR_BT709);
153 napi_create_int32(env, res, &result);
154 return result;
155 }
156
testNativeLINEARP3(napi_env env,napi_callback_info info)157 napi_value testNativeLINEARP3(napi_env env, napi_callback_info info)
158 {
159 napi_value result = nullptr;
160 InitNativeWindow *initNative = new InitNativeWindow();
161 OHNativeWindow *nativeWindow = nullptr;
162 nativeWindow = initNative->returnNativeWindow();
163 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_LINEAR_P3);
164 napi_create_int32(env, res, &result);
165 return result;
166 }
167
testNativeBufferLINEARBT2020(napi_env env,napi_callback_info info)168 napi_value testNativeBufferLINEARBT2020(napi_env env, napi_callback_info info)
169 {
170 napi_value result = nullptr;
171 InitNativeWindow *initNative = new InitNativeWindow();
172 OHNativeWindow *nativeWindow = nullptr;
173 nativeWindow = initNative->returnNativeWindow();
174 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_LINEAR_BT2020);
175 napi_create_int32(env, res, &result);
176 return result;
177 }
178
testNativeBufferDISPLAYSRGB(napi_env env,napi_callback_info info)179 napi_value testNativeBufferDISPLAYSRGB(napi_env env, napi_callback_info info)
180 {
181 napi_value result = nullptr;
182 InitNativeWindow *initNative = new InitNativeWindow();
183 OHNativeWindow *nativeWindow = nullptr;
184 nativeWindow = initNative->returnNativeWindow();
185 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_DISPLAY_SRGB);
186 napi_create_int32(env, res, &result);
187 return result;
188 }
189
testNativeBufferDISPLAYP3SRGB(napi_env env,napi_callback_info info)190 napi_value testNativeBufferDISPLAYP3SRGB(napi_env env, napi_callback_info info)
191 {
192 napi_value result = nullptr;
193 InitNativeWindow *initNative = new InitNativeWindow();
194 OHNativeWindow *nativeWindow = nullptr;
195 nativeWindow = initNative->returnNativeWindow();
196 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_DISPLAY_P3_SRGB);
197 napi_create_int32(env, res, &result);
198 return result;
199 }
200
testNativeBufferDISPLAYP3HLG(napi_env env,napi_callback_info info)201 napi_value testNativeBufferDISPLAYP3HLG(napi_env env, napi_callback_info info)
202 {
203 napi_value result = nullptr;
204 InitNativeWindow *initNative = new InitNativeWindow();
205 OHNativeWindow *nativeWindow = nullptr;
206 nativeWindow = initNative->returnNativeWindow();
207 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_DISPLAY_P3_HLG);
208 napi_create_int32(env, res, &result);
209 return result;
210 }
211
testNativeBufferDISPLAYP3PQ(napi_env env,napi_callback_info info)212 napi_value testNativeBufferDISPLAYP3PQ(napi_env env, napi_callback_info info)
213 {
214 napi_value result = nullptr;
215 InitNativeWindow *initNative = new InitNativeWindow();
216 OHNativeWindow *nativeWindow = nullptr;
217 nativeWindow = initNative->returnNativeWindow();
218 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_DISPLAY_P3_PQ);
219 napi_create_int32(env, res, &result);
220 return result;
221 }
222
testNativeBufferDISPLAYBT2020SRGB(napi_env env,napi_callback_info info)223 napi_value testNativeBufferDISPLAYBT2020SRGB(napi_env env, napi_callback_info info)
224 {
225 napi_value result = nullptr;
226 InitNativeWindow *initNative = new InitNativeWindow();
227 OHNativeWindow *nativeWindow = nullptr;
228 nativeWindow = initNative->returnNativeWindow();
229 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_DISPLAY_BT2020_SRGB);
230 napi_create_int32(env, res, &result);
231 return result;
232 }
233
testNativeBufferDISPLAYBT2020HLG(napi_env env,napi_callback_info info)234 napi_value testNativeBufferDISPLAYBT2020HLG(napi_env env, napi_callback_info info)
235 {
236 napi_value result = nullptr;
237 InitNativeWindow *initNative = new InitNativeWindow();
238 OHNativeWindow *nativeWindow = nullptr;
239 nativeWindow = initNative->returnNativeWindow();
240 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_DISPLAY_BT2020_HLG);
241 napi_create_int32(env, res, &result);
242 return result;
243 }
244
testNativeBufferDISPLAYBT2020PQ(napi_env env,napi_callback_info info)245 napi_value testNativeBufferDISPLAYBT2020PQ(napi_env env, napi_callback_info info)
246 {
247 napi_value result = nullptr;
248 InitNativeWindow *initNative = new InitNativeWindow();
249 OHNativeWindow *nativeWindow = nullptr;
250 nativeWindow = initNative->returnNativeWindow();
251 int32_t res = OH_NativeWindow_SetColorSpace(nativeWindow, OH_COLORSPACE_DISPLAY_BT2020_PQ);
252 napi_create_int32(env, res, &result);
253 return result;
254 }
255
ColorX(napi_env env,napi_callback_info info)256 napi_value ColorX(napi_env env, napi_callback_info info)
257 {
258 OH_NativeBuffer_ColorXY *pColor = new OH_NativeBuffer_ColorXY();
259 pColor->x = 0.1f;
260 pColor->y = 0.9f;
261 if (pColor->x == 0.1f) {
262 napi_value result = nullptr;
263 napi_create_int32(env, 0, &result);
264 return result;
265 } else {
266 napi_value result = nullptr;
267 napi_create_int32(env, -1, &result);
268 return result;
269 }
270 }
271
ColorY(napi_env env,napi_callback_info info)272 napi_value ColorY(napi_env env, napi_callback_info info)
273 {
274 OH_NativeBuffer_ColorXY *pColor = new OH_NativeBuffer_ColorXY();
275 pColor->x = 0.1f;
276 pColor->y = 0.9f;
277 if (pColor->y == 0.9f) {
278 napi_value result = nullptr;
279 napi_create_int32(env, 0, &result);
280 return result;
281 } else {
282 napi_value result = nullptr;
283 napi_create_int32(env, -1, &result);
284 return result;
285 }
286 }
287
Smpte2086Red(napi_env env,napi_callback_info info)288 napi_value Smpte2086Red(napi_env env, napi_callback_info info)
289 {
290 // 构造测试数据
291 OH_NativeBuffer_ColorXY red;
292 red.x = 0.7f;
293 red.y = 0.3f;
294
295 OH_NativeBuffer_Smpte2086 metadata;
296 metadata.displayPrimaryRed = red;
297 if (metadata.displayPrimaryRed.x == 0.7f && metadata.displayPrimaryRed.y == 0.3f) {
298 napi_value result = nullptr;
299 napi_create_int32(env, 0, &result);
300 return result;
301 } else {
302 napi_value result = nullptr;
303 napi_create_int32(env, -1, &result);
304 return result;
305 }
306 }
307
Smpte2086Green(napi_env env,napi_callback_info info)308 napi_value Smpte2086Green(napi_env env, napi_callback_info info)
309 {
310 OH_NativeBuffer_ColorXY green;
311 green.x = 0.2f;
312 green.y = 0.8f;
313 OH_NativeBuffer_Smpte2086 metadata;
314 metadata.displayPrimaryGreen = green;
315 if (metadata.displayPrimaryGreen.x == 0.2f && metadata.displayPrimaryGreen.y == 0.8f) {
316 napi_value result = nullptr;
317 napi_create_int32(env, 0, &result);
318 return result;
319 } else {
320 napi_value result = nullptr;
321 napi_create_int32(env, -1, &result);
322 return result;
323 }
324 }
325
Smpte2086Blue(napi_env env,napi_callback_info info)326 napi_value Smpte2086Blue(napi_env env, napi_callback_info info)
327 {
328 OH_NativeBuffer_ColorXY blue;
329 blue.x = 0.1f;
330 blue.y = 0.1f;
331 OH_NativeBuffer_Smpte2086 metadata;
332 metadata.displayPrimaryBlue = blue;
333 if (metadata.displayPrimaryBlue.x == 0.1f && metadata.displayPrimaryBlue.y == 0.1f) {
334 napi_value result = nullptr;
335 napi_create_int32(env, 0, &result);
336 return result;
337 } else {
338 napi_value result = nullptr;
339 napi_create_int32(env, -1, &result);
340 return result;
341 }
342 }
343
Smpte2086WhitePoint(napi_env env,napi_callback_info info)344 napi_value Smpte2086WhitePoint(napi_env env, napi_callback_info info)
345 {
346 OH_NativeBuffer_ColorXY whitePoint;
347 whitePoint.x = 0.3127f;
348 whitePoint.y = 0.3290f;
349 OH_NativeBuffer_Smpte2086 metadata;
350 metadata.whitePoint = whitePoint;
351 if (metadata.whitePoint.x == 0.3127f && metadata.whitePoint.y == 0.3290f) {
352 napi_value result = nullptr;
353 napi_create_int32(env, 0, &result);
354 return result;
355 } else {
356 napi_value result = nullptr;
357 napi_create_int32(env, -1, &result);
358 return result;
359 }
360 }
361
Smpte2086MaxLum(napi_env env,napi_callback_info info)362 napi_value Smpte2086MaxLum(napi_env env, napi_callback_info info)
363 {
364 float maxLum = 1000.0f;
365 OH_NativeBuffer_Smpte2086 metadata;
366 metadata.maxLuminance = maxLum;
367 if (metadata.maxLuminance == 1000.0f) {
368 napi_value result = nullptr;
369 napi_create_int32(env, 0, &result);
370 return result;
371 } else {
372 napi_value result = nullptr;
373 napi_create_int32(env, -1, &result);
374 return result;
375 }
376 }
377
Smpte2086MinLum(napi_env env,napi_callback_info info)378 napi_value Smpte2086MinLum(napi_env env, napi_callback_info info)
379 {
380 float minLum = 1000.0f;
381 OH_NativeBuffer_Smpte2086 metadata;
382 metadata.minLuminance = minLum;
383 if (metadata.minLuminance == 1000.0f) {
384 napi_value result = nullptr;
385 napi_create_int32(env, 0, &result);
386 return result;
387 } else {
388 napi_value result = nullptr;
389 napi_create_int32(env, -1, &result);
390 return result;
391 }
392 }
393
Cta861MaxContentLightLevel(napi_env env,napi_callback_info info)394 napi_value Cta861MaxContentLightLevel(napi_env env, napi_callback_info info)
395 {
396 float maxContentLight = 1000.0f;
397 OH_NativeBuffer_Cta861 metadata;
398 metadata.maxContentLightLevel = maxContentLight;
399 if (metadata.maxContentLightLevel == 1000.0f) {
400 napi_value result = nullptr;
401 napi_create_int32(env, 0, &result);
402 return result;
403 } else {
404 napi_value result = nullptr;
405 napi_create_int32(env, -1, &result);
406 return result;
407 }
408 }
409
Cta861MaxFrameAverageLightLevel(napi_env env,napi_callback_info info)410 napi_value Cta861MaxFrameAverageLightLevel(napi_env env, napi_callback_info info)
411 {
412 float maxFrameAverageLight = 200.0f;
413 OH_NativeBuffer_Cta861 metadata;
414 metadata.maxFrameAverageLightLevel = maxFrameAverageLight;
415 if (metadata.maxFrameAverageLightLevel == 200.0f) {
416 napi_value result = nullptr;
417 napi_create_int32(env, 0, &result);
418 return result;
419 } else {
420 napi_value result = nullptr;
421 napi_create_int32(env, -1, &result);
422 return result;
423 }
424 }
425
smpte2086(napi_env env,napi_callback_info info)426 napi_value smpte2086(napi_env env, napi_callback_info info)
427 {
428 OH_NativeBuffer_StaticMetadata metadata;
429 metadata.smpte2086 = {.displayPrimaryRed = {0.7f, 0.3f},
430 .displayPrimaryGreen = {0.2f, 0.8f},
431 .displayPrimaryBlue = {0.1f, 0.1f},
432 .whitePoint = {0.3127f, 0.3290f},
433 .maxLuminance = 1000.0f,
434 .minLuminance = 0.0001f};
435 if (metadata.smpte2086.displayPrimaryRed.x == 0.7f && metadata.smpte2086.displayPrimaryRed.y == 0.3f &&
436 metadata.smpte2086.displayPrimaryGreen.x == 0.2f && metadata.smpte2086.displayPrimaryGreen.y == 0.8f &&
437 metadata.smpte2086.displayPrimaryBlue.x == 0.1f && metadata.smpte2086.displayPrimaryBlue.y == 0.1f &&
438 metadata.smpte2086.whitePoint.x == 0.3127f && metadata.smpte2086.whitePoint.y == 0.3290f &&
439 metadata.smpte2086.maxLuminance == 1000.0f && metadata.smpte2086.minLuminance == 0.0001f) {
440 napi_value result = nullptr;
441 napi_create_int32(env, 0, &result);
442 return result;
443 } else {
444 napi_value result = nullptr;
445 napi_create_int32(env, -1, &result);
446 return result;
447 }
448 }
449
cta861(napi_env env,napi_callback_info info)450 napi_value cta861(napi_env env, napi_callback_info info)
451 {
452 OH_NativeBuffer_StaticMetadata metadata;
453 metadata.cta861 = {.maxContentLightLevel = 1000.0f, .maxFrameAverageLightLevel = 200.0f};
454 if (metadata.cta861.maxContentLightLevel == 1000.0f && metadata.cta861.maxFrameAverageLightLevel == 200.0f) {
455 napi_value result = nullptr;
456 napi_create_int32(env, 0, &result);
457 return result;
458 } else {
459 napi_value result = nullptr;
460 napi_create_int32(env, -1, &result);
461 return result;
462 }
463 }