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