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