1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd.
3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License.
5da853ecaSopenharmony_ci * You may obtain a copy of the License at
6da853ecaSopenharmony_ci *
7da853ecaSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8da853ecaSopenharmony_ci *
9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and
13da853ecaSopenharmony_ci * limitations under the License.
14da853ecaSopenharmony_ci */
15da853ecaSopenharmony_ci
16da853ecaSopenharmony_ci#include "native_avmuxer_demo.h"
17da853ecaSopenharmony_ci#include <sys/types.h>
18da853ecaSopenharmony_ci#include <fcntl.h>
19da853ecaSopenharmony_ci#include <sys/stat.h>
20da853ecaSopenharmony_ci#include <unistd.h>
21da853ecaSopenharmony_ci#include <pthread.h>
22da853ecaSopenharmony_ci
23da853ecaSopenharmony_ci#include "securec.h"
24da853ecaSopenharmony_ci#include "native_avcodec_base.h"
25da853ecaSopenharmony_ci#include "native_averrors.h"
26da853ecaSopenharmony_ci#include "native_avformat.h"
27da853ecaSopenharmony_ci#include "native_avmuxer.h"
28da853ecaSopenharmony_ci#include "native_avmemory.h"
29da853ecaSopenharmony_ci#include "native_avbuffer.h"
30da853ecaSopenharmony_ci#include "avmuxer_demo_common.h"
31da853ecaSopenharmony_ci#include "native_audio_channel_layout.h"
32da853ecaSopenharmony_ci
33da853ecaSopenharmony_ci
34da853ecaSopenharmony_ci#define NORMAL 0
35da853ecaSopenharmony_ci#define THREAD 1
36da853ecaSopenharmony_ci#define MODE_ZERO 0
37da853ecaSopenharmony_ci#define MODE_ONE 1
38da853ecaSopenharmony_ci#define MODE_TWO 2
39da853ecaSopenharmony_ci#define MODE_THREE 3
40da853ecaSopenharmony_ci#define MODE_FOUR 4
41da853ecaSopenharmony_ci#define MODE_FIVE 5
42da853ecaSopenharmony_ci#define MODE_SIX 6
43da853ecaSopenharmony_ci#define TYPE_BUFFER_SIZE 20
44da853ecaSopenharmony_ci#define CONFIG_BUFFER_SIZE 0x1FFF
45da853ecaSopenharmony_ci
46da853ecaSopenharmony_citypedef struct AudioTrackParam AudioTrackParam;
47da853ecaSopenharmony_citypedef struct VideoTrackParam VideoTrackParam;
48da853ecaSopenharmony_citypedef struct FdListStr FdListStr;
49da853ecaSopenharmony_ci
50da853ecaSopenharmony_cistruct WriteTrackSampleParam {
51da853ecaSopenharmony_ci    OH_AVMuxer *muxer;
52da853ecaSopenharmony_ci    int trackId;
53da853ecaSopenharmony_ci    int fd;
54da853ecaSopenharmony_ci};
55da853ecaSopenharmony_ci
56da853ecaSopenharmony_cistruct MuxerParam {
57da853ecaSopenharmony_ci    int outputFormat;
58da853ecaSopenharmony_ci    char outputFormatType[TYPE_BUFFER_SIZE];
59da853ecaSopenharmony_ci    int runMode;
60da853ecaSopenharmony_ci    char runModeType[TYPE_BUFFER_SIZE];
61da853ecaSopenharmony_ci    const AudioTrackParam *audioParams;
62da853ecaSopenharmony_ci    char audioType[TYPE_BUFFER_SIZE];
63da853ecaSopenharmony_ci    const VideoTrackParam *videoParams;
64da853ecaSopenharmony_ci    char videoType[TYPE_BUFFER_SIZE];
65da853ecaSopenharmony_ci    const VideoTrackParam *coverParams;
66da853ecaSopenharmony_ci    char coverType[TYPE_BUFFER_SIZE];
67da853ecaSopenharmony_ci};
68da853ecaSopenharmony_ci
69da853ecaSopenharmony_cistatic struct MuxerParam g_muxerParam  = {
70da853ecaSopenharmony_ci    .outputFormat = AV_OUTPUT_FORMAT_DEFAULT,
71da853ecaSopenharmony_ci    .outputFormatType = "",
72da853ecaSopenharmony_ci    .runMode = NORMAL,
73da853ecaSopenharmony_ci    .runModeType = "",
74da853ecaSopenharmony_ci    .audioParams = NULL,
75da853ecaSopenharmony_ci    .audioType = "",
76da853ecaSopenharmony_ci    .videoParams = NULL,
77da853ecaSopenharmony_ci    .videoType = "",
78da853ecaSopenharmony_ci    .coverParams = NULL,
79da853ecaSopenharmony_ci    .coverType = "",
80da853ecaSopenharmony_ci};
81da853ecaSopenharmony_ci
82da853ecaSopenharmony_ciint AddTrackAudio(OH_AVMuxer *muxer, const AudioTrackParam *param, int fdInput)
83da853ecaSopenharmony_ci{
84da853ecaSopenharmony_ci    if (fdInput < 0) {
85da853ecaSopenharmony_ci        printf("unselect audio, fd is %d\n", fdInput);
86da853ecaSopenharmony_ci        return -1;
87da853ecaSopenharmony_ci    }
88da853ecaSopenharmony_ci    OH_AVFormat *formatAudio = OH_AVFormat_CreateAudioFormat(param->mimeType,
89da853ecaSopenharmony_ci        param->sampleRate, param->channels);
90da853ecaSopenharmony_ci    if (formatAudio == NULL) {
91da853ecaSopenharmony_ci        printf("audio format failed!\n");
92da853ecaSopenharmony_ci        return AV_ERR_NO_MEMORY;
93da853ecaSopenharmony_ci    }
94da853ecaSopenharmony_ci    OH_AVFormat_SetIntValue(formatAudio, "audio_samples_per_frame", param->frameSize);
95da853ecaSopenharmony_ci    if (param == &g_audioAacPar) {
96da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_PROFILE, AAC_PROFILE_LC);
97da853ecaSopenharmony_ci    } else if (param == &g_audioG711MUPar) {
98da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, SAMPLE_U8);
99da853ecaSopenharmony_ci        OH_AVFormat_SetLongValue(formatAudio, OH_MD_KEY_BITRATE, 705600); // 705600 g711mu bit rate
100da853ecaSopenharmony_ci    } else if (param == &g_audioRawPar) {
101da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, SAMPLE_S16LE);
102da853ecaSopenharmony_ci        OH_AVFormat_SetLongValue(formatAudio, OH_MD_KEY_CHANNEL_LAYOUT, CH_LAYOUT_STEREO);
103da853ecaSopenharmony_ci    }
104da853ecaSopenharmony_ci    int extraSize = 0;
105da853ecaSopenharmony_ci    unsigned char buffer[CONFIG_BUFFER_SIZE] = {0};
106da853ecaSopenharmony_ci    read(fdInput, (void*)&extraSize, sizeof(extraSize));
107da853ecaSopenharmony_ci    if (extraSize <= CONFIG_BUFFER_SIZE && extraSize > 0) {
108da853ecaSopenharmony_ci        read(fdInput, buffer, extraSize);
109da853ecaSopenharmony_ci        OH_AVFormat_SetBuffer(formatAudio, OH_MD_KEY_CODEC_CONFIG, buffer, extraSize);
110da853ecaSopenharmony_ci    }
111da853ecaSopenharmony_ci    printf("AddTrackAudio audio metadata size: %d\n", extraSize);
112da853ecaSopenharmony_ci    int trackIndex = -1;
113da853ecaSopenharmony_ci    int ret = OH_AVMuxer_AddTrack(muxer, &trackIndex, formatAudio);
114da853ecaSopenharmony_ci    OH_AVFormat_Destroy(formatAudio);
115da853ecaSopenharmony_ci    if (ret != AV_ERR_OK) {
116da853ecaSopenharmony_ci        printf("AddTrackAudio failed! mime: %s\n", param->mimeType);
117da853ecaSopenharmony_ci        return -1;
118da853ecaSopenharmony_ci    }
119da853ecaSopenharmony_ci    printf("AddTrackAudio success! trackIndex: %d\n", trackIndex);
120da853ecaSopenharmony_ci    return trackIndex;
121da853ecaSopenharmony_ci}
122da853ecaSopenharmony_ci
123da853ecaSopenharmony_ciint AddTrackVideo(OH_AVMuxer *muxer, const VideoTrackParam *param, int fdInput)
124da853ecaSopenharmony_ci{
125da853ecaSopenharmony_ci    if (fdInput < 0) {
126da853ecaSopenharmony_ci        printf("unselect video, fd is %d\n", fdInput);
127da853ecaSopenharmony_ci        return -1;
128da853ecaSopenharmony_ci    }
129da853ecaSopenharmony_ci    OH_AVFormat *formatVideo = OH_AVFormat_CreateVideoFormat(param->mimeType,
130da853ecaSopenharmony_ci        param->width, param->height);
131da853ecaSopenharmony_ci    if (formatVideo == NULL) {
132da853ecaSopenharmony_ci        printf("video format failed!\n");
133da853ecaSopenharmony_ci        return AV_ERR_NO_MEMORY;
134da853ecaSopenharmony_ci    }
135da853ecaSopenharmony_ci    OH_AVFormat_SetDoubleValue(formatVideo, OH_MD_KEY_FRAME_RATE, param->frameRate);
136da853ecaSopenharmony_ci    OH_AVFormat_SetIntValue(formatVideo, "video_delay", param->videoDelay); // 不对外key
137da853ecaSopenharmony_ci    if (param == &g_videoHdrPar) {
138da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_COLOR_PRIMARIES, param->colorPrimaries);
139da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_TRANSFER_CHARACTERISTICS, param->colorTransfer);
140da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_MATRIX_COEFFICIENTS, param->colorMatrixCoeff);
141da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_RANGE_FLAG, param->colorRange);
142da853ecaSopenharmony_ci        OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_VIDEO_IS_HDR_VIVID, param->isHdrVivid);
143da853ecaSopenharmony_ci    }
144da853ecaSopenharmony_ci    int extraSize = 0;
145da853ecaSopenharmony_ci    unsigned char buffer[CONFIG_BUFFER_SIZE] = {0};
146da853ecaSopenharmony_ci    read(fdInput, (void*)&extraSize, sizeof(extraSize));
147da853ecaSopenharmony_ci    if (extraSize <= CONFIG_BUFFER_SIZE && extraSize > 0) {
148da853ecaSopenharmony_ci        read(fdInput, buffer, extraSize);
149da853ecaSopenharmony_ci        OH_AVFormat_SetBuffer(formatVideo, OH_MD_KEY_CODEC_CONFIG, buffer, extraSize);
150da853ecaSopenharmony_ci    }
151da853ecaSopenharmony_ci    printf("AddTrackVideo video metadata size: %d\n", extraSize);
152da853ecaSopenharmony_ci    int trackIndex = -1;
153da853ecaSopenharmony_ci    int ret = OH_AVMuxer_AddTrack(muxer, &trackIndex, formatVideo);
154da853ecaSopenharmony_ci    OH_AVFormat_Destroy(formatVideo);
155da853ecaSopenharmony_ci    if (ret != AV_ERR_OK) {
156da853ecaSopenharmony_ci        printf("AddTrackVideo failed! mime: %s\n", param->mimeType);
157da853ecaSopenharmony_ci        return -1;
158da853ecaSopenharmony_ci    }
159da853ecaSopenharmony_ci    printf("AddTrackVideo success! trackIndex: %d\n", trackIndex);
160da853ecaSopenharmony_ci    return trackIndex;
161da853ecaSopenharmony_ci}
162da853ecaSopenharmony_ci
163da853ecaSopenharmony_ciint AddTrackCover(OH_AVMuxer *muxer, const VideoTrackParam *param, int fdInput)
164da853ecaSopenharmony_ci{
165da853ecaSopenharmony_ci    if (fdInput < 0) {
166da853ecaSopenharmony_ci        printf("unselect cover, fd is %d\n", fdInput);
167da853ecaSopenharmony_ci        return -1;
168da853ecaSopenharmony_ci    }
169da853ecaSopenharmony_ci
170da853ecaSopenharmony_ci    OH_AVFormat *formatCover = OH_AVFormat_Create();
171da853ecaSopenharmony_ci    if (formatCover == NULL) {
172da853ecaSopenharmony_ci        printf("cover format failed!\n");
173da853ecaSopenharmony_ci        return AV_ERR_NO_MEMORY;
174da853ecaSopenharmony_ci    }
175da853ecaSopenharmony_ci    OH_AVFormat_SetStringValue(formatCover, OH_MD_KEY_CODEC_MIME, param->mimeType);
176da853ecaSopenharmony_ci    OH_AVFormat_SetIntValue(formatCover, OH_MD_KEY_WIDTH, param->width);
177da853ecaSopenharmony_ci    OH_AVFormat_SetIntValue(formatCover, OH_MD_KEY_HEIGHT, param->height);
178da853ecaSopenharmony_ci    int trackIndex = -1;
179da853ecaSopenharmony_ci    int ret = OH_AVMuxer_AddTrack(muxer, &trackIndex, formatCover);
180da853ecaSopenharmony_ci    OH_AVFormat_Destroy(formatCover);
181da853ecaSopenharmony_ci    if (ret != AV_ERR_OK) {
182da853ecaSopenharmony_ci        printf("AddTrackCover failed! mime: %s\n", param->mimeType);
183da853ecaSopenharmony_ci        return -1;
184da853ecaSopenharmony_ci    }
185da853ecaSopenharmony_ci    printf("AddTrackCover success! trackIndex: %d\n", trackIndex);
186da853ecaSopenharmony_ci    return trackIndex;
187da853ecaSopenharmony_ci}
188da853ecaSopenharmony_ci
189da853ecaSopenharmony_cistatic bool UpdateWriteBufferInfo(int fd, OH_AVMemory **buffer, OH_AVCodecBufferAttr *info)
190da853ecaSopenharmony_ci{
191da853ecaSopenharmony_ci    if (fd < 0 || buffer == NULL || info == NULL) {
192da853ecaSopenharmony_ci        return false;
193da853ecaSopenharmony_ci    }
194da853ecaSopenharmony_ci
195da853ecaSopenharmony_ci    int ret = read(fd, (void*)&info->pts, sizeof(info->pts));
196da853ecaSopenharmony_ci    if (ret <= 0) {
197da853ecaSopenharmony_ci        return false;
198da853ecaSopenharmony_ci    }
199da853ecaSopenharmony_ci
200da853ecaSopenharmony_ci    ret = read(fd, (void*)&info->flags, sizeof(info->flags));
201da853ecaSopenharmony_ci    if (ret <= 0) {
202da853ecaSopenharmony_ci        return false;
203da853ecaSopenharmony_ci    }
204da853ecaSopenharmony_ci
205da853ecaSopenharmony_ci    ret = read(fd, (void*)&info->size, sizeof(info->size));
206da853ecaSopenharmony_ci    if (ret <= 0 || info->size < 0) {
207da853ecaSopenharmony_ci        return false;
208da853ecaSopenharmony_ci    }
209da853ecaSopenharmony_ci
210da853ecaSopenharmony_ci    if (*buffer != NULL && OH_AVMemory_GetSize(*buffer) < info->size) {
211da853ecaSopenharmony_ci        OH_AVMemory_Destroy(*buffer);
212da853ecaSopenharmony_ci        *buffer = NULL;
213da853ecaSopenharmony_ci    }
214da853ecaSopenharmony_ci    if (*buffer == NULL) {
215da853ecaSopenharmony_ci        *buffer = OH_AVMemory_Create(info->size);
216da853ecaSopenharmony_ci    }
217da853ecaSopenharmony_ci    if (*buffer == NULL) {
218da853ecaSopenharmony_ci        printf("error create OH_AVMemory! %d\n", info->size);
219da853ecaSopenharmony_ci        return false;
220da853ecaSopenharmony_ci    }
221da853ecaSopenharmony_ci    ret = read(fd, (void*)OH_AVMemory_GetAddr(*buffer), info->size);
222da853ecaSopenharmony_ci    if (ret <= 0) {
223da853ecaSopenharmony_ci        return false;
224da853ecaSopenharmony_ci    }
225da853ecaSopenharmony_ci    return true;
226da853ecaSopenharmony_ci}
227da853ecaSopenharmony_ci
228da853ecaSopenharmony_civoid WriteSingleTrackSample(OH_AVMuxer *muxer, int trackId, int fd)
229da853ecaSopenharmony_ci{
230da853ecaSopenharmony_ci    if (muxer == NULL || fd < 0 || trackId  < 0) {
231da853ecaSopenharmony_ci        printf("WriteSingleTrackSample muxer is null or fd < 0, fd:%d\n", fd);
232da853ecaSopenharmony_ci        return;
233da853ecaSopenharmony_ci    }
234da853ecaSopenharmony_ci    OH_AVMemory *buffer = NULL;
235da853ecaSopenharmony_ci    OH_AVCodecBufferAttr info;
236da853ecaSopenharmony_ci    memset_s(&info, sizeof(info), 0, sizeof(info));
237da853ecaSopenharmony_ci    bool ret = UpdateWriteBufferInfo(fd, &buffer, &info);
238da853ecaSopenharmony_ci    while (ret) {
239da853ecaSopenharmony_ci        if (OH_AVMuxer_WriteSample(muxer, trackId, buffer, info) != AV_ERR_OK) {
240da853ecaSopenharmony_ci            printf("OH_AVMuxer_WriteSample error!\n");
241da853ecaSopenharmony_ci            break;
242da853ecaSopenharmony_ci        }
243da853ecaSopenharmony_ci        ret = UpdateWriteBufferInfo(fd, &buffer, &info);
244da853ecaSopenharmony_ci    }
245da853ecaSopenharmony_ci
246da853ecaSopenharmony_ci    if (buffer != NULL) {
247da853ecaSopenharmony_ci        OH_AVMemory_Destroy(buffer);
248da853ecaSopenharmony_ci    }
249da853ecaSopenharmony_ci}
250da853ecaSopenharmony_ci
251da853ecaSopenharmony_civoid *ThreadWriteTrackSample(void *param)
252da853ecaSopenharmony_ci{
253da853ecaSopenharmony_ci    struct WriteTrackSampleParam *wrTrackParam = (struct WriteTrackSampleParam *)param;
254da853ecaSopenharmony_ci    WriteSingleTrackSample(wrTrackParam->muxer, wrTrackParam->trackId, wrTrackParam->fd);
255da853ecaSopenharmony_ci    return NULL;
256da853ecaSopenharmony_ci}
257da853ecaSopenharmony_ci
258da853ecaSopenharmony_civoid WriteTrackSample(OH_AVMuxer *muxer, int audioTrackIndex, int videoTrackIndex, FdListStr *fdStr)
259da853ecaSopenharmony_ci{
260da853ecaSopenharmony_ci    if (fdStr == NULL || fdStr->inAudioFd < 0 || fdStr->inVideoFd < 0) {
261da853ecaSopenharmony_ci        printf("WriteTrackSample start failed!\n");
262da853ecaSopenharmony_ci        return;
263da853ecaSopenharmony_ci    }
264da853ecaSopenharmony_ci    printf("WriteTrackSample\n");
265da853ecaSopenharmony_ci    OH_AVMemory *audioBuffer = NULL;
266da853ecaSopenharmony_ci    OH_AVMemory *videoBuffer = NULL;
267da853ecaSopenharmony_ci    OH_AVCodecBufferAttr audioInfo;
268da853ecaSopenharmony_ci    OH_AVCodecBufferAttr videoInfo;
269da853ecaSopenharmony_ci    memset_s(&audioInfo, sizeof(audioInfo), 0, sizeof(audioInfo));
270da853ecaSopenharmony_ci    memset_s(&videoInfo, sizeof(videoInfo), 0, sizeof(videoInfo));
271da853ecaSopenharmony_ci    bool audioRet = UpdateWriteBufferInfo(fdStr->inAudioFd, &audioBuffer, &audioInfo);
272da853ecaSopenharmony_ci    bool videoRet = UpdateWriteBufferInfo(fdStr->inVideoFd, &videoBuffer, &videoInfo);
273da853ecaSopenharmony_ci    bool isOver = false;
274da853ecaSopenharmony_ci
275da853ecaSopenharmony_ci    while ((audioRet || videoRet) && !isOver) {
276da853ecaSopenharmony_ci        int ret = AV_ERR_OK;
277da853ecaSopenharmony_ci        if (audioRet && videoRet && audioInfo.pts <= videoInfo.pts) {
278da853ecaSopenharmony_ci            ret = OH_AVMuxer_WriteSample(muxer, audioTrackIndex, audioBuffer, audioInfo);
279da853ecaSopenharmony_ci            audioRet = UpdateWriteBufferInfo(fdStr->inAudioFd, &audioBuffer, &audioInfo);
280da853ecaSopenharmony_ci        } else if (audioRet && videoRet) {
281da853ecaSopenharmony_ci            ret = OH_AVMuxer_WriteSample(muxer, videoTrackIndex, videoBuffer, videoInfo);
282da853ecaSopenharmony_ci            videoRet = UpdateWriteBufferInfo(fdStr->inVideoFd, &videoBuffer, &videoInfo);
283da853ecaSopenharmony_ci        } else if (audioRet) {
284da853ecaSopenharmony_ci            ret = OH_AVMuxer_WriteSample(muxer, audioTrackIndex, audioBuffer, audioInfo);
285da853ecaSopenharmony_ci            isOver = true;
286da853ecaSopenharmony_ci        } else {
287da853ecaSopenharmony_ci            ret = OH_AVMuxer_WriteSample(muxer, videoTrackIndex, videoBuffer, videoInfo);
288da853ecaSopenharmony_ci            isOver = true;
289da853ecaSopenharmony_ci        }
290da853ecaSopenharmony_ci        if (ret != AV_ERR_OK) {
291da853ecaSopenharmony_ci            printf("OH_AVMuxer_WriteSample error!\n");
292da853ecaSopenharmony_ci            break;
293da853ecaSopenharmony_ci        }
294da853ecaSopenharmony_ci    }
295da853ecaSopenharmony_ci    if (audioBuffer != NULL) {
296da853ecaSopenharmony_ci        OH_AVMemory_Destroy(audioBuffer);
297da853ecaSopenharmony_ci    }
298da853ecaSopenharmony_ci    if (videoBuffer != NULL) {
299da853ecaSopenharmony_ci        OH_AVMemory_Destroy(videoBuffer);
300da853ecaSopenharmony_ci    }
301da853ecaSopenharmony_ci}
302da853ecaSopenharmony_ci
303da853ecaSopenharmony_civoid WriteTrackCover(OH_AVMuxer *muxer, int coverTrackIndex, int fdInput)
304da853ecaSopenharmony_ci{
305da853ecaSopenharmony_ci    printf("WriteTrackCover\n");
306da853ecaSopenharmony_ci    OH_AVCodecBufferAttr info;
307da853ecaSopenharmony_ci    memset_s(&info, sizeof(info), 0, sizeof(info));
308da853ecaSopenharmony_ci    struct stat fileStat;
309da853ecaSopenharmony_ci    fstat(fdInput, &fileStat);
310da853ecaSopenharmony_ci    info.size = fileStat.st_size;
311da853ecaSopenharmony_ci    OH_AVBuffer *avMemBuffer = OH_AVBuffer_Create(info.size);
312da853ecaSopenharmony_ci    if (avMemBuffer == NULL) {
313da853ecaSopenharmony_ci        printf("OH_AVBuffer create error! size: %d \n", info.size);
314da853ecaSopenharmony_ci        return;
315da853ecaSopenharmony_ci    }
316da853ecaSopenharmony_ci    if (OH_AVBuffer_SetBufferAttr(avMemBuffer, &info) != AV_ERR_OK) {
317da853ecaSopenharmony_ci        printf("OH_AVBuffer_SetBufferAttr error!\n");
318da853ecaSopenharmony_ci        return;
319da853ecaSopenharmony_ci    }
320da853ecaSopenharmony_ci    if (read(fdInput, (void*)OH_AVBuffer_GetAddr(avMemBuffer), info.size) <= 0) {
321da853ecaSopenharmony_ci        printf("OH_AVBuffer_GetAddr error!\n");
322da853ecaSopenharmony_ci        OH_AVBuffer_Destroy(avMemBuffer);
323da853ecaSopenharmony_ci        return;
324da853ecaSopenharmony_ci    }
325da853ecaSopenharmony_ci    if (OH_AVMuxer_WriteSampleBuffer(muxer, coverTrackIndex, avMemBuffer) != AV_ERR_OK) {
326da853ecaSopenharmony_ci        printf("OH_AVMuxer_WriteSampleBuffer error!\n");
327da853ecaSopenharmony_ci        OH_AVBuffer_Destroy(avMemBuffer);
328da853ecaSopenharmony_ci        return;
329da853ecaSopenharmony_ci    }
330da853ecaSopenharmony_ci    OH_AVBuffer_Destroy(avMemBuffer);
331da853ecaSopenharmony_ci}
332da853ecaSopenharmony_ci
333da853ecaSopenharmony_ciint GetInputNum(int defaultNum)
334da853ecaSopenharmony_ci{
335da853ecaSopenharmony_ci    int num = getchar();
336da853ecaSopenharmony_ci    if (num == '\n') { // default
337da853ecaSopenharmony_ci        return defaultNum;
338da853ecaSopenharmony_ci    }
339da853ecaSopenharmony_ci    if (ungetc(num, stdin) == EOF) {
340da853ecaSopenharmony_ci        printf("GetInputNum ungetc failed!");
341da853ecaSopenharmony_ci    }
342da853ecaSopenharmony_ci    if (scanf_s("%d", &num) <= 0) {
343da853ecaSopenharmony_ci        num = defaultNum;
344da853ecaSopenharmony_ci    }
345da853ecaSopenharmony_ci    while ((getchar()) != '\n') {}
346da853ecaSopenharmony_ci    return num;
347da853ecaSopenharmony_ci}
348da853ecaSopenharmony_ci
349da853ecaSopenharmony_civoid NativeSelectMuxerType(void)
350da853ecaSopenharmony_ci{
351da853ecaSopenharmony_ci    printf("\nplese select muxer type : 0.mp4 1.m4a 2.amr 3.mp3 4.wav\n");
352da853ecaSopenharmony_ci    int num = GetInputNum(0);
353da853ecaSopenharmony_ci    switch (num) {
354da853ecaSopenharmony_ci        case MODE_ZERO:
355da853ecaSopenharmony_ci            g_muxerParam.outputFormat = AV_OUTPUT_FORMAT_MPEG_4;
356da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.outputFormatType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "mp4");
357da853ecaSopenharmony_ci            break;
358da853ecaSopenharmony_ci        case MODE_ONE:
359da853ecaSopenharmony_ci            g_muxerParam.outputFormat = AV_OUTPUT_FORMAT_M4A;
360da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.outputFormatType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "m4a");
361da853ecaSopenharmony_ci            break;
362da853ecaSopenharmony_ci        case MODE_TWO:
363da853ecaSopenharmony_ci            g_muxerParam.outputFormat = AV_OUTPUT_FORMAT_AMR;
364da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.outputFormatType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "amr");
365da853ecaSopenharmony_ci            break;
366da853ecaSopenharmony_ci        case MODE_THREE:
367da853ecaSopenharmony_ci            g_muxerParam.outputFormat = AV_OUTPUT_FORMAT_MP3;
368da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.outputFormatType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "mp3");
369da853ecaSopenharmony_ci            break;
370da853ecaSopenharmony_ci        case MODE_FOUR:
371da853ecaSopenharmony_ci            g_muxerParam.outputFormat = AV_OUTPUT_FORMAT_WAV;
372da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.outputFormatType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "wav");
373da853ecaSopenharmony_ci            break;
374da853ecaSopenharmony_ci        default:
375da853ecaSopenharmony_ci            g_muxerParam.outputFormat = AV_OUTPUT_FORMAT_MPEG_4;
376da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.outputFormatType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "mp4");
377da853ecaSopenharmony_ci            break;
378da853ecaSopenharmony_ci    }
379da853ecaSopenharmony_ci    printf("select mode:%d\n", num);
380da853ecaSopenharmony_ci}
381da853ecaSopenharmony_ci
382da853ecaSopenharmony_civoid NativeSelectRunMode(void)
383da853ecaSopenharmony_ci{
384da853ecaSopenharmony_ci    printf("\nplese select audio vide wrtie mode:\n");
385da853ecaSopenharmony_ci    printf("0. audio video write in sample thread\n");
386da853ecaSopenharmony_ci    printf("1. audio video write in different thread\n");
387da853ecaSopenharmony_ci    int num = GetInputNum(0);
388da853ecaSopenharmony_ci    switch (num) {
389da853ecaSopenharmony_ci        case MODE_ZERO:
390da853ecaSopenharmony_ci            g_muxerParam.runMode = NORMAL;
391da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.runModeType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", RUN_NORMAL);
392da853ecaSopenharmony_ci            break;
393da853ecaSopenharmony_ci        case MODE_ONE:
394da853ecaSopenharmony_ci            g_muxerParam.runMode = THREAD;
395da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.runModeType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", RUN_MUL_THREAD);
396da853ecaSopenharmony_ci            break;
397da853ecaSopenharmony_ci        default:
398da853ecaSopenharmony_ci            g_muxerParam.runMode = NORMAL;
399da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.runModeType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", RUN_NORMAL);
400da853ecaSopenharmony_ci            break;
401da853ecaSopenharmony_ci    }
402da853ecaSopenharmony_ci    printf("select mode:%d\n", num);
403da853ecaSopenharmony_ci}
404da853ecaSopenharmony_ci
405da853ecaSopenharmony_civoid NativeSelectAudio(void)
406da853ecaSopenharmony_ci{
407da853ecaSopenharmony_ci    printf("\nplese select audio mode: 0.noAudio 1.aac 2.mpeg 3.amr-nb 4.amr-wb 5.g711mu 6.raw\n");
408da853ecaSopenharmony_ci    int num = GetInputNum(1);
409da853ecaSopenharmony_ci    switch (num) {
410da853ecaSopenharmony_ci        case MODE_ONE:
411da853ecaSopenharmony_ci            g_muxerParam.audioParams = &g_audioAacPar;
412da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.audioType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "aac");
413da853ecaSopenharmony_ci            break;
414da853ecaSopenharmony_ci        case MODE_TWO:
415da853ecaSopenharmony_ci            g_muxerParam.audioParams = &g_audioMpegPar;
416da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.audioType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "mpeg");
417da853ecaSopenharmony_ci            break;
418da853ecaSopenharmony_ci        case MODE_THREE:
419da853ecaSopenharmony_ci            g_muxerParam.audioParams = &g_audioAmrNbPar;
420da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.audioType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "amr");
421da853ecaSopenharmony_ci            break;
422da853ecaSopenharmony_ci        case MODE_FOUR:
423da853ecaSopenharmony_ci            g_muxerParam.audioParams = &g_audioAmrWbPar;
424da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.audioType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "amr");
425da853ecaSopenharmony_ci            break;
426da853ecaSopenharmony_ci        case MODE_FIVE:
427da853ecaSopenharmony_ci            g_muxerParam.audioParams = &g_audioG711MUPar;
428da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.audioType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "g711mu");
429da853ecaSopenharmony_ci            break;
430da853ecaSopenharmony_ci        case MODE_SIX:
431da853ecaSopenharmony_ci            g_muxerParam.audioParams = &g_audioRawPar;
432da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.audioType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "raw");
433da853ecaSopenharmony_ci            break;
434da853ecaSopenharmony_ci        default:
435da853ecaSopenharmony_ci            g_muxerParam.audioParams = NULL;
436da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.audioType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "noAudio");
437da853ecaSopenharmony_ci            break;
438da853ecaSopenharmony_ci    }
439da853ecaSopenharmony_ci    printf("select mode:%d\n", num);
440da853ecaSopenharmony_ci}
441da853ecaSopenharmony_ci
442da853ecaSopenharmony_civoid NativeSelectVideo(void)
443da853ecaSopenharmony_ci{
444da853ecaSopenharmony_ci    printf("\nplese select video mode: 0.noVideo 1.h264 2.mpeg4 3.h265 4.hdr vivid\n");
445da853ecaSopenharmony_ci    int num = GetInputNum(1);
446da853ecaSopenharmony_ci    switch (num) {
447da853ecaSopenharmony_ci        case MODE_ONE:
448da853ecaSopenharmony_ci            g_muxerParam.videoParams = &g_videoH264Par;
449da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.videoType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "h264");
450da853ecaSopenharmony_ci            break;
451da853ecaSopenharmony_ci        case MODE_TWO:
452da853ecaSopenharmony_ci            g_muxerParam.videoParams = &g_videoMpeg4Par;
453da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.videoType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "mpeg4");
454da853ecaSopenharmony_ci            break;
455da853ecaSopenharmony_ci        case MODE_THREE:
456da853ecaSopenharmony_ci            g_muxerParam.videoParams = &g_videoH265Par;
457da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.videoType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "h265");
458da853ecaSopenharmony_ci            break;
459da853ecaSopenharmony_ci        case MODE_FOUR:
460da853ecaSopenharmony_ci            g_muxerParam.videoParams = &g_videoHdrPar;
461da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.videoType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "hdr-vivid");
462da853ecaSopenharmony_ci            break;
463da853ecaSopenharmony_ci        default:
464da853ecaSopenharmony_ci            g_muxerParam.videoParams = NULL;
465da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.videoType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "noVideo");
466da853ecaSopenharmony_ci            break;
467da853ecaSopenharmony_ci    }
468da853ecaSopenharmony_ci    printf("select mode:%d\n", num);
469da853ecaSopenharmony_ci}
470da853ecaSopenharmony_ci
471da853ecaSopenharmony_civoid NativeSelectCover(void)
472da853ecaSopenharmony_ci{
473da853ecaSopenharmony_ci    printf("\nplese select cover mode: 0.noCover 1.jpg 2.png 3.bmp\n");
474da853ecaSopenharmony_ci    int num = GetInputNum(1);
475da853ecaSopenharmony_ci    switch (num) {
476da853ecaSopenharmony_ci        case MODE_ONE:
477da853ecaSopenharmony_ci            g_muxerParam.coverParams = &g_jpegCoverPar;
478da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.coverType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "jpg");
479da853ecaSopenharmony_ci            break;
480da853ecaSopenharmony_ci        case MODE_TWO:
481da853ecaSopenharmony_ci            g_muxerParam.coverParams = &g_pngCoverPar;
482da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.coverType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "png");
483da853ecaSopenharmony_ci            break;
484da853ecaSopenharmony_ci        case MODE_THREE:
485da853ecaSopenharmony_ci            g_muxerParam.coverParams = &g_bmpCoverPar;
486da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.coverType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "bmp");
487da853ecaSopenharmony_ci            break;
488da853ecaSopenharmony_ci        default:
489da853ecaSopenharmony_ci            g_muxerParam.coverParams = NULL;
490da853ecaSopenharmony_ci            (void)snprintf_s(g_muxerParam.coverType, TYPE_BUFFER_SIZE, TYPE_BUFFER_SIZE - 1, "%s", "noCover");
491da853ecaSopenharmony_ci            break;
492da853ecaSopenharmony_ci    }
493da853ecaSopenharmony_ci    printf("select mode:%d\n", num);
494da853ecaSopenharmony_ci}
495da853ecaSopenharmony_ci
496da853ecaSopenharmony_civoid NativeSelectMode(void)
497da853ecaSopenharmony_ci{
498da853ecaSopenharmony_ci    if (g_muxerParam.outputFormat != AV_OUTPUT_FORMAT_DEFAULT) {
499da853ecaSopenharmony_ci        return;
500da853ecaSopenharmony_ci    }
501da853ecaSopenharmony_ci
502da853ecaSopenharmony_ci    NativeSelectMuxerType();
503da853ecaSopenharmony_ci    NativeSelectRunMode();
504da853ecaSopenharmony_ci    NativeSelectAudio();
505da853ecaSopenharmony_ci    NativeSelectVideo();
506da853ecaSopenharmony_ci    NativeSelectCover();
507da853ecaSopenharmony_ci}
508da853ecaSopenharmony_ci
509da853ecaSopenharmony_ciint OpenAllInputFile(FdListStr *fdStr)
510da853ecaSopenharmony_ci{
511da853ecaSopenharmony_ci    if (!fdStr) {
512da853ecaSopenharmony_ci        printf("fdStr is null!\n");
513da853ecaSopenharmony_ci        return -1;
514da853ecaSopenharmony_ci    }
515da853ecaSopenharmony_ci
516da853ecaSopenharmony_ci    if (g_muxerParam.audioParams) {
517da853ecaSopenharmony_ci        fdStr->inAudioFd = open(g_muxerParam.audioParams->fileName, O_RDONLY);
518da853ecaSopenharmony_ci        if (fdStr->inAudioFd < 0) {
519da853ecaSopenharmony_ci            printf("open %s failed!!\n", g_muxerParam.audioParams->fileName);
520da853ecaSopenharmony_ci        } else {
521da853ecaSopenharmony_ci            printf("open file %s success, -fd:%d, -flags %x\n", g_muxerParam.audioParams->fileName,
522da853ecaSopenharmony_ci                fdStr->inAudioFd, fcntl(fdStr->inAudioFd, F_GETFL, 0));
523da853ecaSopenharmony_ci        }
524da853ecaSopenharmony_ci    }
525da853ecaSopenharmony_ci
526da853ecaSopenharmony_ci    if (g_muxerParam.videoParams) {
527da853ecaSopenharmony_ci        fdStr->inVideoFd = open(g_muxerParam.videoParams->fileName, O_RDONLY);
528da853ecaSopenharmony_ci        if (fdStr->inVideoFd < 0) {
529da853ecaSopenharmony_ci            printf("open %s failed!!\n", g_muxerParam.videoParams->fileName);
530da853ecaSopenharmony_ci        } else {
531da853ecaSopenharmony_ci            printf("open file %s success, -fd:%d, -flags %x\n", g_muxerParam.videoParams->fileName,
532da853ecaSopenharmony_ci                fdStr->inVideoFd, fcntl(fdStr->inVideoFd, F_GETFL, 0));
533da853ecaSopenharmony_ci        }
534da853ecaSopenharmony_ci    }
535da853ecaSopenharmony_ci
536da853ecaSopenharmony_ci    if (g_muxerParam.coverParams) {
537da853ecaSopenharmony_ci        fdStr->inCoverFd = open(g_muxerParam.coverParams->fileName, O_RDONLY);
538da853ecaSopenharmony_ci        if (fdStr->inCoverFd < 0) {
539da853ecaSopenharmony_ci            printf("open %s failed!!\n", g_muxerParam.coverParams->fileName);
540da853ecaSopenharmony_ci        } else {
541da853ecaSopenharmony_ci            printf("open file %s success, -fd:%d, -flags %x\n", g_muxerParam.coverParams->fileName,
542da853ecaSopenharmony_ci                fdStr->inCoverFd, fcntl(fdStr->inCoverFd, F_GETFL, 0));
543da853ecaSopenharmony_ci        }
544da853ecaSopenharmony_ci    }
545da853ecaSopenharmony_ci    return 0;
546da853ecaSopenharmony_ci}
547da853ecaSopenharmony_ci
548da853ecaSopenharmony_ciint DoRunMuxer(FdListStr *fdStr, OH_AVMuxer *muxer)
549da853ecaSopenharmony_ci{
550da853ecaSopenharmony_ci    if (fdStr == NULL || muxer == NULL) {
551da853ecaSopenharmony_ci        printf("fdStr or  muxer is null!\n");
552da853ecaSopenharmony_ci        return -1;
553da853ecaSopenharmony_ci    }
554da853ecaSopenharmony_ci
555da853ecaSopenharmony_ci    if (OH_AVMuxer_SetRotation(muxer, 0) != AV_ERR_OK) {
556da853ecaSopenharmony_ci        printf("set failed!\n");
557da853ecaSopenharmony_ci        return -1;
558da853ecaSopenharmony_ci    }
559da853ecaSopenharmony_ci    int audioTrackIndex = AddTrackAudio(muxer, g_muxerParam.audioParams, fdStr->inAudioFd);
560da853ecaSopenharmony_ci    int videoTrackIndex = AddTrackVideo(muxer, g_muxerParam.videoParams, fdStr->inVideoFd);
561da853ecaSopenharmony_ci    int coverTrackIndex = AddTrackCover(muxer, g_muxerParam.coverParams, fdStr->inCoverFd);
562da853ecaSopenharmony_ci
563da853ecaSopenharmony_ci    if (OH_AVMuxer_Start(muxer) != AV_ERR_OK) {
564da853ecaSopenharmony_ci        printf("start muxer failed!\n");
565da853ecaSopenharmony_ci        return -1;
566da853ecaSopenharmony_ci    }
567da853ecaSopenharmony_ci
568da853ecaSopenharmony_ci    if (coverTrackIndex >= 0) {
569da853ecaSopenharmony_ci        WriteTrackCover(muxer, coverTrackIndex, fdStr->inCoverFd);
570da853ecaSopenharmony_ci    }
571da853ecaSopenharmony_ci
572da853ecaSopenharmony_ci    if (g_muxerParam.runMode == NORMAL) {
573da853ecaSopenharmony_ci        printf("== write audio video sample in same thread\n");
574da853ecaSopenharmony_ci        if (audioTrackIndex >= 0 && videoTrackIndex >= 0) {
575da853ecaSopenharmony_ci            WriteTrackSample(muxer, audioTrackIndex, videoTrackIndex, fdStr);
576da853ecaSopenharmony_ci        } else if (audioTrackIndex >= 0) {
577da853ecaSopenharmony_ci            WriteSingleTrackSample(muxer, audioTrackIndex, fdStr->inAudioFd);
578da853ecaSopenharmony_ci        } else if (videoTrackIndex >= 0) {
579da853ecaSopenharmony_ci            WriteSingleTrackSample(muxer, videoTrackIndex, fdStr->inVideoFd);
580da853ecaSopenharmony_ci        }
581da853ecaSopenharmony_ci    } else if (g_muxerParam.runMode == THREAD) {
582da853ecaSopenharmony_ci        printf("== write audio video sample in different thread\n");
583da853ecaSopenharmony_ci        pthread_t auThread;
584da853ecaSopenharmony_ci        pthread_t viThread;
585da853ecaSopenharmony_ci
586da853ecaSopenharmony_ci        struct WriteTrackSampleParam audioThParam = {muxer, audioTrackIndex, fdStr->inAudioFd};
587da853ecaSopenharmony_ci        struct WriteTrackSampleParam videoThparam = {muxer, videoTrackIndex, fdStr->inVideoFd};
588da853ecaSopenharmony_ci        pthread_create(&auThread, NULL, ThreadWriteTrackSample, &audioThParam);
589da853ecaSopenharmony_ci        pthread_create(&viThread, NULL, ThreadWriteTrackSample, &videoThparam);
590da853ecaSopenharmony_ci
591da853ecaSopenharmony_ci        pthread_join(viThread, NULL);
592da853ecaSopenharmony_ci        pthread_join(auThread, NULL);
593da853ecaSopenharmony_ci    }
594da853ecaSopenharmony_ci
595da853ecaSopenharmony_ci    if (OH_AVMuxer_Stop(muxer) != AV_ERR_OK) {
596da853ecaSopenharmony_ci        printf("stop muxer failed!\n");
597da853ecaSopenharmony_ci        return -1;
598da853ecaSopenharmony_ci    }
599da853ecaSopenharmony_ci    printf("native avmuxer finish! fd:out:%d, audio:%d, video:%d, cover:%d\n",
600da853ecaSopenharmony_ci        fdStr->outputFd, fdStr->inAudioFd, fdStr->inVideoFd, fdStr->inCoverFd);
601da853ecaSopenharmony_ci    return 0;
602da853ecaSopenharmony_ci}
603da853ecaSopenharmony_ci
604da853ecaSopenharmony_civoid CloseAllFd(FdListStr *fdStr)
605da853ecaSopenharmony_ci{
606da853ecaSopenharmony_ci    printf("close fd : [");
607da853ecaSopenharmony_ci    int fdTotalCount = sizeof(*fdStr) / sizeof(fdStr->start[0]);
608da853ecaSopenharmony_ci    for (int i = 0; i < fdTotalCount; i++) {
609da853ecaSopenharmony_ci        printf("%d, ", fdStr->start[i]);
610da853ecaSopenharmony_ci        if (fdStr->start[i] > 0) {
611da853ecaSopenharmony_ci            close(fdStr->start[i]);
612da853ecaSopenharmony_ci            fdStr->start[i] = -1;
613da853ecaSopenharmony_ci        }
614da853ecaSopenharmony_ci    }
615da853ecaSopenharmony_ci    printf("\b\b]\n");
616da853ecaSopenharmony_ci}
617da853ecaSopenharmony_ci
618da853ecaSopenharmony_ciint RunNativeMuxer(const char *out)
619da853ecaSopenharmony_ci{
620da853ecaSopenharmony_ci    FdListStr fdStr;
621da853ecaSopenharmony_ci    int fdTotalCount = sizeof(fdStr) / sizeof(fdStr.start[0]);
622da853ecaSopenharmony_ci    printf("fd list total size is %d\n", fdTotalCount);
623da853ecaSopenharmony_ci    for (int i = 0; i < fdTotalCount; i++) {
624da853ecaSopenharmony_ci        fdStr.start[i] = -1;
625da853ecaSopenharmony_ci    }
626da853ecaSopenharmony_ci
627da853ecaSopenharmony_ci    if (OpenAllInputFile(&fdStr) < 0) {
628da853ecaSopenharmony_ci        CloseAllFd(&fdStr);
629da853ecaSopenharmony_ci        return -1;
630da853ecaSopenharmony_ci    }
631da853ecaSopenharmony_ci
632da853ecaSopenharmony_ci    char outFileName[CONFIG_BUFFER_SIZE] = {0};
633da853ecaSopenharmony_ci    int err = snprintf_s(outFileName, sizeof(outFileName), sizeof(outFileName) - 1, "%s_%s_%s_%s_%s.%s",
634da853ecaSopenharmony_ci        out, g_muxerParam.runModeType, g_muxerParam.audioType, g_muxerParam.videoType,
635da853ecaSopenharmony_ci        g_muxerParam.coverType, g_muxerParam.outputFormatType);
636da853ecaSopenharmony_ci    if (err <= 0) {
637da853ecaSopenharmony_ci        CloseAllFd(&fdStr);
638da853ecaSopenharmony_ci        return -1;
639da853ecaSopenharmony_ci    }
640da853ecaSopenharmony_ci
641da853ecaSopenharmony_ci    fdStr.outputFd = open(outFileName, O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
642da853ecaSopenharmony_ci    if (fdStr.outputFd < 0) {
643da853ecaSopenharmony_ci        printf("open file failed! filePath is: %s %d\n", outFileName, fdStr.outputFd);
644da853ecaSopenharmony_ci        CloseAllFd(&fdStr);
645da853ecaSopenharmony_ci        return -1;
646da853ecaSopenharmony_ci    }
647da853ecaSopenharmony_ci    printf("open file %s success, -fd:%d, -flags %x\n", outFileName, fdStr.outputFd, fcntl(fdStr.outputFd, F_GETFL, 0));
648da853ecaSopenharmony_ci    long long testTimeStart = GetTimestamp();
649da853ecaSopenharmony_ci    OH_AVMuxer *muxer = OH_AVMuxer_Create(fdStr.outputFd, g_muxerParam.outputFormat);
650da853ecaSopenharmony_ci    DoRunMuxer(&fdStr, muxer);
651da853ecaSopenharmony_ci
652da853ecaSopenharmony_ci    if (muxer != NULL) {
653da853ecaSopenharmony_ci        OH_AVMuxer_Destroy(muxer);
654da853ecaSopenharmony_ci        muxer = NULL;
655da853ecaSopenharmony_ci    }
656da853ecaSopenharmony_ci
657da853ecaSopenharmony_ci    CloseAllFd(&fdStr);
658da853ecaSopenharmony_ci    long long testTimeEnd = GetTimestamp();
659da853ecaSopenharmony_ci    printf("muxer used time: %lld us\n", testTimeEnd - testTimeStart);
660da853ecaSopenharmony_ci
661da853ecaSopenharmony_ci    return 0;
662da853ecaSopenharmony_ci}
663