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 "node_api.h"
18f6603c60Sopenharmony_ci#include <fcntl.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_avmuxer.h>
22f6603c60Sopenharmony_ci#include <unistd.h>
23f6603c60Sopenharmony_ci
24f6603c60Sopenharmony_ci#define MUNUSONE (-1)
25f6603c60Sopenharmony_ci#define ZEROVAL 0
26f6603c60Sopenharmony_ci#define ONEONEVAL 11
27f6603c60Sopenharmony_ci#define SUCCESS 0
28f6603c60Sopenharmony_ci#define FAIL (-1)
29f6603c60Sopenharmony_ci#define ONETWOVAL 12
30f6603c60Sopenharmony_ci#define ONEFIVEVAL 15
31f6603c60Sopenharmony_ci#define TWOTWOVAL 22
32f6603c60Sopenharmony_ci#define BIGVAL 44100
33f6603c60Sopenharmony_ci#define TWOVAL 2
34f6603c60Sopenharmony_ci#define PARAM_0666 0666
35f6603c60Sopenharmony_ci
36f6603c60Sopenharmony_cistatic napi_value OHAVMuxerCreate(napi_env env, napi_callback_info info)
37f6603c60Sopenharmony_ci{
38f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
39f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
40f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
41f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
42f6603c60Sopenharmony_ci    int returnValue = FAIL;
43f6603c60Sopenharmony_ci    if (muxer != nullptr) {
44f6603c60Sopenharmony_ci        returnValue = SUCCESS;
45f6603c60Sopenharmony_ci    }
46f6603c60Sopenharmony_ci    close(fileDescribe);
47f6603c60Sopenharmony_ci    napi_value result = nullptr;
48f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
49f6603c60Sopenharmony_ci    muxer = nullptr;
50f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
51f6603c60Sopenharmony_ci    return result;
52f6603c60Sopenharmony_ci}
53f6603c60Sopenharmony_ci
54f6603c60Sopenharmony_cistatic napi_value OHAVMuxerSetRotation(napi_env env, napi_callback_info info)
55f6603c60Sopenharmony_ci{
56f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
57f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
58f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
59f6603c60Sopenharmony_ci    int trackId = audioTrackId;
60f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
61f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
62f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
63f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
64f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
65f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
66f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
67f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
68f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
69f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
70f6603c60Sopenharmony_ci    OH_AVErrCode backInfo = OH_AVMuxer_SetRotation(muxer, rotation);
71f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat);
72f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
73f6603c60Sopenharmony_ci    OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
74f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
75f6603c60Sopenharmony_ci    int returnValue = FAIL;
76f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_OK) {
77f6603c60Sopenharmony_ci        returnValue = SUCCESS;
78f6603c60Sopenharmony_ci    }
79f6603c60Sopenharmony_ci    close(fileDescribe);
80f6603c60Sopenharmony_ci    napi_value result = nullptr;
81f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
82f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
83f6603c60Sopenharmony_ci    muxer = nullptr;
84f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
85f6603c60Sopenharmony_ci    return result;
86f6603c60Sopenharmony_ci}
87f6603c60Sopenharmony_ci
88f6603c60Sopenharmony_cistatic napi_value OHAVMuxerStart(napi_env env, napi_callback_info info)
89f6603c60Sopenharmony_ci{
90f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
91f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
92f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
93f6603c60Sopenharmony_ci    int trackId = audioTrackId;
94f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
95f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
96f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
97f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
98f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
99f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
100f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
101f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
102f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
103f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
104f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
105f6603c60Sopenharmony_ci    OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC);
106f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL);
107f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL);
108f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat);
109f6603c60Sopenharmony_ci    OH_AVErrCode backInfo = OH_AVMuxer_Start(muxer);
110f6603c60Sopenharmony_ci    OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
111f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
112f6603c60Sopenharmony_ci    int returnValue = FAIL;
113f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_OK) {
114f6603c60Sopenharmony_ci        returnValue = SUCCESS;
115f6603c60Sopenharmony_ci    }
116f6603c60Sopenharmony_ci    close(fileDescribe);
117f6603c60Sopenharmony_ci    napi_value result = nullptr;
118f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
119f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
120f6603c60Sopenharmony_ci    muxer = nullptr;
121f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
122f6603c60Sopenharmony_ci    return result;
123f6603c60Sopenharmony_ci}
124f6603c60Sopenharmony_ci
125f6603c60Sopenharmony_cistatic napi_value OHAVMuxerStop(napi_env env, napi_callback_info info)
126f6603c60Sopenharmony_ci{
127f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
128f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
129f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
130f6603c60Sopenharmony_ci    int trackId = audioTrackId;
131f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
132f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
133f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
134f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
135f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
136f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
137f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
138f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
139f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
140f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
141f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
142f6603c60Sopenharmony_ci    OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC);
143f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL);
144f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL);
145f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat);
146f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
147f6603c60Sopenharmony_ci    OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
148f6603c60Sopenharmony_ci    OH_AVErrCode backInfo = OH_AVMuxer_Stop(muxer);
149f6603c60Sopenharmony_ci    int returnValue = FAIL;
150f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_OK) {
151f6603c60Sopenharmony_ci        returnValue = SUCCESS;
152f6603c60Sopenharmony_ci    }
153f6603c60Sopenharmony_ci    close(fileDescribe);
154f6603c60Sopenharmony_ci    napi_value result = nullptr;
155f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
156f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
157f6603c60Sopenharmony_ci    muxer = nullptr;
158f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
159f6603c60Sopenharmony_ci    return result;
160f6603c60Sopenharmony_ci}
161f6603c60Sopenharmony_ci
162f6603c60Sopenharmony_cistatic napi_value OHAVMuxerWriteSample(napi_env env, napi_callback_info info)
163f6603c60Sopenharmony_ci{
164f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
165f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
166f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
167f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
168f6603c60Sopenharmony_ci    attrInfo.pts = ONEONEVAL;
169f6603c60Sopenharmony_ci    attrInfo.size = ONEONEVAL;
170f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
171f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
172f6603c60Sopenharmony_ci    int trackId = audioTrackId;
173f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(TWOTWOVAL);
174f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_DEFAULT;
175f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, PARAM_0666);
176f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
177f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
178f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
179f6603c60Sopenharmony_ci    OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC);
180f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL);
181f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL);
182f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &trackId, trackFormat);
183f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
184f6603c60Sopenharmony_ci    int backInfo = OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
185f6603c60Sopenharmony_ci    int returnValue = FAIL;
186f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
187f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_OK) {
188f6603c60Sopenharmony_ci        returnValue = SUCCESS;
189f6603c60Sopenharmony_ci    }
190f6603c60Sopenharmony_ci    close(fileDescribe);
191f6603c60Sopenharmony_ci    napi_value result = nullptr;
192f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
193f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
194f6603c60Sopenharmony_ci    muxer = nullptr;
195f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
196f6603c60Sopenharmony_ci    return result;
197f6603c60Sopenharmony_ci}
198f6603c60Sopenharmony_ci
199f6603c60Sopenharmony_cistatic napi_value OHAVMuxerWriteSampleBuffer(napi_env env, napi_callback_info info) {
200f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
201f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
202f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
203f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
204f6603c60Sopenharmony_ci    attrInfo.pts = ONEONEVAL;
205f6603c60Sopenharmony_ci    attrInfo.size = ONEONEVAL;
206f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
207f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
208f6603c60Sopenharmony_ci    int trackId = audioTrackId;
209f6603c60Sopenharmony_ci    OH_AVBuffer *sample = OH_AVBuffer_Create(TWOTWOVAL);
210f6603c60Sopenharmony_ci    OH_AVBuffer_SetBufferAttr(sample, &attrInfo);
211f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_DEFAULT;
212f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, PARAM_0666);
213f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
214f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
215f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
216f6603c60Sopenharmony_ci    OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC);
217f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL);
218f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL);
219f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &trackId, trackFormat);
220f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
221f6603c60Sopenharmony_ci    int backInfo = OH_AVMuxer_WriteSampleBuffer(muxer, trackId, sample);
222f6603c60Sopenharmony_ci    int returnValue = FAIL;
223f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
224f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_OK) {
225f6603c60Sopenharmony_ci        returnValue = SUCCESS;
226f6603c60Sopenharmony_ci    }
227f6603c60Sopenharmony_ci    close(fileDescribe);
228f6603c60Sopenharmony_ci    napi_value result = nullptr;
229f6603c60Sopenharmony_ci    OH_AVBuffer_Destroy(sample);
230f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
231f6603c60Sopenharmony_ci    OH_AVFormat_Destroy(trackFormat);
232f6603c60Sopenharmony_ci    muxer = nullptr;
233f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
234f6603c60Sopenharmony_ci    return result;
235f6603c60Sopenharmony_ci}
236f6603c60Sopenharmony_ci
237f6603c60Sopenharmony_cistatic napi_value OHAVMuxerAddTrack(napi_env env, napi_callback_info info)
238f6603c60Sopenharmony_ci{
239f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
240f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
241f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
242f6603c60Sopenharmony_ci    int trackId = audioTrackId;
243f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
244f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
245f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
246f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
247f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
248f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
249f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
250f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
251f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
252f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
253f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
254f6603c60Sopenharmony_ci    OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC);
255f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, BIGVAL);
256f6603c60Sopenharmony_ci    OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, TWOVAL);
257f6603c60Sopenharmony_ci    int ret = OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat);
258f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
259f6603c60Sopenharmony_ci    OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
260f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
261f6603c60Sopenharmony_ci    int returnValue = FAIL;
262f6603c60Sopenharmony_ci    if (ret == AV_ERR_OK) {
263f6603c60Sopenharmony_ci        returnValue = SUCCESS;
264f6603c60Sopenharmony_ci    }
265f6603c60Sopenharmony_ci    close(fileDescribe);
266f6603c60Sopenharmony_ci    napi_value result = nullptr;
267f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
268f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
269f6603c60Sopenharmony_ci    muxer = nullptr;
270f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
271f6603c60Sopenharmony_ci    return result;
272f6603c60Sopenharmony_ci}
273f6603c60Sopenharmony_ci
274f6603c60Sopenharmony_cistatic napi_value OHAVMuxerDestroy(napi_env env, napi_callback_info info)
275f6603c60Sopenharmony_ci{
276f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
277f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
278f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
279f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
280f6603c60Sopenharmony_ci    int returnValue = FAIL;
281f6603c60Sopenharmony_ci    napi_value result = nullptr;
282f6603c60Sopenharmony_ci    OH_AVErrCode desval = OH_AVMuxer_Destroy(muxer);
283f6603c60Sopenharmony_ci    if (desval == AV_ERR_OK) {
284f6603c60Sopenharmony_ci        returnValue = SUCCESS;
285f6603c60Sopenharmony_ci    }
286f6603c60Sopenharmony_ci    close(fileDescribe);
287f6603c60Sopenharmony_ci    muxer = nullptr;
288f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
289f6603c60Sopenharmony_ci    return result;
290f6603c60Sopenharmony_ci}
291f6603c60Sopenharmony_ci
292f6603c60Sopenharmony_cistatic napi_value OHAVMuxerCreateAbnormal(napi_env env, napi_callback_info info)
293f6603c60Sopenharmony_ci{
294f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
295f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
296f6603c60Sopenharmony_ci    int fileDescribe = MUNUSONE;
297f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
298f6603c60Sopenharmony_ci    int returnValue = FAIL;
299f6603c60Sopenharmony_ci    if (muxer == nullptr) {
300f6603c60Sopenharmony_ci        returnValue = SUCCESS;
301f6603c60Sopenharmony_ci    }
302f6603c60Sopenharmony_ci    napi_value result = nullptr;
303f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
304f6603c60Sopenharmony_ci    return result;
305f6603c60Sopenharmony_ci}
306f6603c60Sopenharmony_ci
307f6603c60Sopenharmony_cistatic napi_value OHAVMuxerSetRotationAbnormal(napi_env env, napi_callback_info info)
308f6603c60Sopenharmony_ci{
309f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
310f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
311f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
312f6603c60Sopenharmony_ci    int trackId = audioTrackId;
313f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
314f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
315f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
316f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
317f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
318f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
319f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
320f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
321f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
322f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
323f6603c60Sopenharmony_ci    OH_AVErrCode backInfo = OH_AVMuxer_SetRotation(nullptr, rotation);
324f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat);
325f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
326f6603c60Sopenharmony_ci    OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
327f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
328f6603c60Sopenharmony_ci    int returnValue = FAIL;
329f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_INVALID_VAL) {
330f6603c60Sopenharmony_ci        returnValue = SUCCESS;
331f6603c60Sopenharmony_ci    }
332f6603c60Sopenharmony_ci    close(fileDescribe);
333f6603c60Sopenharmony_ci    napi_value result = nullptr;
334f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
335f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
336f6603c60Sopenharmony_ci    muxer = nullptr;
337f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
338f6603c60Sopenharmony_ci    return result;
339f6603c60Sopenharmony_ci}
340f6603c60Sopenharmony_ci
341f6603c60Sopenharmony_cistatic napi_value OHAVMuxerStartAbnormal(napi_env env, napi_callback_info info)
342f6603c60Sopenharmony_ci{
343f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
344f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
345f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
346f6603c60Sopenharmony_ci    int trackId = audioTrackId;
347f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
348f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
349f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
350f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
351f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
352f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
353f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
354f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
355f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
356f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
357f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
358f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat);
359f6603c60Sopenharmony_ci    OH_AVErrCode backInfo = OH_AVMuxer_Start(nullptr);
360f6603c60Sopenharmony_ci    OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
361f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
362f6603c60Sopenharmony_ci    int returnValue = FAIL;
363f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_INVALID_VAL) {
364f6603c60Sopenharmony_ci        returnValue = SUCCESS;
365f6603c60Sopenharmony_ci    }
366f6603c60Sopenharmony_ci    close(fileDescribe);
367f6603c60Sopenharmony_ci    napi_value result = nullptr;
368f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
369f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
370f6603c60Sopenharmony_ci    muxer = nullptr;
371f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
372f6603c60Sopenharmony_ci    return result;
373f6603c60Sopenharmony_ci}
374f6603c60Sopenharmony_ci
375f6603c60Sopenharmony_cistatic napi_value OHAVMuxerStopAbnormal(napi_env env, napi_callback_info info)
376f6603c60Sopenharmony_ci{
377f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
378f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
379f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
380f6603c60Sopenharmony_ci    int trackId = audioTrackId;
381f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
382f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
383f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
384f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
385f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
386f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
387f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
388f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
389f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
390f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
391f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
392f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat);
393f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
394f6603c60Sopenharmony_ci    OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
395f6603c60Sopenharmony_ci    OH_AVErrCode backInfo = OH_AVMuxer_Stop(nullptr);
396f6603c60Sopenharmony_ci    int returnValue = FAIL;
397f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_INVALID_VAL) {
398f6603c60Sopenharmony_ci        returnValue = SUCCESS;
399f6603c60Sopenharmony_ci    }
400f6603c60Sopenharmony_ci    close(fileDescribe);
401f6603c60Sopenharmony_ci    napi_value result = nullptr;
402f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
403f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
404f6603c60Sopenharmony_ci    muxer = nullptr;
405f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
406f6603c60Sopenharmony_ci    return result;
407f6603c60Sopenharmony_ci}
408f6603c60Sopenharmony_ci
409f6603c60Sopenharmony_cistatic napi_value OHAVMuxerWriteSampleAbnormal(napi_env env, napi_callback_info info)
410f6603c60Sopenharmony_ci{
411f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
412f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
413f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
414f6603c60Sopenharmony_ci    int trackId = audioTrackId;
415f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
416f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
417f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
418f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
419f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
420f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
421f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
422f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
423f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
424f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
425f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
426f6603c60Sopenharmony_ci    OH_AVMuxer_AddTrack(muxer, &audioTrackId, trackFormat);
427f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
428f6603c60Sopenharmony_ci    OH_AVErrCode backInfo = OH_AVMuxer_WriteSample(nullptr, trackId, sample, attrInfo);
429f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
430f6603c60Sopenharmony_ci    int returnValue = FAIL;
431f6603c60Sopenharmony_ci    if (backInfo == AV_ERR_INVALID_VAL) {
432f6603c60Sopenharmony_ci        returnValue = SUCCESS;
433f6603c60Sopenharmony_ci    }
434f6603c60Sopenharmony_ci    close(fileDescribe);
435f6603c60Sopenharmony_ci    napi_value result = nullptr;
436f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
437f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
438f6603c60Sopenharmony_ci    muxer = nullptr;
439f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
440f6603c60Sopenharmony_ci    return result;
441f6603c60Sopenharmony_ci}
442f6603c60Sopenharmony_ci
443f6603c60Sopenharmony_cistatic napi_value OHAVMuxerAddTrackAbnormal(napi_env env, napi_callback_info info)
444f6603c60Sopenharmony_ci{
445f6603c60Sopenharmony_ci    OH_AVMuxer *muxer = nullptr;
446f6603c60Sopenharmony_ci    int audioTrackId = MUNUSONE;
447f6603c60Sopenharmony_ci    int32_t rotation = ZEROVAL;
448f6603c60Sopenharmony_ci    int trackId = audioTrackId;
449f6603c60Sopenharmony_ci    OH_AVCodecBufferAttr attrInfo;
450f6603c60Sopenharmony_ci    attrInfo.pts = ONETWOVAL;
451f6603c60Sopenharmony_ci    attrInfo.size = ONEFIVEVAL;
452f6603c60Sopenharmony_ci    attrInfo.offset = ZEROVAL;
453f6603c60Sopenharmony_ci    attrInfo.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME;
454f6603c60Sopenharmony_ci    OH_AVMemory *sample = OH_AVMemory_Create(ONEONEVAL);
455f6603c60Sopenharmony_ci    OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
456f6603c60Sopenharmony_ci    int fileDescribe = open("/data/storage/el2/base/files/demo.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
457f6603c60Sopenharmony_ci    muxer = OH_AVMuxer_Create(fileDescribe, format);
458f6603c60Sopenharmony_ci    OH_AVFormat *trackFormat = OH_AVFormat_Create();
459f6603c60Sopenharmony_ci    OH_AVMuxer_SetRotation(muxer, rotation);
460f6603c60Sopenharmony_ci    int ret = OH_AVMuxer_AddTrack(nullptr, &audioTrackId, trackFormat);
461f6603c60Sopenharmony_ci    OH_AVMuxer_Start(muxer);
462f6603c60Sopenharmony_ci    OH_AVMuxer_WriteSample(muxer, trackId, sample, attrInfo);
463f6603c60Sopenharmony_ci    OH_AVMuxer_Stop(muxer);
464f6603c60Sopenharmony_ci    int returnValue = FAIL;
465f6603c60Sopenharmony_ci    if (ret == AV_ERR_INVALID_VAL) {
466f6603c60Sopenharmony_ci        returnValue = SUCCESS;
467f6603c60Sopenharmony_ci    }
468f6603c60Sopenharmony_ci    close(fileDescribe);
469f6603c60Sopenharmony_ci    napi_value result = nullptr;
470f6603c60Sopenharmony_ci    OH_AVMemory_Destroy(sample);
471f6603c60Sopenharmony_ci    OH_AVMuxer_Destroy(muxer);
472f6603c60Sopenharmony_ci    muxer = nullptr;
473f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
474f6603c60Sopenharmony_ci    return result;
475f6603c60Sopenharmony_ci}
476f6603c60Sopenharmony_ci
477f6603c60Sopenharmony_cistatic napi_value OHAVMuxerDestroyAbnormal(napi_env env, napi_callback_info info)
478f6603c60Sopenharmony_ci{
479f6603c60Sopenharmony_ci    int returnValue = FAIL;
480f6603c60Sopenharmony_ci    napi_value result = nullptr;
481f6603c60Sopenharmony_ci    OH_AVErrCode desval = OH_AVMuxer_Destroy(nullptr);
482f6603c60Sopenharmony_ci    if (desval == AV_ERR_INVALID_VAL) {
483f6603c60Sopenharmony_ci        returnValue = SUCCESS;
484f6603c60Sopenharmony_ci    }
485f6603c60Sopenharmony_ci    napi_create_int32(env, returnValue, &result);
486f6603c60Sopenharmony_ci    return result;
487f6603c60Sopenharmony_ci}
488f6603c60Sopenharmony_ciEXTERN_C_START
489f6603c60Sopenharmony_cistatic napi_value Init(napi_env env, napi_value exports)
490f6603c60Sopenharmony_ci{
491f6603c60Sopenharmony_ci    napi_property_descriptor desc[] = {
492f6603c60Sopenharmony_ci        {"oHAVMuxerCreate", nullptr, OHAVMuxerCreate, nullptr, nullptr, nullptr, napi_default, nullptr},
493f6603c60Sopenharmony_ci        {"oHAVMuxerSetRotation", nullptr, OHAVMuxerSetRotation, nullptr, nullptr, nullptr, napi_default, nullptr},
494f6603c60Sopenharmony_ci        {"oHAVMuxerStart", nullptr, OHAVMuxerStart, nullptr, nullptr, nullptr, napi_default, nullptr},
495f6603c60Sopenharmony_ci        {"oHAVMuxerStop", nullptr, OHAVMuxerStop, nullptr, nullptr, nullptr, napi_default, nullptr},
496f6603c60Sopenharmony_ci        {"oHAVMuxerWriteSample", nullptr, OHAVMuxerWriteSample, nullptr, nullptr, nullptr, napi_default, nullptr},
497f6603c60Sopenharmony_ci        {"OHAVMuxerWriteSampleBuffer", nullptr, OHAVMuxerWriteSampleBuffer, nullptr, nullptr, nullptr, napi_default, nullptr},
498f6603c60Sopenharmony_ci        {"oHAVMuxerAddTrack", nullptr, OHAVMuxerAddTrack, nullptr, nullptr, nullptr, napi_default, nullptr},
499f6603c60Sopenharmony_ci        {"oHAVMuxerDestroy", nullptr, OHAVMuxerDestroy, nullptr, nullptr, nullptr, napi_default, nullptr},
500f6603c60Sopenharmony_ci
501f6603c60Sopenharmony_ci        {"oHAVMuxerCreateAbnormal", nullptr, OHAVMuxerCreateAbnormal, nullptr, nullptr, nullptr, napi_default, nullptr},
502f6603c60Sopenharmony_ci        {"oHAVMuxerSetRotationAbnormal", nullptr, OHAVMuxerSetRotationAbnormal, nullptr, nullptr, nullptr, napi_default,
503f6603c60Sopenharmony_ci         nullptr},
504f6603c60Sopenharmony_ci        {"oHAVMuxerStartAbnormal", nullptr, OHAVMuxerStartAbnormal, nullptr, nullptr, nullptr, napi_default, nullptr},
505f6603c60Sopenharmony_ci        {"oHAVMuxerStopAbnormal", nullptr, OHAVMuxerStopAbnormal, nullptr, nullptr, nullptr, napi_default, nullptr},
506f6603c60Sopenharmony_ci        {"oHAVMuxerWriteSampleAbnormal", nullptr, OHAVMuxerWriteSampleAbnormal, nullptr, nullptr, nullptr, napi_default,
507f6603c60Sopenharmony_ci         nullptr},
508f6603c60Sopenharmony_ci        {"oHAVMuxerAddTrackAbnormal", nullptr, OHAVMuxerAddTrackAbnormal, nullptr, nullptr, nullptr, napi_default,
509f6603c60Sopenharmony_ci         nullptr},
510f6603c60Sopenharmony_ci        {"oHAVMuxerDestroyAbnormal", nullptr, OHAVMuxerDestroyAbnormal, nullptr, nullptr, nullptr, napi_default,
511f6603c60Sopenharmony_ci         nullptr},
512f6603c60Sopenharmony_ci
513f6603c60Sopenharmony_ci    };
514f6603c60Sopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
515f6603c60Sopenharmony_ci    return exports;
516f6603c60Sopenharmony_ci}
517f6603c60Sopenharmony_ci
518f6603c60Sopenharmony_ciEXTERN_C_END
519f6603c60Sopenharmony_ci
520f6603c60Sopenharmony_cistatic napi_module demoModule = {
521f6603c60Sopenharmony_ci    .nm_version = 1,
522f6603c60Sopenharmony_ci    .nm_flags = 0,
523f6603c60Sopenharmony_ci    .nm_filename = nullptr,
524f6603c60Sopenharmony_ci    .nm_register_func = Init,
525f6603c60Sopenharmony_ci    .nm_modname = "nativeavmuxer",
526f6603c60Sopenharmony_ci    .nm_priv = ((void *)0),
527f6603c60Sopenharmony_ci    .reserved = {0},
528f6603c60Sopenharmony_ci};
529f6603c60Sopenharmony_ci
530f6603c60Sopenharmony_ciextern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
531