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 <fcntl.h>
18f6603c60Sopenharmony_ci#include <js_native_api_types.h>
19f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avsource.h>
20f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avdemuxer.h>
21f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avcapability.h>
22f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avcodec_base.h>
23f6603c60Sopenharmony_ci#include <multimedia/player_framework/native_avformat.h>
24f6603c60Sopenharmony_ci#include <sys/stat.h>
25f6603c60Sopenharmony_ci#include <unistd.h>
26f6603c60Sopenharmony_ci
27f6603c60Sopenharmony_ci#define FAIL (-1)
28f6603c60Sopenharmony_ci#define SUCCESS 0
29f6603c60Sopenharmony_ci#define ZEROVAL 0
30f6603c60Sopenharmony_ci#define PARAM_0666 0666
31f6603c60Sopenharmony_ci#define PARAM_0 0
32f6603c60Sopenharmony_cistatic napi_value AVSourceCreateWithURI(napi_env env, napi_callback_info info)
33f6603c60Sopenharmony_ci{
34f6603c60Sopenharmony_ci    int checkParam = FAIL;
35f6603c60Sopenharmony_ci    OH_AVSource *backParam = nullptr;
36f6603c60Sopenharmony_ci    backParam = OH_AVSource_CreateWithURI(nullptr);
37f6603c60Sopenharmony_ci    if (backParam != nullptr) {
38f6603c60Sopenharmony_ci        checkParam = SUCCESS;
39f6603c60Sopenharmony_ci    }
40f6603c60Sopenharmony_ci    OH_AVSource_Destroy(backParam);
41f6603c60Sopenharmony_ci    backParam = nullptr;
42f6603c60Sopenharmony_ci    napi_value result = nullptr;
43f6603c60Sopenharmony_ci    napi_create_int32(env, checkParam, &result);
44f6603c60Sopenharmony_ci    return result;
45f6603c60Sopenharmony_ci}
46f6603c60Sopenharmony_ci
47f6603c60Sopenharmony_cistatic napi_value AVSourceCreateWithFD(napi_env env, napi_callback_info info)
48f6603c60Sopenharmony_ci{
49f6603c60Sopenharmony_ci    int backParam = FAIL;
50f6603c60Sopenharmony_ci    OH_AVSource *checkParam = nullptr;
51f6603c60Sopenharmony_ci    char fileName[] = {"/data/storage/el2/base/files/demo.mp4"};
52f6603c60Sopenharmony_ci    int fd = open(fileName, O_RDONLY, PARAM_0666);
53f6603c60Sopenharmony_ci    struct stat fileStatus {};
54f6603c60Sopenharmony_ci    size_t fileSize = PARAM_0;
55f6603c60Sopenharmony_ci    if (stat(fileName, &fileStatus) == ZEROVAL) {
56f6603c60Sopenharmony_ci        fileSize = static_cast<size_t>(fileStatus.st_size);
57f6603c60Sopenharmony_ci    } else {
58f6603c60Sopenharmony_ci        napi_value result = nullptr;
59f6603c60Sopenharmony_ci        napi_create_int32(env, backParam, &result);
60f6603c60Sopenharmony_ci        return result;
61f6603c60Sopenharmony_ci    }
62f6603c60Sopenharmony_ci    checkParam = OH_AVSource_CreateWithFD(fd, PARAM_0, fileSize);
63f6603c60Sopenharmony_ci    if (checkParam != nullptr) {
64f6603c60Sopenharmony_ci        backParam = SUCCESS;
65f6603c60Sopenharmony_ci    }
66f6603c60Sopenharmony_ci    OH_AVSource_Destroy(checkParam);
67f6603c60Sopenharmony_ci    checkParam = nullptr;
68f6603c60Sopenharmony_ci    napi_value result = nullptr;
69f6603c60Sopenharmony_ci    close(fd);
70f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
71f6603c60Sopenharmony_ci    return result;
72f6603c60Sopenharmony_ci}
73f6603c60Sopenharmony_ci
74f6603c60Sopenharmony_cistatic napi_value AVSourceDestroy(napi_env env, napi_callback_info info)
75f6603c60Sopenharmony_ci{
76f6603c60Sopenharmony_ci    int backParam = FAIL;
77f6603c60Sopenharmony_ci    OH_AVSource *getSource = nullptr;
78f6603c60Sopenharmony_ci    napi_value result = nullptr;
79f6603c60Sopenharmony_ci    OH_AVErrCode checkParam;
80f6603c60Sopenharmony_ci    char fileName[] = {"/data/storage/el2/base/files/demo.mp4"};
81f6603c60Sopenharmony_ci    int fd = open(fileName, O_RDONLY, PARAM_0666);
82f6603c60Sopenharmony_ci    struct stat fileStatus {};
83f6603c60Sopenharmony_ci    size_t fileSize = PARAM_0;
84f6603c60Sopenharmony_ci    if (stat(fileName, &fileStatus) == ZEROVAL) {
85f6603c60Sopenharmony_ci        fileSize = static_cast<size_t>(fileStatus.st_size);
86f6603c60Sopenharmony_ci    } else {
87f6603c60Sopenharmony_ci        result = nullptr;
88f6603c60Sopenharmony_ci        napi_create_int32(env, backParam, &result);
89f6603c60Sopenharmony_ci        return result;
90f6603c60Sopenharmony_ci    }
91f6603c60Sopenharmony_ci    getSource = OH_AVSource_CreateWithFD(fd, PARAM_0, fileSize);
92f6603c60Sopenharmony_ci    if (getSource != nullptr) {
93f6603c60Sopenharmony_ci        checkParam = OH_AVSource_Destroy(getSource);
94f6603c60Sopenharmony_ci        if(checkParam == AV_ERR_OK){
95f6603c60Sopenharmony_ci            backParam = SUCCESS;
96f6603c60Sopenharmony_ci        }
97f6603c60Sopenharmony_ci    }
98f6603c60Sopenharmony_ci    close(fd);
99f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
100f6603c60Sopenharmony_ci    return result;
101f6603c60Sopenharmony_ci}
102f6603c60Sopenharmony_ci
103f6603c60Sopenharmony_cistatic napi_value AVSourceGetSourceFormat(napi_env env, napi_callback_info info)
104f6603c60Sopenharmony_ci{
105f6603c60Sopenharmony_ci    int backParam = FAIL;
106f6603c60Sopenharmony_ci    OH_AVSource *getSource = nullptr;
107f6603c60Sopenharmony_ci    OH_AVFormat *checkParam = nullptr;
108f6603c60Sopenharmony_ci    char fileName[] = {"/data/storage/el2/base/files/demo.mp4"};
109f6603c60Sopenharmony_ci    int fd = open(fileName, O_RDONLY, PARAM_0666);
110f6603c60Sopenharmony_ci    struct stat fileStatus {};
111f6603c60Sopenharmony_ci    size_t fileSize = PARAM_0;
112f6603c60Sopenharmony_ci    if (stat(fileName, &fileStatus) == ZEROVAL) {
113f6603c60Sopenharmony_ci        fileSize = static_cast<size_t>(fileStatus.st_size);
114f6603c60Sopenharmony_ci    } else {
115f6603c60Sopenharmony_ci        napi_value result = nullptr;
116f6603c60Sopenharmony_ci        napi_create_int32(env, backParam, &result);
117f6603c60Sopenharmony_ci        return result;
118f6603c60Sopenharmony_ci    }
119f6603c60Sopenharmony_ci    getSource = OH_AVSource_CreateWithFD(fd, PARAM_0, fileSize);
120f6603c60Sopenharmony_ci    if (getSource != nullptr) {
121f6603c60Sopenharmony_ci        checkParam = OH_AVSource_GetSourceFormat(getSource);
122f6603c60Sopenharmony_ci    }
123f6603c60Sopenharmony_ci    if (checkParam != nullptr) {
124f6603c60Sopenharmony_ci        backParam = SUCCESS;
125f6603c60Sopenharmony_ci    }
126f6603c60Sopenharmony_ci    OH_AVSource_Destroy(getSource);
127f6603c60Sopenharmony_ci    close(fd);
128f6603c60Sopenharmony_ci    napi_value result = nullptr;
129f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
130f6603c60Sopenharmony_ci    return result;
131f6603c60Sopenharmony_ci}
132f6603c60Sopenharmony_ci
133f6603c60Sopenharmony_cistatic napi_value AVSourceGetTrackFormat(napi_env env, napi_callback_info info)
134f6603c60Sopenharmony_ci{
135f6603c60Sopenharmony_ci    int backParam = FAIL;
136f6603c60Sopenharmony_ci    OH_AVSource *getSource = nullptr;
137f6603c60Sopenharmony_ci    OH_AVFormat *checkParam = nullptr;
138f6603c60Sopenharmony_ci    napi_value result = nullptr;
139f6603c60Sopenharmony_ci    char fileName[] = {"/data/storage/el2/base/files/demo.mp4"};
140f6603c60Sopenharmony_ci    int fd = open(fileName, O_RDONLY, PARAM_0666);
141f6603c60Sopenharmony_ci    struct stat fileStatus {};
142f6603c60Sopenharmony_ci    size_t fileSize = PARAM_0;
143f6603c60Sopenharmony_ci    if (stat(fileName, &fileStatus) == ZEROVAL) {
144f6603c60Sopenharmony_ci        fileSize = static_cast<size_t>(fileStatus.st_size);
145f6603c60Sopenharmony_ci    } else {
146f6603c60Sopenharmony_ci        backParam = 1;
147f6603c60Sopenharmony_ci    }
148f6603c60Sopenharmony_ci    getSource = OH_AVSource_CreateWithFD(fd, PARAM_0, fileSize);
149f6603c60Sopenharmony_ci    if (getSource != nullptr) {
150f6603c60Sopenharmony_ci        checkParam = OH_AVSource_GetTrackFormat(getSource, PARAM_0);
151f6603c60Sopenharmony_ci        if (checkParam != nullptr) {
152f6603c60Sopenharmony_ci            backParam = SUCCESS;
153f6603c60Sopenharmony_ci        }
154f6603c60Sopenharmony_ci    }
155f6603c60Sopenharmony_ci    OH_AVSource_Destroy(getSource);
156f6603c60Sopenharmony_ci    close(fd);
157f6603c60Sopenharmony_ci    napi_create_int32(env, backParam, &result);
158f6603c60Sopenharmony_ci    return result;
159f6603c60Sopenharmony_ci}
160f6603c60Sopenharmony_ci
161f6603c60Sopenharmony_ciEXTERN_C_START
162f6603c60Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports) {
163f6603c60Sopenharmony_ci    napi_property_descriptor desc[] = {
164f6603c60Sopenharmony_ci        {"OH_AVSource_CreateWithURI", nullptr, AVSourceCreateWithURI, nullptr, nullptr, nullptr, napi_default, nullptr},
165f6603c60Sopenharmony_ci        {"OH_AVSource_CreateWithFD", nullptr, AVSourceCreateWithFD, nullptr, nullptr, nullptr, napi_default, nullptr},
166f6603c60Sopenharmony_ci        {"OH_AVSource_Destroy", nullptr, AVSourceDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
167f6603c60Sopenharmony_ci        {"OH_AVSource_GetSourceFormat", nullptr, AVSourceGetSourceFormat, nullptr, nullptr, nullptr, napi_default,
168f6603c60Sopenharmony_ci         nullptr},
169f6603c60Sopenharmony_ci        {"OH_AVSource_GetTrackFormat", nullptr, AVSourceGetTrackFormat, nullptr, nullptr, nullptr, napi_default,
170f6603c60Sopenharmony_ci         nullptr},
171f6603c60Sopenharmony_ci    };
172f6603c60Sopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
173f6603c60Sopenharmony_ci    return exports;
174f6603c60Sopenharmony_ci}
175f6603c60Sopenharmony_ciEXTERN_C_END
176f6603c60Sopenharmony_ci
177f6603c60Sopenharmony_cistatic napi_module demoModule = {
178f6603c60Sopenharmony_ci    .nm_version = 1,
179f6603c60Sopenharmony_ci    .nm_flags = 0,
180f6603c60Sopenharmony_ci    .nm_filename = nullptr,
181f6603c60Sopenharmony_ci    .nm_register_func = Init,
182f6603c60Sopenharmony_ci    .nm_modname = "libmediaavsourcendk",
183f6603c60Sopenharmony_ci    .nm_priv = ((void *)0),
184f6603c60Sopenharmony_ci    .reserved = {0},
185f6603c60Sopenharmony_ci};
186f6603c60Sopenharmony_ci
187f6603c60Sopenharmony_ciextern "C" __attribute__((constructor)) void RegisterModule(void) {
188f6603c60Sopenharmony_ci    napi_module_register(&demoModule);
189f6603c60Sopenharmony_ci}
190