1f6603c60Sopenharmony_ci/*
2f6603c60Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License.
5f6603c60Sopenharmony_ci * You may obtain a copy of the License at
6f6603c60Sopenharmony_ci *
7f6603c60Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f6603c60Sopenharmony_ci *
9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and
13f6603c60Sopenharmony_ci * limitations under the License.
14f6603c60Sopenharmony_ci */
15f6603c60Sopenharmony_ci
16f6603c60Sopenharmony_ci#include "napi/native_api.h"
17f6603c60Sopenharmony_ci#include <js_native_api.h>
18f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avcapability.h>
19f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avcodec_audiodecoder.h>
20f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avcodec_base.h>
21f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avdemuxer.h>
22f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avformat.h>
23f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avsource.h>
24f6603c60Sopenharmony_ci
25f6603c60Sopenharmony_ci#define FAIL (-1)
26f6603c60Sopenharmony_ci#define SUCCESS 0
27f6603c60Sopenharmony_ci#define WIDTH 1920
28f6603c60Sopenharmony_ci#define HEIGHT 1080
29f6603c60Sopenharmony_ci#define PARAM_0 0
30f6603c60Sopenharmony_ci#define PARAM_1 1
31f6603c60Sopenharmony_ci#define PARAM_2 2
32f6603c60Sopenharmony_ci#define PARAM_3 3
33f6603c60Sopenharmony_ci#define PARAM_4 4
34f6603c60Sopenharmony_ci#define PARAM_5 5
35f6603c60Sopenharmony_ci#define PARAM_6 6
36f6603c60Sopenharmony_ci#define PARAM_7 7
37f6603c60Sopenharmony_ci#define PARAM_8 8
38f6603c60Sopenharmony_ci#define PARAM_9 9
39f6603c60Sopenharmony_ci#define PARAM_10 10
40f6603c60Sopenharmony_ci#define PARAM_11 11
41f6603c60Sopenharmony_ci#define PARAM_12 12
42f6603c60Sopenharmony_ci#define PARAM_13 13
43f6603c60Sopenharmony_ci#define PARAM_14 14
44f6603c60Sopenharmony_ci#define PARAM_15 15
45f6603c60Sopenharmony_ci
46f6603c60Sopenharmony_cistatic OH_AVCapability *CreateCapability(napi_env env, napi_callback_info info)
47f6603c60Sopenharmony_ci{
48f6603c60Sopenharmony_ci    size_t argc = PARAM_6;
49f6603c60Sopenharmony_ci    napi_value args[PARAM_6] = {nullptr};
50f6603c60Sopenharmony_ci    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
51f6603c60Sopenharmony_ci    int firstParam;
52f6603c60Sopenharmony_ci    int secondParam;
53f6603c60Sopenharmony_ci    int thirdParam;
54f6603c60Sopenharmony_ci    int fourthParam;
55f6603c60Sopenharmony_ci    const char *mimeType;
56f6603c60Sopenharmony_ci    bool coder;
57f6603c60Sopenharmony_ci    OH_AVCodecCategory category;
58f6603c60Sopenharmony_ci    napi_get_value_int32(env, args[PARAM_0], &firstParam);
59f6603c60Sopenharmony_ci    napi_get_value_int32(env, args[PARAM_1], &secondParam);
60f6603c60Sopenharmony_ci    napi_get_value_int32(env, args[PARAM_2], &thirdParam);
61f6603c60Sopenharmony_ci    napi_get_value_int32(env, args[PARAM_3], &fourthParam);
62f6603c60Sopenharmony_ci    OH_AVCapability *capability;
63f6603c60Sopenharmony_ci    if (secondParam == PARAM_1) {
64f6603c60Sopenharmony_ci        coder = true;
65f6603c60Sopenharmony_ci    } else {
66f6603c60Sopenharmony_ci        coder = false;
67f6603c60Sopenharmony_ci    }
68f6603c60Sopenharmony_ci
69f6603c60Sopenharmony_ci    if (firstParam == PARAM_1) {
70f6603c60Sopenharmony_ci        mimeType = OH_AVCODEC_MIMETYPE_VIDEO_AVC;
71f6603c60Sopenharmony_ci    } else if (firstParam == PARAM_2) {
72f6603c60Sopenharmony_ci        mimeType = OH_AVCODEC_MIMETYPE_AUDIO_AAC;
73f6603c60Sopenharmony_ci    } else if (firstParam == PARAM_3) {
74f6603c60Sopenharmony_ci        mimeType = OH_AVCODEC_MIMETYPE_AUDIO_FLAC;
75f6603c60Sopenharmony_ci    } else if (firstParam == PARAM_4) {
76f6603c60Sopenharmony_ci        mimeType = OH_AVCODEC_MIMETYPE_AUDIO_VORBIS;
77f6603c60Sopenharmony_ci    } else if (firstParam == PARAM_5) {
78f6603c60Sopenharmony_ci        mimeType = OH_AVCODEC_MIMETYPE_AUDIO_MPEG;
79f6603c60Sopenharmony_ci    } else if (firstParam == PARAM_6) {
80f6603c60Sopenharmony_ci        mimeType = OH_AVCODEC_MIMETYPE_VIDEO_HEVC;
81f6603c60Sopenharmony_ci    } else if (firstParam == PARAM_7) {
82f6603c60Sopenharmony_ci        mimeType = OH_AVCODEC_MIMETYPE_VIDEO_MPEG4;
83f6603c60Sopenharmony_ci    } else if (firstParam == PARAM_8) {
84f6603c60Sopenharmony_ci        mimeType = nullptr;
85f6603c60Sopenharmony_ci    } else {
86f6603c60Sopenharmony_ci        mimeType = OH_AVCODEC_MIMETYPE_VIDEO_AVC;
87f6603c60Sopenharmony_ci    }
88f6603c60Sopenharmony_ci
89f6603c60Sopenharmony_ci    if (fourthParam == PARAM_1) {
90f6603c60Sopenharmony_ci        capability = OH_AVCodec_GetCapability(mimeType, coder);
91f6603c60Sopenharmony_ci    } else {
92f6603c60Sopenharmony_ci        if (thirdParam == PARAM_1) {
93f6603c60Sopenharmony_ci            category = HARDWARE;
94f6603c60Sopenharmony_ci        } else {
95f6603c60Sopenharmony_ci            category = SOFTWARE;
96f6603c60Sopenharmony_ci        }
97f6603c60Sopenharmony_ci        capability = OH_AVCodec_GetCapabilityByCategory(mimeType, coder, category);
98f6603c60Sopenharmony_ci    }
99f6603c60Sopenharmony_ci
100f6603c60Sopenharmony_ci    return capability;
101f6603c60Sopenharmony_ci}
102f6603c60Sopenharmony_ci
103f6603c60Sopenharmony_cistatic napi_value TestInitAVErrCode(napi_env env, napi_callback_info info, OH_AVCapability *capability)
104f6603c60Sopenharmony_ci{
105f6603c60Sopenharmony_ci    napi_value result;
106f6603c60Sopenharmony_ci    size_t argc = PARAM_6;
107f6603c60Sopenharmony_ci    napi_value args[PARAM_6] = {nullptr};
108f6603c60Sopenharmony_ci    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
109f6603c60Sopenharmony_ci    int firstParam;
110f6603c60Sopenharmony_ci    napi_get_value_int32(env, args[PARAM_0], &firstParam);
111f6603c60Sopenharmony_ci    if (firstParam == PARAM_8) {
112f6603c60Sopenharmony_ci        if (capability == nullptr) {
113f6603c60Sopenharmony_ci            napi_create_int32(env, SUCCESS, &result);
114f6603c60Sopenharmony_ci        } else {
115f6603c60Sopenharmony_ci            napi_create_int32(env, FAIL, &result);
116f6603c60Sopenharmony_ci        }
117f6603c60Sopenharmony_ci    } else {
118f6603c60Sopenharmony_ci        if (capability != nullptr) {
119f6603c60Sopenharmony_ci            napi_create_int32(env, SUCCESS, &result);
120f6603c60Sopenharmony_ci        } else {
121f6603c60Sopenharmony_ci            napi_create_int32(env, FAIL, &result);
122f6603c60Sopenharmony_ci        }
123f6603c60Sopenharmony_ci    }
124f6603c60Sopenharmony_ci
125f6603c60Sopenharmony_ci    return result;
126f6603c60Sopenharmony_ci}
127f6603c60Sopenharmony_ci
128f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityIsHardware(OH_AVCapability *capability, napi_env env, napi_callback_info info)
129f6603c60Sopenharmony_ci{
130f6603c60Sopenharmony_ci    bool checkParam = false;
131f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_IsHardware(capability);
132f6603c60Sopenharmony_ci    napi_value result = nullptr;
133f6603c60Sopenharmony_ci    int backParam = FAIL;
134f6603c60Sopenharmony_ci    if (checkParam == true) {
135f6603c60Sopenharmony_ci        backParam = SUCCESS;
136f6603c60Sopenharmony_ci    }
137f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
138f6603c60Sopenharmony_ci    return result;
139f6603c60Sopenharmony_ci}
140f6603c60Sopenharmony_ci
141f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityGetName(OH_AVCapability *capability, napi_env env, napi_callback_info info)
142f6603c60Sopenharmony_ci{
143f6603c60Sopenharmony_ci    const char *codecName = OH_AVCapability_GetName(capability);
144f6603c60Sopenharmony_ci    napi_value result = nullptr;
145f6603c60Sopenharmony_ci    int backParam = FAIL;
146f6603c60Sopenharmony_ci    if (codecName != nullptr) {
147f6603c60Sopenharmony_ci        backParam = SUCCESS;
148f6603c60Sopenharmony_ci    }
149f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
150f6603c60Sopenharmony_ci    return result;
151f6603c60Sopenharmony_ci}
152f6603c60Sopenharmony_ci
153f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityGetMaxSupportedInstances(OH_AVCapability *capability, napi_env env,
154f6603c60Sopenharmony_ci                                                         napi_callback_info info)
155f6603c60Sopenharmony_ci{
156f6603c60Sopenharmony_ci    int32_t checkParam = PARAM_0;
157f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetMaxSupportedInstances(capability);
158f6603c60Sopenharmony_ci    napi_value result = nullptr;
159f6603c60Sopenharmony_ci    int backParam = FAIL;
160f6603c60Sopenharmony_ci    if (checkParam >= PARAM_0) {
161f6603c60Sopenharmony_ci        backParam = SUCCESS;
162f6603c60Sopenharmony_ci    }
163f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
164f6603c60Sopenharmony_ci    return result;
165f6603c60Sopenharmony_ci}
166f6603c60Sopenharmony_ci
167f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityGetEncoderBitrateRange(OH_AVCapability *capability, napi_env env,
168f6603c60Sopenharmony_ci                                                       napi_callback_info info)
169f6603c60Sopenharmony_ci{
170f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
171f6603c60Sopenharmony_ci    OH_AVRange bitrateRange;
172f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetEncoderBitrateRange(capability, &bitrateRange);
173f6603c60Sopenharmony_ci    napi_value result = nullptr;
174f6603c60Sopenharmony_ci    int backParam = FAIL;
175f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_OK) {
176f6603c60Sopenharmony_ci        backParam = SUCCESS;
177f6603c60Sopenharmony_ci    }
178f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
179f6603c60Sopenharmony_ci    return result;
180f6603c60Sopenharmony_ci}
181f6603c60Sopenharmony_ci
182f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityGetEncoderBitrateRangeAbnormal(OH_AVCapability *capability, napi_env env,
183f6603c60Sopenharmony_ci                                                               napi_callback_info info)
184f6603c60Sopenharmony_ci{
185f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
186f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetEncoderBitrateRange(capability, nullptr);
187f6603c60Sopenharmony_ci    napi_value result = nullptr;
188f6603c60Sopenharmony_ci    int backParam = FAIL;
189f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_INVALID_VAL) {
190f6603c60Sopenharmony_ci        backParam = SUCCESS;
191f6603c60Sopenharmony_ci    }
192f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
193f6603c60Sopenharmony_ci    return result;
194f6603c60Sopenharmony_ci}
195f6603c60Sopenharmony_ci
196f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityIsEncoderBitrateModeSupporteda(OH_AVCapability *capability, napi_env env,
197f6603c60Sopenharmony_ci                                                               napi_callback_info info)
198f6603c60Sopenharmony_ci{
199f6603c60Sopenharmony_ci    bool checkParam = false;
200f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_IsEncoderBitrateModeSupported(capability, BITRATE_MODE_CBR);
201f6603c60Sopenharmony_ci    napi_value result = nullptr;
202f6603c60Sopenharmony_ci    int backParam = FAIL;
203f6603c60Sopenharmony_ci    if (checkParam != false) {
204f6603c60Sopenharmony_ci        backParam = SUCCESS;
205f6603c60Sopenharmony_ci    }
206f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
207f6603c60Sopenharmony_ci    return result;
208f6603c60Sopenharmony_ci}
209f6603c60Sopenharmony_ci
210f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityIsEncoderBitrateModeSupportedb(OH_AVCapability *capability, napi_env env,
211f6603c60Sopenharmony_ci                                                               napi_callback_info info)
212f6603c60Sopenharmony_ci{
213f6603c60Sopenharmony_ci    bool checkParam = false;
214f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_IsEncoderBitrateModeSupported(capability, BITRATE_MODE_VBR);
215f6603c60Sopenharmony_ci    napi_value result = nullptr;
216f6603c60Sopenharmony_ci    int backParam = FAIL;
217f6603c60Sopenharmony_ci    if (checkParam != false) {
218f6603c60Sopenharmony_ci        backParam = SUCCESS;
219f6603c60Sopenharmony_ci    }
220f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
221f6603c60Sopenharmony_ci    return result;
222f6603c60Sopenharmony_ci}
223f6603c60Sopenharmony_ci
224f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityIsEncoderBitrateModeSupportedc(OH_AVCapability *capability, napi_env env,
225f6603c60Sopenharmony_ci                                                               napi_callback_info info)
226f6603c60Sopenharmony_ci{
227f6603c60Sopenharmony_ci    bool checkParam = false;
228f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_IsEncoderBitrateModeSupported(capability, BITRATE_MODE_CQ);
229f6603c60Sopenharmony_ci    napi_value result = nullptr;
230f6603c60Sopenharmony_ci    int backParam = FAIL;
231f6603c60Sopenharmony_ci    if (checkParam != false) {
232f6603c60Sopenharmony_ci        backParam = SUCCESS;
233f6603c60Sopenharmony_ci    }
234f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
235f6603c60Sopenharmony_ci    return result;
236f6603c60Sopenharmony_ci}
237f6603c60Sopenharmony_ci
238f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityGetVideoWidthRangeForHeighta(OH_AVCapability *capability, napi_env env,
239f6603c60Sopenharmony_ci                                                             napi_callback_info info)
240f6603c60Sopenharmony_ci{
241f6603c60Sopenharmony_ci    int32_t height = HEIGHT;
242f6603c60Sopenharmony_ci    OH_AVRange widthRange;
243f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
244f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetVideoWidthRangeForHeight(capability, height, &widthRange);
245f6603c60Sopenharmony_ci    napi_value result = nullptr;
246f6603c60Sopenharmony_ci    int backParam = FAIL;
247f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_OK) {
248f6603c60Sopenharmony_ci        backParam = SUCCESS;
249f6603c60Sopenharmony_ci    }
250f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
251f6603c60Sopenharmony_ci    return result;
252f6603c60Sopenharmony_ci}
253f6603c60Sopenharmony_ci
254f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityGetVideoWidthRangeForHeightb(OH_AVCapability *capability, napi_env env,
255f6603c60Sopenharmony_ci                                                             napi_callback_info info)
256f6603c60Sopenharmony_ci{
257f6603c60Sopenharmony_ci    int32_t height = HEIGHT;
258f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
259f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetVideoWidthRangeForHeight(capability, height, nullptr);
260f6603c60Sopenharmony_ci    napi_value result = nullptr;
261f6603c60Sopenharmony_ci    int backParam = FAIL;
262f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_INVALID_VAL) {
263f6603c60Sopenharmony_ci        backParam = SUCCESS;
264f6603c60Sopenharmony_ci    }
265f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
266f6603c60Sopenharmony_ci    return result;
267f6603c60Sopenharmony_ci}
268f6603c60Sopenharmony_ci
269f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityGetVideoHeightRangeForWidtha(OH_AVCapability *capability, napi_env env,
270f6603c60Sopenharmony_ci                                                             napi_callback_info info)
271f6603c60Sopenharmony_ci{
272f6603c60Sopenharmony_ci    int32_t width = WIDTH;
273f6603c60Sopenharmony_ci    OH_AVRange heightRange;
274f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
275f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetVideoHeightRangeForWidth(capability, width, &heightRange);
276f6603c60Sopenharmony_ci    napi_value result = nullptr;
277f6603c60Sopenharmony_ci    int backParam = FAIL;
278f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_OK) {
279f6603c60Sopenharmony_ci        backParam = SUCCESS;
280f6603c60Sopenharmony_ci    }
281f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
282f6603c60Sopenharmony_ci    return result;
283f6603c60Sopenharmony_ci}
284f6603c60Sopenharmony_ci
285f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityGetVideoHeightRangeForWidthb(OH_AVCapability *capability, napi_env env,
286f6603c60Sopenharmony_ci                                                             napi_callback_info info)
287f6603c60Sopenharmony_ci{
288f6603c60Sopenharmony_ci    int32_t width = WIDTH;
289f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
290f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetVideoHeightRangeForWidth(capability, width, nullptr);
291f6603c60Sopenharmony_ci    napi_value result = nullptr;
292f6603c60Sopenharmony_ci    int backParam = FAIL;
293f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_INVALID_VAL) {
294f6603c60Sopenharmony_ci        backParam = SUCCESS;
295f6603c60Sopenharmony_ci    }
296f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
297f6603c60Sopenharmony_ci    return result;
298f6603c60Sopenharmony_ci}
299f6603c60Sopenharmony_ci
300f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityAreProfileAndLevelSupporteda(OH_AVCapability *capability, napi_env env,
301f6603c60Sopenharmony_ci                                                             napi_callback_info info)
302f6603c60Sopenharmony_ci{
303f6603c60Sopenharmony_ci
304f6603c60Sopenharmony_ci    bool checkParam = false;
305f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_AreProfileAndLevelSupported(capability, AVC_PROFILE_BASELINE, PARAM_1);
306f6603c60Sopenharmony_ci    napi_value result = nullptr;
307f6603c60Sopenharmony_ci    int backParam = FAIL;
308f6603c60Sopenharmony_ci    if (checkParam != false) {
309f6603c60Sopenharmony_ci        backParam = SUCCESS;
310f6603c60Sopenharmony_ci    }
311f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
312f6603c60Sopenharmony_ci    return result;
313f6603c60Sopenharmony_ci}
314f6603c60Sopenharmony_ci
315f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityAreProfileAndLevelSupportedb(OH_AVCapability *capability, napi_env env,
316f6603c60Sopenharmony_ci                                                             napi_callback_info info)
317f6603c60Sopenharmony_ci{
318f6603c60Sopenharmony_ci    bool checkParam = false;
319f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_AreProfileAndLevelSupported(capability, AVC_PROFILE_HIGH, PARAM_1);
320f6603c60Sopenharmony_ci    napi_value result = nullptr;
321f6603c60Sopenharmony_ci    int backParam = FAIL;
322f6603c60Sopenharmony_ci    if (checkParam != false) {
323f6603c60Sopenharmony_ci        backParam = SUCCESS;
324f6603c60Sopenharmony_ci    }
325f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
326f6603c60Sopenharmony_ci    return result;
327f6603c60Sopenharmony_ci}
328f6603c60Sopenharmony_ci
329f6603c60Sopenharmony_cistatic napi_value OHAVCapabilityAreProfileAndLevelSupportedc(OH_AVCapability *capability, napi_env env,
330f6603c60Sopenharmony_ci                                                             napi_callback_info info)
331f6603c60Sopenharmony_ci{
332f6603c60Sopenharmony_ci    bool checkParam = false;
333f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_AreProfileAndLevelSupported(capability, AVC_PROFILE_MAIN, PARAM_1);
334f6603c60Sopenharmony_ci    napi_value result = nullptr;
335f6603c60Sopenharmony_ci    int backParam = FAIL;
336f6603c60Sopenharmony_ci    if (checkParam != false) {
337f6603c60Sopenharmony_ci        backParam = SUCCESS;
338f6603c60Sopenharmony_ci    }
339f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
340f6603c60Sopenharmony_ci    return result;
341f6603c60Sopenharmony_ci}
342f6603c60Sopenharmony_ci
343f6603c60Sopenharmony_ci
344f6603c60Sopenharmony_cistatic napi_value TestForCallTiming(OH_AVCapability *capability, napi_env env, napi_callback_info info)
345f6603c60Sopenharmony_ci{
346f6603c60Sopenharmony_ci    size_t argc = PARAM_6;
347f6603c60Sopenharmony_ci    napi_value args[PARAM_6] = {nullptr};
348f6603c60Sopenharmony_ci    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
349f6603c60Sopenharmony_ci    int sixParam;
350f6603c60Sopenharmony_ci    napi_get_value_int32(env, args[PARAM_5], &sixParam);
351f6603c60Sopenharmony_ci    if (sixParam == PARAM_1) {
352f6603c60Sopenharmony_ci        return OHAVCapabilityIsHardware(capability, env, info);
353f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_2) {
354f6603c60Sopenharmony_ci        return OHAVCapabilityGetName(capability, env, info);
355f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_3) {
356f6603c60Sopenharmony_ci        return OHAVCapabilityGetMaxSupportedInstances(capability, env, info);
357f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_4) {
358f6603c60Sopenharmony_ci        return OHAVCapabilityGetEncoderBitrateRange(capability, env, info);
359f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_5) {
360f6603c60Sopenharmony_ci        return OHAVCapabilityGetEncoderBitrateRangeAbnormal(capability, env, info);
361f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_6) {
362f6603c60Sopenharmony_ci        return OHAVCapabilityIsEncoderBitrateModeSupporteda(capability, env, info);
363f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_7) {
364f6603c60Sopenharmony_ci        return OHAVCapabilityIsEncoderBitrateModeSupportedb(capability, env, info);
365f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_8) {
366f6603c60Sopenharmony_ci        return OHAVCapabilityIsEncoderBitrateModeSupportedc(capability, env, info);
367f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_9) {
368f6603c60Sopenharmony_ci        return OHAVCapabilityGetVideoWidthRangeForHeighta(capability, env, info);
369f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_10) {
370f6603c60Sopenharmony_ci        return OHAVCapabilityGetVideoWidthRangeForHeightb(capability, env, info);
371f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_11) {
372f6603c60Sopenharmony_ci        return OHAVCapabilityGetVideoHeightRangeForWidtha(capability, env, info);
373f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_12) {
374f6603c60Sopenharmony_ci        return OHAVCapabilityGetVideoHeightRangeForWidthb(capability, env, info);
375f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_13) {
376f6603c60Sopenharmony_ci        return OHAVCapabilityAreProfileAndLevelSupporteda(capability, env, info);
377f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_14) {
378f6603c60Sopenharmony_ci        return OHAVCapabilityAreProfileAndLevelSupportedb(capability, env, info);
379f6603c60Sopenharmony_ci    } else if (sixParam == PARAM_15) {
380f6603c60Sopenharmony_ci        return OHAVCapabilityAreProfileAndLevelSupportedc(capability, env, info);
381f6603c60Sopenharmony_ci    } else {
382f6603c60Sopenharmony_ci        napi_value result = nullptr;
383f6603c60Sopenharmony_ci        napi_create_int32(env, FAIL, &result);
384f6603c60Sopenharmony_ci        return result;
385f6603c60Sopenharmony_ci    }
386f6603c60Sopenharmony_ci}
387f6603c60Sopenharmony_ci
388f6603c60Sopenharmony_cistatic bool isNeedCallTiming(napi_env env, napi_callback_info info)
389f6603c60Sopenharmony_ci{
390f6603c60Sopenharmony_ci    size_t argc = PARAM_6;
391f6603c60Sopenharmony_ci    napi_value args[PARAM_6] = {nullptr};
392f6603c60Sopenharmony_ci    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
393f6603c60Sopenharmony_ci    int fiveParam;
394f6603c60Sopenharmony_ci    napi_get_value_int32(env, args[PARAM_4], &fiveParam);
395f6603c60Sopenharmony_ci    if (fiveParam == PARAM_1) {
396f6603c60Sopenharmony_ci        return true;
397f6603c60Sopenharmony_ci    } else {
398f6603c60Sopenharmony_ci        return false;
399f6603c60Sopenharmony_ci    }
400f6603c60Sopenharmony_ci}
401f6603c60Sopenharmony_ci
402f6603c60Sopenharmony_cistatic napi_value DecodeMainProcess(napi_env env, napi_callback_info info)
403f6603c60Sopenharmony_ci{
404f6603c60Sopenharmony_ci    OH_AVCapability *capability = CreateCapability(env, info);
405f6603c60Sopenharmony_ci    if (isNeedCallTiming(env, info)) {
406f6603c60Sopenharmony_ci        return TestForCallTiming(capability, env, info);
407f6603c60Sopenharmony_ci    } else {
408f6603c60Sopenharmony_ci        return TestInitAVErrCode(env, info, capability);
409f6603c60Sopenharmony_ci    }
410f6603c60Sopenharmony_ci}
411f6603c60Sopenharmony_ci
412f6603c60Sopenharmony_cistatic napi_value AVCapabilityIsHardware(napi_env env, napi_callback_info info)
413f6603c60Sopenharmony_ci{
414f6603c60Sopenharmony_ci    napi_value result = nullptr;
415f6603c60Sopenharmony_ci    int backParam = FAIL;
416f6603c60Sopenharmony_ci    OH_AVCapability *capability = nullptr;
417f6603c60Sopenharmony_ci    bool checkParam = false;
418f6603c60Sopenharmony_ci    capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, false, HARDWARE);
419f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_IsHardware(capability);
420f6603c60Sopenharmony_ci    if (checkParam != false) {
421f6603c60Sopenharmony_ci        backParam = SUCCESS;
422f6603c60Sopenharmony_ci    }
423f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
424f6603c60Sopenharmony_ci    return result;
425f6603c60Sopenharmony_ci}
426f6603c60Sopenharmony_ci
427f6603c60Sopenharmony_cistatic napi_value AVCapabilityGetName(napi_env env, napi_callback_info info)
428f6603c60Sopenharmony_ci{
429f6603c60Sopenharmony_ci    napi_value result = nullptr;
430f6603c60Sopenharmony_ci    int backParam = FAIL;
431f6603c60Sopenharmony_ci    OH_AVCapability *capability = nullptr;
432f6603c60Sopenharmony_ci    capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_MPEG4, false);
433f6603c60Sopenharmony_ci    const char *codecName = OH_AVCapability_GetName(capability);
434f6603c60Sopenharmony_ci    if (codecName != nullptr) {
435f6603c60Sopenharmony_ci        backParam = SUCCESS;
436f6603c60Sopenharmony_ci    }
437f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
438f6603c60Sopenharmony_ci    return result;
439f6603c60Sopenharmony_ci}
440f6603c60Sopenharmony_ci
441f6603c60Sopenharmony_cistatic napi_value AVCapabilityGetMaxSupportedInstances(napi_env env, napi_callback_info info)
442f6603c60Sopenharmony_ci{
443f6603c60Sopenharmony_ci    napi_value result = nullptr;
444f6603c60Sopenharmony_ci    int backParam = FAIL;
445f6603c60Sopenharmony_ci    OH_AVCapability *capability = nullptr;
446f6603c60Sopenharmony_ci    int32_t checkParam;
447f6603c60Sopenharmony_ci    capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false);
448f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetMaxSupportedInstances(capability);
449f6603c60Sopenharmony_ci    if (checkParam != FAIL) {
450f6603c60Sopenharmony_ci        backParam = SUCCESS;
451f6603c60Sopenharmony_ci    }
452f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
453f6603c60Sopenharmony_ci    return result;
454f6603c60Sopenharmony_ci
455f6603c60Sopenharmony_ci}
456f6603c60Sopenharmony_ci
457f6603c60Sopenharmony_cistatic napi_value AVCapabilityGetEncoderBitrateRange(napi_env env, napi_callback_info info)
458f6603c60Sopenharmony_ci{
459f6603c60Sopenharmony_ci    napi_value result = nullptr;
460f6603c60Sopenharmony_ci    int backParam = FAIL;
461f6603c60Sopenharmony_ci    OH_AVCapability *capability = nullptr;
462f6603c60Sopenharmony_ci    OH_AVRange bitrateRange;
463f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
464f6603c60Sopenharmony_ci    capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE);
465f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetEncoderBitrateRange(capability, &bitrateRange);
466f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_OK) {
467f6603c60Sopenharmony_ci        backParam = SUCCESS;
468f6603c60Sopenharmony_ci    }
469f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
470f6603c60Sopenharmony_ci    return result;
471f6603c60Sopenharmony_ci}
472f6603c60Sopenharmony_ci
473f6603c60Sopenharmony_cistatic napi_value AVCapabilityIsEncoderBitrateModeSupported(napi_env env, napi_callback_info info)
474f6603c60Sopenharmony_ci{
475f6603c60Sopenharmony_ci    napi_value result = nullptr;
476f6603c60Sopenharmony_ci    int backParam = FAIL;
477f6603c60Sopenharmony_ci    OH_AVCapability *capability = nullptr;
478f6603c60Sopenharmony_ci    bool checkParam = false;
479f6603c60Sopenharmony_ci    capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true);
480f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_IsEncoderBitrateModeSupported(capability, BITRATE_MODE_CBR);
481f6603c60Sopenharmony_ci    if (checkParam != false) {
482f6603c60Sopenharmony_ci        backParam = SUCCESS;
483f6603c60Sopenharmony_ci    }
484f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
485f6603c60Sopenharmony_ci    return result;
486f6603c60Sopenharmony_ci}
487f6603c60Sopenharmony_ci
488f6603c60Sopenharmony_cistatic napi_value AVCapabilityGetVideoWidthRangeForHeight(napi_env env, napi_callback_info info)
489f6603c60Sopenharmony_ci{
490f6603c60Sopenharmony_ci    napi_value result = nullptr;
491f6603c60Sopenharmony_ci    int backParam = FAIL;
492f6603c60Sopenharmony_ci    OH_AVCapability *capability = nullptr;
493f6603c60Sopenharmony_ci    int32_t height = HEIGHT;
494f6603c60Sopenharmony_ci    OH_AVRange widthRange;
495f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
496f6603c60Sopenharmony_ci    capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, SOFTWARE);
497f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetVideoWidthRangeForHeight(capability, height, &widthRange);
498f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_OK) {
499f6603c60Sopenharmony_ci        backParam = SUCCESS;
500f6603c60Sopenharmony_ci    }
501f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
502f6603c60Sopenharmony_ci    return result;
503f6603c60Sopenharmony_ci}
504f6603c60Sopenharmony_ci
505f6603c60Sopenharmony_cistatic napi_value AVCapabilityGetVideoHeightRangeForWidth(napi_env env, napi_callback_info info)
506f6603c60Sopenharmony_ci{
507f6603c60Sopenharmony_ci    napi_value result = nullptr;
508f6603c60Sopenharmony_ci    int backParam = FAIL;
509f6603c60Sopenharmony_ci    OH_AVCapability *capability = nullptr;
510f6603c60Sopenharmony_ci    int32_t width = WIDTH;
511f6603c60Sopenharmony_ci    OH_AVRange heightRange;
512f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
513f6603c60Sopenharmony_ci    capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true);
514f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_GetVideoHeightRangeForWidth(capability, width, &heightRange);
515f6603c60Sopenharmony_ci    if (checkParam == AV_ERR_OK) {
516f6603c60Sopenharmony_ci        backParam = SUCCESS;
517f6603c60Sopenharmony_ci    }
518f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
519f6603c60Sopenharmony_ci    return result;
520f6603c60Sopenharmony_ci}
521f6603c60Sopenharmony_ci
522f6603c60Sopenharmony_cistatic napi_value AVCapabilityAreProfileAndLevelSupported(napi_env env, napi_callback_info info)
523f6603c60Sopenharmony_ci{
524f6603c60Sopenharmony_ci    napi_value result = nullptr;
525f6603c60Sopenharmony_ci    int backParam = FAIL;
526f6603c60Sopenharmony_ci    OH_AVCapability *capability = nullptr;
527f6603c60Sopenharmony_ci    bool checkParam = false;
528f6603c60Sopenharmony_ci    capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false);
529f6603c60Sopenharmony_ci    checkParam = OH_AVCapability_AreProfileAndLevelSupported(capability, AVC_PROFILE_BASELINE, PARAM_1);
530f6603c60Sopenharmony_ci    if (checkParam != false) {
531f6603c60Sopenharmony_ci        backParam = SUCCESS;
532f6603c60Sopenharmony_ci    }
533f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
534f6603c60Sopenharmony_ci    return result;
535f6603c60Sopenharmony_ci}
536f6603c60Sopenharmony_ci
537f6603c60Sopenharmony_ciEXTERN_C_START
538f6603c60Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports)
539f6603c60Sopenharmony_ci{
540f6603c60Sopenharmony_ci    napi_property_descriptor desc[] = {
541f6603c60Sopenharmony_ci        {"decodeMainProcess", nullptr, DecodeMainProcess, nullptr, nullptr, nullptr, napi_default, nullptr},
542f6603c60Sopenharmony_ci        {"OH_AVCapability_IsHardware", nullptr, AVCapabilityIsHardware, nullptr, nullptr,
543f6603c60Sopenharmony_ci            nullptr,napi_default, nullptr},
544f6603c60Sopenharmony_ci        {"OH_AVCapability_GetName", nullptr, AVCapabilityGetName, nullptr, nullptr, nullptr, napi_default, nullptr},
545f6603c60Sopenharmony_ci        {"OH_AVCapability_GetMaxSupportedInstances", nullptr, AVCapabilityGetMaxSupportedInstances,
546f6603c60Sopenharmony_ci            nullptr, nullptr, nullptr, napi_default, nullptr},
547f6603c60Sopenharmony_ci        {"OH_AVCapability_GetEncoderBitrateRange", nullptr, AVCapabilityGetEncoderBitrateRange,
548f6603c60Sopenharmony_ci            nullptr, nullptr, nullptr, napi_default, nullptr},
549f6603c60Sopenharmony_ci        {"OH_AVCapability_IsEncoderBitrateModeSupported", nullptr, AVCapabilityIsEncoderBitrateModeSupported,
550f6603c60Sopenharmony_ci            nullptr, nullptr, nullptr, napi_default, nullptr},
551f6603c60Sopenharmony_ci        {"OH_AVCapability_GetVideoWidthRangeForHeight", nullptr, AVCapabilityGetVideoWidthRangeForHeight,
552f6603c60Sopenharmony_ci            nullptr, nullptr, nullptr, napi_default, nullptr},
553f6603c60Sopenharmony_ci        {"OH_AVCapability_GetVideoHeightRangeForWidth", nullptr, AVCapabilityGetVideoHeightRangeForWidth,
554f6603c60Sopenharmony_ci            nullptr, nullptr, nullptr, napi_default, nullptr},
555f6603c60Sopenharmony_ci        {"OH_AVCapability_AreProfileAndLevelSupported", nullptr, AVCapabilityAreProfileAndLevelSupported,
556f6603c60Sopenharmony_ci            nullptr, nullptr, nullptr, napi_default, nullptr},
557f6603c60Sopenharmony_ci    };
558f6603c60Sopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
559f6603c60Sopenharmony_ci    return exports;
560f6603c60Sopenharmony_ci}
561f6603c60Sopenharmony_ci
562f6603c60Sopenharmony_ciEXTERN_C_END
563f6603c60Sopenharmony_ci
564f6603c60Sopenharmony_cistatic napi_module demoModule = {
565f6603c60Sopenharmony_ci    .nm_version = 1,
566f6603c60Sopenharmony_ci    .nm_flags = 0,
567f6603c60Sopenharmony_ci    .nm_filename = nullptr,
568f6603c60Sopenharmony_ci    .nm_register_func = Init,
569f6603c60Sopenharmony_ci    .nm_modname = "native",
570f6603c60Sopenharmony_ci    .nm_priv = ((void *)0),
571f6603c60Sopenharmony_ci    .reserved = {0},
572f6603c60Sopenharmony_ci};
573f6603c60Sopenharmony_ci
574f6603c60Sopenharmony_ciextern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }