1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (C) 2022 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 <string> 17da853ecaSopenharmony_ci#include <iostream> 18da853ecaSopenharmony_ci#include <thread> 19da853ecaSopenharmony_ci#include <vector> 20da853ecaSopenharmony_ci#include <sys/stat.h> 21da853ecaSopenharmony_ci#include "gtest/gtest.h" 22da853ecaSopenharmony_ci#include "AVMuxerDemo.h" 23da853ecaSopenharmony_ci#include "securec.h" 24da853ecaSopenharmony_ci 25da853ecaSopenharmony_ciusing namespace std; 26da853ecaSopenharmony_ciusing namespace testing::ext; 27da853ecaSopenharmony_ciusing namespace OHOS; 28da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec; 29da853ecaSopenharmony_ci 30da853ecaSopenharmony_cinamespace { 31da853ecaSopenharmony_ciclass NativeAVMuxerFunctionTest : public testing::Test { 32da853ecaSopenharmony_cipublic: 33da853ecaSopenharmony_ci static void SetUpTestCase(); 34da853ecaSopenharmony_ci static void TearDownTestCase(); 35da853ecaSopenharmony_ci void SetUp() override; 36da853ecaSopenharmony_ci void TearDown() override; 37da853ecaSopenharmony_ci}; 38da853ecaSopenharmony_ci 39da853ecaSopenharmony_civoid NativeAVMuxerFunctionTest::SetUpTestCase() {} 40da853ecaSopenharmony_civoid NativeAVMuxerFunctionTest::TearDownTestCase() {} 41da853ecaSopenharmony_civoid NativeAVMuxerFunctionTest::SetUp() {} 42da853ecaSopenharmony_civoid NativeAVMuxerFunctionTest::TearDown() {} 43da853ecaSopenharmony_ci 44da853ecaSopenharmony_cistatic int g_inputFile = -1; 45da853ecaSopenharmony_cistatic const int DATA_AUDIO_ID = 0; 46da853ecaSopenharmony_cistatic const int DATA_VIDEO_ID = 1; 47da853ecaSopenharmony_ci 48da853ecaSopenharmony_ciconstexpr int32_t BIG_EXTRA_SIZE = 100; 49da853ecaSopenharmony_ciconstexpr int32_t SMALL_EXTRA_SIZE = 0; 50da853ecaSopenharmony_ci 51da853ecaSopenharmony_ciconstexpr int32_t CHANNEL_COUNT = 2; 52da853ecaSopenharmony_ciconstexpr int32_t SAMPLE_RATE = 44100; 53da853ecaSopenharmony_ciconstexpr int64_t AUDIO_BITRATE = 320000; 54da853ecaSopenharmony_ci 55da853ecaSopenharmony_ciconstexpr int32_t WIDTH = 352; 56da853ecaSopenharmony_ciconstexpr int32_t HEIGHT = 288; 57da853ecaSopenharmony_ciconstexpr int64_t VIDEO_BITRATE = 524569; 58da853ecaSopenharmony_ci 59da853ecaSopenharmony_ciconstexpr int32_t WIDTH_640 = 640; 60da853ecaSopenharmony_ciconstexpr int32_t WIDTH_720 = 720; 61da853ecaSopenharmony_ciconstexpr int32_t HEIGHT_360 = 360; 62da853ecaSopenharmony_ciconstexpr int32_t HEIGHT_480 = 480; 63da853ecaSopenharmony_ci 64da853ecaSopenharmony_ciint32_t testResult[10] = { -1 }; 65da853ecaSopenharmony_ci 66da853ecaSopenharmony_ciint32_t AddAudioTrack(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle) 67da853ecaSopenharmony_ci{ 68da853ecaSopenharmony_ci OH_AVFormat* audioFormat = OH_AVFormat_Create(); 69da853ecaSopenharmony_ci if (audioFormat == NULL) { 70da853ecaSopenharmony_ci printf("audio format failed!"); 71da853ecaSopenharmony_ci return -1; 72da853ecaSopenharmony_ci } 73da853ecaSopenharmony_ci int extraSize = 0; 74da853ecaSopenharmony_ci 75da853ecaSopenharmony_ci read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize)); 76da853ecaSopenharmony_ci if (extraSize <= BIG_EXTRA_SIZE && extraSize > SMALL_EXTRA_SIZE) { 77da853ecaSopenharmony_ci unsigned char buffer[100] = { 0 }; 78da853ecaSopenharmony_ci read(g_inputFile, buffer, extraSize); 79da853ecaSopenharmony_ci OH_AVFormat_SetBuffer(audioFormat, OH_MD_KEY_CODEC_CONFIG, buffer, extraSize); 80da853ecaSopenharmony_ci } 81da853ecaSopenharmony_ci 82da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(audioFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_MPEG); 83da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(audioFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, CHANNEL_COUNT); 84da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(audioFormat, OH_MD_KEY_AUD_SAMPLE_RATE, SAMPLE_RATE); 85da853ecaSopenharmony_ci OH_AVFormat_SetLongValue(audioFormat, OH_MD_KEY_BITRATE, AUDIO_BITRATE); 86da853ecaSopenharmony_ci 87da853ecaSopenharmony_ci int32_t trackId; 88da853ecaSopenharmony_ci muxerDemo->NativeAddTrack(handle, &trackId, audioFormat); 89da853ecaSopenharmony_ci OH_AVFormat_Destroy(audioFormat); 90da853ecaSopenharmony_ci return trackId; 91da853ecaSopenharmony_ci} 92da853ecaSopenharmony_ci 93da853ecaSopenharmony_ci 94da853ecaSopenharmony_ciint32_t AddVideoTrack(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle) 95da853ecaSopenharmony_ci{ 96da853ecaSopenharmony_ci OH_AVFormat* videoFormat = OH_AVFormat_Create(); 97da853ecaSopenharmony_ci if (videoFormat == NULL) { 98da853ecaSopenharmony_ci printf("video format failed!"); 99da853ecaSopenharmony_ci return -1; 100da853ecaSopenharmony_ci } 101da853ecaSopenharmony_ci int extraSize = 0; 102da853ecaSopenharmony_ci 103da853ecaSopenharmony_ci read(g_inputFile, static_cast<void*>(&extraSize), sizeof(extraSize)); 104da853ecaSopenharmony_ci if (extraSize <= BIG_EXTRA_SIZE && extraSize > SMALL_EXTRA_SIZE) { 105da853ecaSopenharmony_ci unsigned char buffer[100] = { 0 }; 106da853ecaSopenharmony_ci read(g_inputFile, buffer, extraSize); 107da853ecaSopenharmony_ci OH_AVFormat_SetBuffer(videoFormat, OH_MD_KEY_CODEC_CONFIG, buffer, extraSize); 108da853ecaSopenharmony_ci } 109da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(videoFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_VIDEO_MPEG4); 110da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(videoFormat, OH_MD_KEY_WIDTH, WIDTH); 111da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(videoFormat, OH_MD_KEY_HEIGHT, HEIGHT); 112da853ecaSopenharmony_ci OH_AVFormat_SetLongValue(videoFormat, OH_MD_KEY_BITRATE, VIDEO_BITRATE); 113da853ecaSopenharmony_ci 114da853ecaSopenharmony_ci int32_t trackId; 115da853ecaSopenharmony_ci muxerDemo->NativeAddTrack(handle, &trackId, videoFormat); 116da853ecaSopenharmony_ci OH_AVFormat_Destroy(videoFormat); 117da853ecaSopenharmony_ci return trackId; 118da853ecaSopenharmony_ci} 119da853ecaSopenharmony_ci 120da853ecaSopenharmony_ci 121da853ecaSopenharmony_ciint32_t AddCoverTrack(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, const string coverType) 122da853ecaSopenharmony_ci{ 123da853ecaSopenharmony_ci OH_AVFormat* coverFormat = OH_AVFormat_Create(); 124da853ecaSopenharmony_ci if (coverFormat == NULL) { 125da853ecaSopenharmony_ci printf("cover format failed!"); 126da853ecaSopenharmony_ci return -1; 127da853ecaSopenharmony_ci } 128da853ecaSopenharmony_ci 129da853ecaSopenharmony_ci if (coverType == "jpg") { 130da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(coverFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_IMAGE_JPG); 131da853ecaSopenharmony_ci } else if (coverType == "png") { 132da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(coverFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_IMAGE_PNG); 133da853ecaSopenharmony_ci } else { 134da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(coverFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_IMAGE_BMP); 135da853ecaSopenharmony_ci } 136da853ecaSopenharmony_ci 137da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(coverFormat, OH_MD_KEY_WIDTH, WIDTH); 138da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(coverFormat, OH_MD_KEY_HEIGHT, HEIGHT); 139da853ecaSopenharmony_ci 140da853ecaSopenharmony_ci int32_t trackId; 141da853ecaSopenharmony_ci muxerDemo->NativeAddTrack(handle, &trackId, coverFormat); 142da853ecaSopenharmony_ci OH_AVFormat_Destroy(coverFormat); 143da853ecaSopenharmony_ci return trackId; 144da853ecaSopenharmony_ci} 145da853ecaSopenharmony_ci 146da853ecaSopenharmony_cibool ReadFile(int& dataTrackId, int64_t& pts, int& dataSize) 147da853ecaSopenharmony_ci{ 148da853ecaSopenharmony_ci int ret = 0; 149da853ecaSopenharmony_ci ret = read(g_inputFile, static_cast<void*>(&dataTrackId), sizeof(dataTrackId)); 150da853ecaSopenharmony_ci if (ret <= 0) { 151da853ecaSopenharmony_ci cout << "read dataTrackId error, ret is: " << ret << endl; 152da853ecaSopenharmony_ci return false; 153da853ecaSopenharmony_ci } 154da853ecaSopenharmony_ci ret = read(g_inputFile, static_cast<void*>(&pts), sizeof(pts)); 155da853ecaSopenharmony_ci if (ret <= 0) { 156da853ecaSopenharmony_ci cout << "read info.pts error, ret is: " << ret << endl; 157da853ecaSopenharmony_ci return false; 158da853ecaSopenharmony_ci } 159da853ecaSopenharmony_ci ret = read(g_inputFile, static_cast<void*>(&dataSize), sizeof(dataSize)); 160da853ecaSopenharmony_ci if (ret <= 0) { 161da853ecaSopenharmony_ci cout << "read dataSize error, ret is: " << ret << endl; 162da853ecaSopenharmony_ci return false; 163da853ecaSopenharmony_ci } 164da853ecaSopenharmony_ci return true; 165da853ecaSopenharmony_ci} 166da853ecaSopenharmony_ci 167da853ecaSopenharmony_civoid WriteTrackSample(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int audioTrackIndex, int videoTrackIndex) 168da853ecaSopenharmony_ci{ 169da853ecaSopenharmony_ci OH_AVCodecBufferAttr info {0, 0, 0, 0}; 170da853ecaSopenharmony_ci OH_AVMemory* avMemBuffer = nullptr; 171da853ecaSopenharmony_ci uint8_t* data = nullptr; 172da853ecaSopenharmony_ci bool readRet; 173da853ecaSopenharmony_ci do { 174da853ecaSopenharmony_ci int ret = 0; 175da853ecaSopenharmony_ci int dataTrackId = 0; 176da853ecaSopenharmony_ci int dataSize = 0; 177da853ecaSopenharmony_ci int trackId = 0; 178da853ecaSopenharmony_ci readRet = ReadFile(dataTrackId, info.pts, dataSize); 179da853ecaSopenharmony_ci if (!readRet) { 180da853ecaSopenharmony_ci return; 181da853ecaSopenharmony_ci } 182da853ecaSopenharmony_ci avMemBuffer = OH_AVMemory_Create(dataSize); 183da853ecaSopenharmony_ci data = OH_AVMemory_GetAddr(avMemBuffer); 184da853ecaSopenharmony_ci ret = read(g_inputFile, static_cast<void*>(data), dataSize); 185da853ecaSopenharmony_ci if (ret <= 0) { 186da853ecaSopenharmony_ci cout << "read data error, ret is: " << ret << endl; 187da853ecaSopenharmony_ci return; 188da853ecaSopenharmony_ci } 189da853ecaSopenharmony_ci 190da853ecaSopenharmony_ci info.size = dataSize; 191da853ecaSopenharmony_ci if (dataTrackId == DATA_AUDIO_ID) { 192da853ecaSopenharmony_ci trackId = audioTrackIndex; 193da853ecaSopenharmony_ci } else if (dataTrackId == DATA_VIDEO_ID) { 194da853ecaSopenharmony_ci trackId = videoTrackIndex; 195da853ecaSopenharmony_ci } else { 196da853ecaSopenharmony_ci cout << "error dataTrackId : " << trackId << endl; 197da853ecaSopenharmony_ci } 198da853ecaSopenharmony_ci if (trackId >= 0) { 199da853ecaSopenharmony_ci OH_AVErrCode result = muxerDemo->NativeWriteSampleBuffer(handle, trackId, avMemBuffer, info); 200da853ecaSopenharmony_ci if (result != AV_ERR_OK) { 201da853ecaSopenharmony_ci cout << "OH_AVMuxer_WriteSampleBuffer error! ret is: " << result << endl; 202da853ecaSopenharmony_ci return; 203da853ecaSopenharmony_ci } 204da853ecaSopenharmony_ci } 205da853ecaSopenharmony_ci if (avMemBuffer != nullptr) { 206da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 207da853ecaSopenharmony_ci avMemBuffer = nullptr; 208da853ecaSopenharmony_ci } 209da853ecaSopenharmony_ci } while (readRet) 210da853ecaSopenharmony_ci} 211da853ecaSopenharmony_ci 212da853ecaSopenharmony_civoid WriteTrackSampleShort(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int audioTrackIndex, 213da853ecaSopenharmony_ci int videoTrackIndex, int audioWriteTime) 214da853ecaSopenharmony_ci{ 215da853ecaSopenharmony_ci OH_AVCodecBufferAttr info {0, 0, 0, 0}; 216da853ecaSopenharmony_ci OH_AVMemory* avMemBuffer = nullptr; 217da853ecaSopenharmony_ci uint8_t* data = nullptr; 218da853ecaSopenharmony_ci bool readRet; 219da853ecaSopenharmony_ci do { 220da853ecaSopenharmony_ci int dataTrackId = 0; 221da853ecaSopenharmony_ci int dataSize = 0; 222da853ecaSopenharmony_ci int ret = 0; 223da853ecaSopenharmony_ci int trackId = 0; 224da853ecaSopenharmony_ci int curTime = 0; 225da853ecaSopenharmony_ci readRet = ReadFile(dataTrackId, info.pts, dataSize); 226da853ecaSopenharmony_ci if (!readRet) { 227da853ecaSopenharmony_ci return; 228da853ecaSopenharmony_ci } 229da853ecaSopenharmony_ci 230da853ecaSopenharmony_ci avMemBuffer = OH_AVMemory_Create(dataSize); 231da853ecaSopenharmony_ci data = OH_AVMemory_GetAddr(avMemBuffer); 232da853ecaSopenharmony_ci ret = read(g_inputFile, static_cast<void*>(data), dataSize); 233da853ecaSopenharmony_ci if (ret <= 0) { return; } 234da853ecaSopenharmony_ci 235da853ecaSopenharmony_ci info.size = dataSize; 236da853ecaSopenharmony_ci if (dataTrackId == DATA_AUDIO_ID) { 237da853ecaSopenharmony_ci trackId = audioTrackIndex; 238da853ecaSopenharmony_ci } else if (dataTrackId == DATA_VIDEO_ID) { 239da853ecaSopenharmony_ci trackId = videoTrackIndex; 240da853ecaSopenharmony_ci } else { 241da853ecaSopenharmony_ci printf("error dataTrackId : %d", trackId); 242da853ecaSopenharmony_ci } 243da853ecaSopenharmony_ci if (trackId >= 0) { 244da853ecaSopenharmony_ci if (trackId == audioTrackIndex && curTime > audioWriteTime) { 245da853ecaSopenharmony_ci continue; 246da853ecaSopenharmony_ci } else if (trackId == audioTrackIndex) { 247da853ecaSopenharmony_ci curTime++; 248da853ecaSopenharmony_ci } 249da853ecaSopenharmony_ci OH_AVErrCode result = muxerDemo->NativeWriteSampleBuffer(handle, trackId, avMemBuffer, info); 250da853ecaSopenharmony_ci if (result != AV_ERR_OK) { 251da853ecaSopenharmony_ci printf("OH_AVMuxer_WriteSampleBuffer error!"); 252da853ecaSopenharmony_ci return; 253da853ecaSopenharmony_ci } 254da853ecaSopenharmony_ci } 255da853ecaSopenharmony_ci if (avMemBuffer != nullptr) { 256da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 257da853ecaSopenharmony_ci avMemBuffer = nullptr; 258da853ecaSopenharmony_ci } 259da853ecaSopenharmony_ci }while (readRet) 260da853ecaSopenharmony_ci} 261da853ecaSopenharmony_ci 262da853ecaSopenharmony_ciint32_t AddAudioTrackByFd(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int32_t inputFile) 263da853ecaSopenharmony_ci{ 264da853ecaSopenharmony_ci OH_AVFormat* audioFormat = OH_AVFormat_Create(); 265da853ecaSopenharmony_ci if (audioFormat == NULL) { 266da853ecaSopenharmony_ci printf("audio format failed!"); 267da853ecaSopenharmony_ci return -1; 268da853ecaSopenharmony_ci } 269da853ecaSopenharmony_ci int extraSize = 0; 270da853ecaSopenharmony_ci 271da853ecaSopenharmony_ci read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize)); 272da853ecaSopenharmony_ci if (extraSize <= BIG_EXTRA_SIZE && extraSize > SMALL_EXTRA_SIZE) { 273da853ecaSopenharmony_ci unsigned char buffer[100] = { 0 }; 274da853ecaSopenharmony_ci read(inputFile, buffer, extraSize); 275da853ecaSopenharmony_ci OH_AVFormat_SetBuffer(audioFormat, OH_MD_KEY_CODEC_CONFIG, buffer, extraSize); 276da853ecaSopenharmony_ci } 277da853ecaSopenharmony_ci 278da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(audioFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_MPEG); 279da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(audioFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, CHANNEL_COUNT); 280da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(audioFormat, OH_MD_KEY_AUD_SAMPLE_RATE, SAMPLE_RATE); 281da853ecaSopenharmony_ci OH_AVFormat_SetLongValue(audioFormat, OH_MD_KEY_BITRATE, AUDIO_BITRATE); 282da853ecaSopenharmony_ci 283da853ecaSopenharmony_ci int32_t trackId; 284da853ecaSopenharmony_ci muxerDemo->NativeAddTrack(handle, &trackId, audioFormat); 285da853ecaSopenharmony_ci OH_AVFormat_Destroy(audioFormat); 286da853ecaSopenharmony_ci return trackId; 287da853ecaSopenharmony_ci} 288da853ecaSopenharmony_ci 289da853ecaSopenharmony_ciint32_t AddAudioTrackAACByFd(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int32_t inputFile) 290da853ecaSopenharmony_ci{ 291da853ecaSopenharmony_ci OH_AVFormat* audioFormat = OH_AVFormat_Create(); 292da853ecaSopenharmony_ci if (audioFormat == NULL) { 293da853ecaSopenharmony_ci printf("audio format failed!"); 294da853ecaSopenharmony_ci return -1; 295da853ecaSopenharmony_ci } 296da853ecaSopenharmony_ci int extraSize = 0; 297da853ecaSopenharmony_ci 298da853ecaSopenharmony_ci read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize)); 299da853ecaSopenharmony_ci if (extraSize <= BIG_EXTRA_SIZE && extraSize > SMALL_EXTRA_SIZE) { 300da853ecaSopenharmony_ci unsigned char buffer[100] = { 0 }; 301da853ecaSopenharmony_ci read(inputFile, buffer, extraSize); 302da853ecaSopenharmony_ci OH_AVFormat_SetBuffer(audioFormat, OH_MD_KEY_CODEC_CONFIG, buffer, extraSize); 303da853ecaSopenharmony_ci } 304da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(audioFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); 305da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(audioFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, CHANNEL_COUNT); 306da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(audioFormat, OH_MD_KEY_AUD_SAMPLE_RATE, SAMPLE_RATE); 307da853ecaSopenharmony_ci OH_AVFormat_SetLongValue(audioFormat, OH_MD_KEY_BITRATE, AUDIO_BITRATE); 308da853ecaSopenharmony_ci 309da853ecaSopenharmony_ci int32_t trackId; 310da853ecaSopenharmony_ci muxerDemo->NativeAddTrack(handle, &trackId, audioFormat); 311da853ecaSopenharmony_ci OH_AVFormat_Destroy(audioFormat); 312da853ecaSopenharmony_ci return trackId; 313da853ecaSopenharmony_ci} 314da853ecaSopenharmony_ci 315da853ecaSopenharmony_ciint32_t AddVideoTrackByFd(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int32_t inputFile) 316da853ecaSopenharmony_ci{ 317da853ecaSopenharmony_ci OH_AVFormat* videoFormat = OH_AVFormat_Create(); 318da853ecaSopenharmony_ci if (videoFormat == NULL) { 319da853ecaSopenharmony_ci printf("video format failed!"); 320da853ecaSopenharmony_ci return -1; 321da853ecaSopenharmony_ci } 322da853ecaSopenharmony_ci int extraSize = 0; 323da853ecaSopenharmony_ci 324da853ecaSopenharmony_ci read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize)); 325da853ecaSopenharmony_ci if (extraSize <= BIG_EXTRA_SIZE && extraSize > SMALL_EXTRA_SIZE) { 326da853ecaSopenharmony_ci unsigned char buffer[100] = { 0 }; 327da853ecaSopenharmony_ci read(inputFile, buffer, extraSize); 328da853ecaSopenharmony_ci OH_AVFormat_SetBuffer(videoFormat, OH_MD_KEY_CODEC_CONFIG, buffer, extraSize); 329da853ecaSopenharmony_ci } 330da853ecaSopenharmony_ci 331da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(videoFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_VIDEO_MPEG4); 332da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(videoFormat, OH_MD_KEY_WIDTH, WIDTH_720); 333da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(videoFormat, OH_MD_KEY_HEIGHT, HEIGHT_480); 334da853ecaSopenharmony_ci OH_AVFormat_SetLongValue(videoFormat, OH_MD_KEY_BITRATE, VIDEO_BITRATE); 335da853ecaSopenharmony_ci 336da853ecaSopenharmony_ci int32_t trackId; 337da853ecaSopenharmony_ci muxerDemo->NativeAddTrack(handle, &trackId, videoFormat); 338da853ecaSopenharmony_ci OH_AVFormat_Destroy(videoFormat); 339da853ecaSopenharmony_ci return trackId; 340da853ecaSopenharmony_ci} 341da853ecaSopenharmony_ci 342da853ecaSopenharmony_cibool ReadFileByFd(int& dataTrackId, int64_t& pts, int& dataSize, int32_t inputFile) 343da853ecaSopenharmony_ci{ 344da853ecaSopenharmony_ci int ret = 0; 345da853ecaSopenharmony_ci ret = read(inputFile, static_cast<void*>(&dataTrackId), sizeof(dataTrackId)); 346da853ecaSopenharmony_ci if (ret <= 0) { 347da853ecaSopenharmony_ci cout << "read dataTrackId error, ret is: " << ret << endl; 348da853ecaSopenharmony_ci return false; 349da853ecaSopenharmony_ci } 350da853ecaSopenharmony_ci ret = read(inputFile, static_cast<void*>(&pts), sizeof(pts)); 351da853ecaSopenharmony_ci if (ret <= 0) { 352da853ecaSopenharmony_ci cout << "read info.pts error, ret is: " << ret << endl; 353da853ecaSopenharmony_ci return false; 354da853ecaSopenharmony_ci } 355da853ecaSopenharmony_ci ret = read(inputFile, static_cast<void*>(&dataSize), sizeof(dataSize)); 356da853ecaSopenharmony_ci if (ret <= 0) { 357da853ecaSopenharmony_ci cout << "read dataSize error, ret is: " << ret << endl; 358da853ecaSopenharmony_ci return false; 359da853ecaSopenharmony_ci } 360da853ecaSopenharmony_ci return true; 361da853ecaSopenharmony_ci} 362da853ecaSopenharmony_ci 363da853ecaSopenharmony_civoid WriteTrackSampleByFd(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int audioTrackIndex, 364da853ecaSopenharmony_ci int videoTrackIndex, int32_t inputFile) 365da853ecaSopenharmony_ci{ 366da853ecaSopenharmony_ci OH_AVCodecBufferAttr info {0, 0, 0, 0}; 367da853ecaSopenharmony_ci OH_AVMemory* avMemBuffer = nullptr; 368da853ecaSopenharmony_ci uint8_t* data = nullptr; 369da853ecaSopenharmony_ci string resultStr = ""; 370da853ecaSopenharmony_ci bool readRet; 371da853ecaSopenharmony_ci do { 372da853ecaSopenharmony_ci int dataTrackId = 0; 373da853ecaSopenharmony_ci int dataSize = 0; 374da853ecaSopenharmony_ci int ret = 0; 375da853ecaSopenharmony_ci int trackId = 0; 376da853ecaSopenharmony_ci readRet = ReadFileByFd(dataTrackId, info.pts, dataSize, inputFile); 377da853ecaSopenharmony_ci if (!readRet) { 378da853ecaSopenharmony_ci return; 379da853ecaSopenharmony_ci } 380da853ecaSopenharmony_ci 381da853ecaSopenharmony_ci avMemBuffer = OH_AVMemory_Create(dataSize); 382da853ecaSopenharmony_ci data = OH_AVMemory_GetAddr(avMemBuffer); 383da853ecaSopenharmony_ci cout << resultStr << endl; 384da853ecaSopenharmony_ci 385da853ecaSopenharmony_ci ret = read(inputFile, static_cast<void*>(data), dataSize); 386da853ecaSopenharmony_ci if (ret <= 0) { 387da853ecaSopenharmony_ci cout << "read data error, ret is: " << ret << endl; 388da853ecaSopenharmony_ci continue; 389da853ecaSopenharmony_ci } 390da853ecaSopenharmony_ci 391da853ecaSopenharmony_ci info.size = dataSize; 392da853ecaSopenharmony_ci if (dataTrackId == DATA_AUDIO_ID) { 393da853ecaSopenharmony_ci trackId = audioTrackIndex; 394da853ecaSopenharmony_ci } else if (dataTrackId == DATA_VIDEO_ID) { 395da853ecaSopenharmony_ci trackId = videoTrackIndex; 396da853ecaSopenharmony_ci } else { 397da853ecaSopenharmony_ci cout << "error dataTrackId : " << dataTrackId << endl; 398da853ecaSopenharmony_ci } 399da853ecaSopenharmony_ci if (trackId >= 0) { 400da853ecaSopenharmony_ci OH_AVErrCode result = muxerDemo->NativeWriteSampleBuffer(handle, trackId, avMemBuffer, info); 401da853ecaSopenharmony_ci if (result != AV_ERR_OK) { 402da853ecaSopenharmony_ci cout << "OH_AVMuxer_WriteSampleBuffer error! ret is: " << result << endl; 403da853ecaSopenharmony_ci break; 404da853ecaSopenharmony_ci } 405da853ecaSopenharmony_ci } 406da853ecaSopenharmony_ci 407da853ecaSopenharmony_ci if (avMemBuffer != nullptr) { 408da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 409da853ecaSopenharmony_ci avMemBuffer = nullptr; 410da853ecaSopenharmony_ci } 411da853ecaSopenharmony_ci } while (readRet) 412da853ecaSopenharmony_ci} 413da853ecaSopenharmony_ci 414da853ecaSopenharmony_civoid RunMuxer(const string testcaseName, int threadId, OH_AVOutputFormat format) 415da853ecaSopenharmony_ci{ 416da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 417da853ecaSopenharmony_ci string fileName = testcaseName + "_" + to_string(threadId); 418da853ecaSopenharmony_ci 419da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", cur file name is: " << fileName << endl; 420da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, fileName); 421da853ecaSopenharmony_ci 422da853ecaSopenharmony_ci int32_t inputFile; 423da853ecaSopenharmony_ci int32_t audioTrackId; 424da853ecaSopenharmony_ci int32_t videoTrackId; 425da853ecaSopenharmony_ci 426da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", fd is: " << fd << endl; 427da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 428da853ecaSopenharmony_ci 429da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", handle is: " << handle << endl; 430da853ecaSopenharmony_ci OH_AVErrCode ret; 431da853ecaSopenharmony_ci 432da853ecaSopenharmony_ci if (format == AV_OUTPUT_FORMAT_MPEG_4) { 433da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", format is: " << format << endl; 434da853ecaSopenharmony_ci inputFile = open("avDataMpegMpeg4.bin", O_RDONLY); 435da853ecaSopenharmony_ci audioTrackId = AddAudioTrackByFd(muxerDemo, handle, inputFile); 436da853ecaSopenharmony_ci videoTrackId = AddVideoTrackByFd(muxerDemo, handle, inputFile); 437da853ecaSopenharmony_ci } else { 438da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", format is: " << format << endl; 439da853ecaSopenharmony_ci inputFile = open("avData_mpeg4_aac_2.bin", O_RDONLY); 440da853ecaSopenharmony_ci audioTrackId = AddAudioTrackAACByFd(muxerDemo, handle, inputFile); 441da853ecaSopenharmony_ci videoTrackId = AddVideoTrackByFd(muxerDemo, handle, inputFile); 442da853ecaSopenharmony_ci } 443da853ecaSopenharmony_ci 444da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", audio track id is: " << audioTrackId << 445da853ecaSopenharmony_ci ", video track id is: " << videoTrackId << endl; 446da853ecaSopenharmony_ci 447da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 448da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", Start ret is:" << ret << endl; 449da853ecaSopenharmony_ci 450da853ecaSopenharmony_ci WriteTrackSampleByFd(muxerDemo, handle, audioTrackId, videoTrackId, inputFile); 451da853ecaSopenharmony_ci 452da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 453da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", Stop ret is:" << ret << endl; 454da853ecaSopenharmony_ci 455da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 456da853ecaSopenharmony_ci cout << "thread id is: " << threadId << ", Destroy ret is:" << ret << endl; 457da853ecaSopenharmony_ci 458da853ecaSopenharmony_ci testResult[threadId] = AV_ERR_OK; 459da853ecaSopenharmony_ci close(inputFile); 460da853ecaSopenharmony_ci close(fd); 461da853ecaSopenharmony_ci delete muxerDemo; 462da853ecaSopenharmony_ci} 463da853ecaSopenharmony_ci 464da853ecaSopenharmony_civoid FreeBuffer(OH_AVMemory* avMemBuffer) 465da853ecaSopenharmony_ci{ 466da853ecaSopenharmony_ci if (avMemBuffer != nullptr) { 467da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 468da853ecaSopenharmony_ci avMemBuffer = nullptr; 469da853ecaSopenharmony_ci } 470da853ecaSopenharmony_ci} 471da853ecaSopenharmony_ci 472da853ecaSopenharmony_civoid WriteSingleTrackSample(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int trackId, int fd) 473da853ecaSopenharmony_ci{ 474da853ecaSopenharmony_ci OH_AVMemory* avMemBuffer = nullptr; 475da853ecaSopenharmony_ci uint8_t* data = nullptr; 476da853ecaSopenharmony_ci OH_AVCodecBufferAttr info; 477da853ecaSopenharmony_ci memset_s(&info, sizeof(info), 0, sizeof(info)); 478da853ecaSopenharmony_ci int ret = 0; 479da853ecaSopenharmony_ci do { 480da853ecaSopenharmony_ci int dataSize = 0; 481da853ecaSopenharmony_ci int flags = 0; 482da853ecaSopenharmony_ci ret = read(fd, static_cast<void*>(&info.pts), sizeof(info.pts)); 483da853ecaSopenharmony_ci if (ret <= 0) { 484da853ecaSopenharmony_ci break; 485da853ecaSopenharmony_ci } 486da853ecaSopenharmony_ci 487da853ecaSopenharmony_ci ret = read(fd, static_cast<void*>(&flags), sizeof(flags)); 488da853ecaSopenharmony_ci if (ret <= 0) { 489da853ecaSopenharmony_ci break; 490da853ecaSopenharmony_ci } 491da853ecaSopenharmony_ci 492da853ecaSopenharmony_ci // read frame buffer 493da853ecaSopenharmony_ci ret = read(fd, static_cast<void*>(&dataSize), sizeof(dataSize)); 494da853ecaSopenharmony_ci if (ret <= 0 || dataSize < 0) { 495da853ecaSopenharmony_ci break; 496da853ecaSopenharmony_ci } 497da853ecaSopenharmony_ci 498da853ecaSopenharmony_ci avMemBuffer = OH_AVMemory_Create(dataSize); 499da853ecaSopenharmony_ci data = OH_AVMemory_GetAddr(avMemBuffer); 500da853ecaSopenharmony_ci ret = read(fd, static_cast<void*>(data), dataSize); 501da853ecaSopenharmony_ci if (ret <= 0) { 502da853ecaSopenharmony_ci break; 503da853ecaSopenharmony_ci } 504da853ecaSopenharmony_ci info.size = dataSize; 505da853ecaSopenharmony_ci 506da853ecaSopenharmony_ci info.flags = 0; 507da853ecaSopenharmony_ci if (flags != 0) { 508da853ecaSopenharmony_ci info.flags |= AVCODEC_BUFFER_FLAGS_SYNC_FRAME; 509da853ecaSopenharmony_ci } 510da853ecaSopenharmony_ci 511da853ecaSopenharmony_ci OH_AVErrCode result = muxerDemo->NativeWriteSampleBuffer(handle, trackId, avMemBuffer, info); 512da853ecaSopenharmony_ci if (result != AV_ERR_OK) { 513da853ecaSopenharmony_ci cout << "WriteSingleTrackSample error! ret is: " << result << endl; 514da853ecaSopenharmony_ci break; 515da853ecaSopenharmony_ci } 516da853ecaSopenharmony_ci FreeBuffer(avMemBuffer); 517da853ecaSopenharmony_ci } while (ret > 0) 518da853ecaSopenharmony_ci FreeBuffer(avMemBuffer); 519da853ecaSopenharmony_ci} 520da853ecaSopenharmony_ci 521da853ecaSopenharmony_civoid WriteTrackCover(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int coverTrackIndex, int fdInput) 522da853ecaSopenharmony_ci{ 523da853ecaSopenharmony_ci printf("WriteTrackCover\n"); 524da853ecaSopenharmony_ci OH_AVCodecBufferAttr info; 525da853ecaSopenharmony_ci memset_s(&info, sizeof(info), 0, sizeof(info)); 526da853ecaSopenharmony_ci stat fileStat; 527da853ecaSopenharmony_ci fstat(fdInput, &fileStat); 528da853ecaSopenharmony_ci info.size = fileStat.st_size; 529da853ecaSopenharmony_ci OH_AVMemory* avMemBuffer = OH_AVMemory_Create(info.size); 530da853ecaSopenharmony_ci uint8_t* data = OH_AVMemory_GetAddr(avMemBuffer); 531da853ecaSopenharmony_ci 532da853ecaSopenharmony_ci int ret = read(fdInput, static_cast<void *>data, info.size); 533da853ecaSopenharmony_ci if (ret <= 0) { 534da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 535da853ecaSopenharmony_ci return; 536da853ecaSopenharmony_ci } 537da853ecaSopenharmony_ci 538da853ecaSopenharmony_ci OH_AVErrCode result = muxerDemo->NativeWriteSampleBuffer(handle, coverTrackIndex, avMemBuffer, info); 539da853ecaSopenharmony_ci if (result != AV_ERR_OK) { 540da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 541da853ecaSopenharmony_ci cout << "WriteTrackCover error! ret is: " << result << endl; 542da853ecaSopenharmony_ci return; 543da853ecaSopenharmony_ci } 544da853ecaSopenharmony_ci if (avMemBuffer != nullptr) { 545da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 546da853ecaSopenharmony_ci avMemBuffer = nullptr; 547da853ecaSopenharmony_ci } 548da853ecaSopenharmony_ci} 549da853ecaSopenharmony_ci 550da853ecaSopenharmony_ciint32_t AddVideoTrackH264ByFd(AVMuxerDemo* muxerDemo, OH_AVMuxer* handle, int32_t inputFile) 551da853ecaSopenharmony_ci{ 552da853ecaSopenharmony_ci OH_AVFormat* videoFormat = OH_AVFormat_Create(); 553da853ecaSopenharmony_ci if (videoFormat == NULL) { 554da853ecaSopenharmony_ci printf("video format failed!"); 555da853ecaSopenharmony_ci return -1; 556da853ecaSopenharmony_ci } 557da853ecaSopenharmony_ci int extraSize = 0; 558da853ecaSopenharmony_ci 559da853ecaSopenharmony_ci read(inputFile, static_cast<void*>(&extraSize), sizeof(extraSize)); 560da853ecaSopenharmony_ci if (extraSize <= BIG_EXTRA_SIZE && extraSize > SMALL_EXTRA_SIZE) { 561da853ecaSopenharmony_ci unsigned char buffer[100] = { 0 }; 562da853ecaSopenharmony_ci read(inputFile, buffer, extraSize); 563da853ecaSopenharmony_ci OH_AVFormat_SetBuffer(videoFormat, OH_MD_KEY_CODEC_CONFIG, buffer, extraSize); 564da853ecaSopenharmony_ci } 565da853ecaSopenharmony_ci 566da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(videoFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_VIDEO_AVC); 567da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(videoFormat, OH_MD_KEY_WIDTH, WIDTH_640); 568da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(videoFormat, OH_MD_KEY_HEIGHT, HEIGHT_360); 569da853ecaSopenharmony_ci OH_AVFormat_SetLongValue(videoFormat, OH_MD_KEY_BITRATE, VIDEO_BITRATE); 570da853ecaSopenharmony_ci 571da853ecaSopenharmony_ci int32_t trackId; 572da853ecaSopenharmony_ci muxerDemo->NativeAddTrack(handle, &trackId, videoFormat); 573da853ecaSopenharmony_ci OH_AVFormat_Destroy(videoFormat); 574da853ecaSopenharmony_ci return trackId; 575da853ecaSopenharmony_ci} 576da853ecaSopenharmony_ci} 577da853ecaSopenharmony_ci 578da853ecaSopenharmony_ci 579da853ecaSopenharmony_ci/** 580da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_001 581da853ecaSopenharmony_ci * @tc.name : audio 582da853ecaSopenharmony_ci * @tc.desc : Function test 583da853ecaSopenharmony_ci */ 584da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_001, TestSize.Level2) 585da853ecaSopenharmony_ci{ 586da853ecaSopenharmony_ci OH_AVOutputFormat formatList[] = { AV_OUTPUT_FORMAT_M4A, AV_OUTPUT_FORMAT_MPEG_4 }; 587da853ecaSopenharmony_ci for (int i = 0; i < 2; i++) 588da853ecaSopenharmony_ci { 589da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 590da853ecaSopenharmony_ci 591da853ecaSopenharmony_ci OH_AVOutputFormat format = formatList[i]; 592da853ecaSopenharmony_ci string fileName = "FUNCTION_001_" + to_string(i); 593da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, fileName); 594da853ecaSopenharmony_ci 595da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 596da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 597da853ecaSopenharmony_ci 598da853ecaSopenharmony_ci int32_t audioFileFd = open("aac_44100_2.bin", O_RDONLY); 599da853ecaSopenharmony_ci 600da853ecaSopenharmony_ci int32_t audioTrackId = AddAudioTrackAACByFd(muxerDemo, handle, audioFileFd); 601da853ecaSopenharmony_ci 602da853ecaSopenharmony_ci OH_AVErrCode ret; 603da853ecaSopenharmony_ci 604da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 605da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 606da853ecaSopenharmony_ci 607da853ecaSopenharmony_ci if (audioTrackId >= 0) { 608da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, audioTrackId, audioFileFd); 609da853ecaSopenharmony_ci } 610da853ecaSopenharmony_ci 611da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 612da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 613da853ecaSopenharmony_ci 614da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 615da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 616da853ecaSopenharmony_ci 617da853ecaSopenharmony_ci close(audioFileFd); 618da853ecaSopenharmony_ci close(fd); 619da853ecaSopenharmony_ci delete muxerDemo; 620da853ecaSopenharmony_ci } 621da853ecaSopenharmony_ci} 622da853ecaSopenharmony_ci 623da853ecaSopenharmony_ci/** 624da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_002 625da853ecaSopenharmony_ci * @tc.name : video 626da853ecaSopenharmony_ci * @tc.desc : Function test 627da853ecaSopenharmony_ci */ 628da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_002, TestSize.Level2) 629da853ecaSopenharmony_ci{ 630da853ecaSopenharmony_ci OH_AVOutputFormat formatList[] = {AV_OUTPUT_FORMAT_M4A, AV_OUTPUT_FORMAT_MPEG_4}; 631da853ecaSopenharmony_ci for (int i = 0; i < 2; i++) 632da853ecaSopenharmony_ci { 633da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 634da853ecaSopenharmony_ci 635da853ecaSopenharmony_ci OH_AVOutputFormat format = formatList[i]; 636da853ecaSopenharmony_ci string fileName = "FUNCTION_002_" + to_string(i); 637da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, fileName); 638da853ecaSopenharmony_ci 639da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 640da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 641da853ecaSopenharmony_ci 642da853ecaSopenharmony_ci int32_t videoFileFd = open("h264_640_360.bin", O_RDONLY); 643da853ecaSopenharmony_ci int32_t videoTrackId = AddVideoTrackH264ByFd(muxerDemo, handle, videoFileFd); 644da853ecaSopenharmony_ci 645da853ecaSopenharmony_ci OH_AVErrCode ret; 646da853ecaSopenharmony_ci 647da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 648da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 649da853ecaSopenharmony_ci 650da853ecaSopenharmony_ci if (videoTrackId >= 0) { 651da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, videoTrackId, videoFileFd); 652da853ecaSopenharmony_ci } 653da853ecaSopenharmony_ci 654da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 655da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 656da853ecaSopenharmony_ci 657da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 658da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 659da853ecaSopenharmony_ci 660da853ecaSopenharmony_ci close(videoFileFd); 661da853ecaSopenharmony_ci close(fd); 662da853ecaSopenharmony_ci delete muxerDemo; 663da853ecaSopenharmony_ci } 664da853ecaSopenharmony_ci} 665da853ecaSopenharmony_ci 666da853ecaSopenharmony_ci 667da853ecaSopenharmony_ci/** 668da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_003 669da853ecaSopenharmony_ci * @tc.name : audio and video 670da853ecaSopenharmony_ci * @tc.desc : Function test 671da853ecaSopenharmony_ci */ 672da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_003, TestSize.Level2) 673da853ecaSopenharmony_ci{ 674da853ecaSopenharmony_ci OH_AVOutputFormat formatList[] = {AV_OUTPUT_FORMAT_M4A, AV_OUTPUT_FORMAT_MPEG_4}; 675da853ecaSopenharmony_ci for (int i = 0; i < 2; i++) 676da853ecaSopenharmony_ci { 677da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 678da853ecaSopenharmony_ci 679da853ecaSopenharmony_ci OH_AVOutputFormat format = formatList[i]; 680da853ecaSopenharmony_ci string fileName = "FUNCTION_003_" + to_string(i); 681da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, fileName); 682da853ecaSopenharmony_ci 683da853ecaSopenharmony_ci int32_t audioFileFd = open("aac_44100_2.bin", O_RDONLY); 684da853ecaSopenharmony_ci int32_t videoFileFd = open("mpeg4_720_480.bin", O_RDONLY); 685da853ecaSopenharmony_ci 686da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 687da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 688da853ecaSopenharmony_ci 689da853ecaSopenharmony_ci int32_t audioTrackId = AddAudioTrackAACByFd(muxerDemo, handle, audioFileFd); 690da853ecaSopenharmony_ci int32_t videoTrackId = AddVideoTrackByFd(muxerDemo, handle, videoFileFd); 691da853ecaSopenharmony_ci 692da853ecaSopenharmony_ci cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl; 693da853ecaSopenharmony_ci 694da853ecaSopenharmony_ci OH_AVErrCode ret; 695da853ecaSopenharmony_ci 696da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 697da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 698da853ecaSopenharmony_ci 699da853ecaSopenharmony_ci if (audioTrackId >= 0) { 700da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, audioTrackId, audioFileFd); 701da853ecaSopenharmony_ci } 702da853ecaSopenharmony_ci if (videoTrackId >= 0) { 703da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, videoTrackId, videoFileFd); 704da853ecaSopenharmony_ci } 705da853ecaSopenharmony_ci 706da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 707da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 708da853ecaSopenharmony_ci 709da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 710da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 711da853ecaSopenharmony_ci 712da853ecaSopenharmony_ci close(audioFileFd); 713da853ecaSopenharmony_ci close(videoFileFd); 714da853ecaSopenharmony_ci close(fd); 715da853ecaSopenharmony_ci delete muxerDemo; 716da853ecaSopenharmony_ci } 717da853ecaSopenharmony_ci} 718da853ecaSopenharmony_ci 719da853ecaSopenharmony_ci 720da853ecaSopenharmony_ci/** 721da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_004 722da853ecaSopenharmony_ci * @tc.name : mp4(SetRotation) 723da853ecaSopenharmony_ci * @tc.desc : Function test 724da853ecaSopenharmony_ci */ 725da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_004, TestSize.Level2) 726da853ecaSopenharmony_ci{ 727da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 728da853ecaSopenharmony_ci 729da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 730da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, "FUNCTION_004"); 731da853ecaSopenharmony_ci 732da853ecaSopenharmony_ci g_inputFile = open("avDataMpegMpeg4.bin", O_RDONLY); 733da853ecaSopenharmony_ci 734da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 735da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 736da853ecaSopenharmony_ci 737da853ecaSopenharmony_ci int32_t audioTrackId = AddAudioTrack(muxerDemo, handle); 738da853ecaSopenharmony_ci int32_t videoTrackId = AddVideoTrack(muxerDemo, handle); 739da853ecaSopenharmony_ci 740da853ecaSopenharmony_ci cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl; 741da853ecaSopenharmony_ci 742da853ecaSopenharmony_ci OH_AVErrCode ret; 743da853ecaSopenharmony_ci ret = muxerDemo->NativeSetRotation(handle, 90); 744da853ecaSopenharmony_ci cout << "SetRotation ret is:" << ret << endl; 745da853ecaSopenharmony_ci 746da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 747da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 748da853ecaSopenharmony_ci 749da853ecaSopenharmony_ci WriteTrackSample(muxerDemo, handle, audioTrackId, videoTrackId); 750da853ecaSopenharmony_ci 751da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 752da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 753da853ecaSopenharmony_ci 754da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 755da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 756da853ecaSopenharmony_ci 757da853ecaSopenharmony_ci close(g_inputFile); 758da853ecaSopenharmony_ci close(fd); 759da853ecaSopenharmony_ci delete muxerDemo; 760da853ecaSopenharmony_ci} 761da853ecaSopenharmony_ci 762da853ecaSopenharmony_ci 763da853ecaSopenharmony_ci/** 764da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_005 765da853ecaSopenharmony_ci * @tc.name : mp4(video audio length not equal) 766da853ecaSopenharmony_ci * @tc.desc : Function test 767da853ecaSopenharmony_ci */ 768da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_005, TestSize.Level2) 769da853ecaSopenharmony_ci{ 770da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 771da853ecaSopenharmony_ci 772da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 773da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, "FUNCTION_005"); 774da853ecaSopenharmony_ci 775da853ecaSopenharmony_ci g_inputFile = open("avDataMpegMpeg4.bin", O_RDONLY); 776da853ecaSopenharmony_ci 777da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 778da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 779da853ecaSopenharmony_ci 780da853ecaSopenharmony_ci OH_AVErrCode ret; 781da853ecaSopenharmony_ci 782da853ecaSopenharmony_ci int32_t audioTrackId = AddAudioTrack(muxerDemo, handle); 783da853ecaSopenharmony_ci int32_t videoTrackId = AddVideoTrack(muxerDemo, handle); 784da853ecaSopenharmony_ci 785da853ecaSopenharmony_ci cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << endl; 786da853ecaSopenharmony_ci 787da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 788da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 789da853ecaSopenharmony_ci 790da853ecaSopenharmony_ci WriteTrackSampleShort(muxerDemo, handle, audioTrackId, videoTrackId, 100); 791da853ecaSopenharmony_ci 792da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 793da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 794da853ecaSopenharmony_ci 795da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 796da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 797da853ecaSopenharmony_ci 798da853ecaSopenharmony_ci close(g_inputFile); 799da853ecaSopenharmony_ci close(fd); 800da853ecaSopenharmony_ci delete muxerDemo; 801da853ecaSopenharmony_ci} 802da853ecaSopenharmony_ci 803da853ecaSopenharmony_ci 804da853ecaSopenharmony_ci/** 805da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_006 806da853ecaSopenharmony_ci * @tc.name : m4a(thread) 807da853ecaSopenharmony_ci * @tc.desc : Function test 808da853ecaSopenharmony_ci */ 809da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_006, TestSize.Level2) 810da853ecaSopenharmony_ci{ 811da853ecaSopenharmony_ci vector<thread> threadVec; 812da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_M4A; 813da853ecaSopenharmony_ci for (int i = 0; i < 16; i++) 814da853ecaSopenharmony_ci { 815da853ecaSopenharmony_ci threadVec.push_back(thread(RunMuxer, "FUNCTION_006", i, format)); 816da853ecaSopenharmony_ci } 817da853ecaSopenharmony_ci for (uint32_t i = 0; i < threadVec.size(); i++) 818da853ecaSopenharmony_ci { 819da853ecaSopenharmony_ci threadVec[i].join(); 820da853ecaSopenharmony_ci } 821da853ecaSopenharmony_ci for (int32_t i = 0; i < 10; i++) 822da853ecaSopenharmony_ci { 823da853ecaSopenharmony_ci ASSERT_EQ(AV_ERR_OK, testResult[i]); 824da853ecaSopenharmony_ci } 825da853ecaSopenharmony_ci} 826da853ecaSopenharmony_ci 827da853ecaSopenharmony_ci 828da853ecaSopenharmony_ci/** 829da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_007 830da853ecaSopenharmony_ci * @tc.name : mp4(thread) 831da853ecaSopenharmony_ci * @tc.desc : Function test 832da853ecaSopenharmony_ci */ 833da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_007, TestSize.Level2) 834da853ecaSopenharmony_ci{ 835da853ecaSopenharmony_ci vector<thread> threadVec; 836da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 837da853ecaSopenharmony_ci for (int i = 0; i < 16; i++) 838da853ecaSopenharmony_ci { 839da853ecaSopenharmony_ci threadVec.push_back(thread(RunMuxer, "FUNCTION_007", i, format)); 840da853ecaSopenharmony_ci } 841da853ecaSopenharmony_ci for (uint32_t i = 0; i < threadVec.size(); i++) 842da853ecaSopenharmony_ci { 843da853ecaSopenharmony_ci threadVec[i].join(); 844da853ecaSopenharmony_ci } 845da853ecaSopenharmony_ci for (int32_t i = 0; i < 10; i++) 846da853ecaSopenharmony_ci { 847da853ecaSopenharmony_ci ASSERT_EQ(AV_ERR_OK, testResult[i]); 848da853ecaSopenharmony_ci } 849da853ecaSopenharmony_ci} 850da853ecaSopenharmony_ci 851da853ecaSopenharmony_ci 852da853ecaSopenharmony_ci/** 853da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_008 854da853ecaSopenharmony_ci * @tc.name : m4a(multi audio track) 855da853ecaSopenharmony_ci * @tc.desc : Function test 856da853ecaSopenharmony_ci */ 857da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_008, TestSize.Level2) 858da853ecaSopenharmony_ci{ 859da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 860da853ecaSopenharmony_ci 861da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_M4A; 862da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, "FUNCTION_008"); 863da853ecaSopenharmony_ci 864da853ecaSopenharmony_ci int32_t audioFileFd1 = open("aac_44100_2.bin", O_RDONLY); 865da853ecaSopenharmony_ci int32_t audioFileFd2 = open("aac_44100_2.bin", O_RDONLY); 866da853ecaSopenharmony_ci 867da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 868da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 869da853ecaSopenharmony_ci 870da853ecaSopenharmony_ci int32_t audioTrackId1 = AddAudioTrackAACByFd(muxerDemo, handle, audioFileFd1); 871da853ecaSopenharmony_ci int32_t audioTrackId2 = AddAudioTrackAACByFd(muxerDemo, handle, audioFileFd2); 872da853ecaSopenharmony_ci 873da853ecaSopenharmony_ci cout << "audio track 1 id is: " << audioTrackId1 << ", audio track 2 id is: " << audioTrackId2 << endl; 874da853ecaSopenharmony_ci 875da853ecaSopenharmony_ci OH_AVErrCode ret; 876da853ecaSopenharmony_ci 877da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 878da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 879da853ecaSopenharmony_ci 880da853ecaSopenharmony_ci if (audioTrackId1 >= 0) { 881da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, audioTrackId1, audioFileFd1); 882da853ecaSopenharmony_ci } 883da853ecaSopenharmony_ci if (audioTrackId2 >= 0) { 884da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, audioTrackId2, audioFileFd2); 885da853ecaSopenharmony_ci } 886da853ecaSopenharmony_ci 887da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 888da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 889da853ecaSopenharmony_ci 890da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 891da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 892da853ecaSopenharmony_ci 893da853ecaSopenharmony_ci close(audioFileFd1); 894da853ecaSopenharmony_ci close(audioFileFd2); 895da853ecaSopenharmony_ci close(fd); 896da853ecaSopenharmony_ci delete muxerDemo; 897da853ecaSopenharmony_ci} 898da853ecaSopenharmony_ci 899da853ecaSopenharmony_ci 900da853ecaSopenharmony_ci/** 901da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_009 902da853ecaSopenharmony_ci * @tc.name : mp4(multi video track) 903da853ecaSopenharmony_ci * @tc.desc : Function test 904da853ecaSopenharmony_ci */ 905da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_009, TestSize.Level2) 906da853ecaSopenharmony_ci{ 907da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 908da853ecaSopenharmony_ci 909da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 910da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, "FUNCTION_009"); 911da853ecaSopenharmony_ci 912da853ecaSopenharmony_ci int32_t videoFileFd1 = open("h264_640_360.bin", O_RDONLY); 913da853ecaSopenharmony_ci int32_t videoFileFd2 = open("h264_640_360.bin", O_RDONLY); 914da853ecaSopenharmony_ci 915da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 916da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 917da853ecaSopenharmony_ci 918da853ecaSopenharmony_ci int32_t videoTrackId1 = AddVideoTrackH264ByFd(muxerDemo, handle, videoFileFd1); 919da853ecaSopenharmony_ci int32_t videoTrackId2 = AddVideoTrackH264ByFd(muxerDemo, handle, videoFileFd2); 920da853ecaSopenharmony_ci 921da853ecaSopenharmony_ci cout << "video track 1 id is: " << videoTrackId1 << ", video track 2 id is: " << videoTrackId2 << endl; 922da853ecaSopenharmony_ci 923da853ecaSopenharmony_ci OH_AVErrCode ret; 924da853ecaSopenharmony_ci 925da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 926da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 927da853ecaSopenharmony_ci 928da853ecaSopenharmony_ci if (videoTrackId1 >= 0) { 929da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, videoTrackId1, videoFileFd1); 930da853ecaSopenharmony_ci } 931da853ecaSopenharmony_ci if (videoTrackId2 >= 0) { 932da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, videoTrackId2, videoFileFd2); 933da853ecaSopenharmony_ci } 934da853ecaSopenharmony_ci 935da853ecaSopenharmony_ci 936da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 937da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 938da853ecaSopenharmony_ci 939da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 940da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 941da853ecaSopenharmony_ci 942da853ecaSopenharmony_ci close(videoFileFd1); 943da853ecaSopenharmony_ci close(videoFileFd2); 944da853ecaSopenharmony_ci close(fd); 945da853ecaSopenharmony_ci delete muxerDemo; 946da853ecaSopenharmony_ci} 947da853ecaSopenharmony_ci 948da853ecaSopenharmony_ci 949da853ecaSopenharmony_ci/** 950da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_010 951da853ecaSopenharmony_ci * @tc.name : m4a(auido video with cover) 952da853ecaSopenharmony_ci * @tc.desc : Function test 953da853ecaSopenharmony_ci */ 954da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_010, TestSize.Level2) 955da853ecaSopenharmony_ci{ 956da853ecaSopenharmony_ci string coverTypeList[] = {"bmp", "jpg", "png"}; 957da853ecaSopenharmony_ci for (int i = 0; i < 3; i++) 958da853ecaSopenharmony_ci { 959da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 960da853ecaSopenharmony_ci string outputFile = "FUNCTION_010_" + coverTypeList[i]; 961da853ecaSopenharmony_ci string coverFile = "greatwall." + coverTypeList[i]; 962da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_M4A; 963da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, outputFile); 964da853ecaSopenharmony_ci 965da853ecaSopenharmony_ci int32_t audioFileFd = open("aac_44100_2.bin", O_RDONLY); 966da853ecaSopenharmony_ci int32_t videoFileFd = open("h264_640_360.bin", O_RDONLY); 967da853ecaSopenharmony_ci int32_t coverFileFd = open(coverFile.c_str(), O_RDONLY); 968da853ecaSopenharmony_ci 969da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 970da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 971da853ecaSopenharmony_ci 972da853ecaSopenharmony_ci int32_t audioTrackId = AddAudioTrackAACByFd(muxerDemo, handle, audioFileFd); 973da853ecaSopenharmony_ci int32_t videoTrackId = AddVideoTrackH264ByFd(muxerDemo, handle, videoFileFd); 974da853ecaSopenharmony_ci int32_t coverTrackId = AddCoverTrack(muxerDemo, handle, coverTypeList[i]); 975da853ecaSopenharmony_ci 976da853ecaSopenharmony_ci cout << "audio track id is: " << audioTrackId << ", cover track id is: " << coverTrackId << endl; 977da853ecaSopenharmony_ci 978da853ecaSopenharmony_ci OH_AVErrCode ret; 979da853ecaSopenharmony_ci 980da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 981da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 982da853ecaSopenharmony_ci 983da853ecaSopenharmony_ci WriteTrackCover(muxerDemo, handle, coverTrackId, coverFileFd); 984da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, audioTrackId, audioFileFd); 985da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, videoTrackId, videoFileFd); 986da853ecaSopenharmony_ci 987da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 988da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 989da853ecaSopenharmony_ci 990da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 991da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 992da853ecaSopenharmony_ci 993da853ecaSopenharmony_ci close(audioFileFd); 994da853ecaSopenharmony_ci close(videoFileFd); 995da853ecaSopenharmony_ci close(coverFileFd); 996da853ecaSopenharmony_ci close(fd); 997da853ecaSopenharmony_ci delete muxerDemo; 998da853ecaSopenharmony_ci } 999da853ecaSopenharmony_ci} 1000da853ecaSopenharmony_ci 1001da853ecaSopenharmony_ci 1002da853ecaSopenharmony_ci/** 1003da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_011 1004da853ecaSopenharmony_ci * @tc.name : mp4(audio video with cover) 1005da853ecaSopenharmony_ci * @tc.desc : Function test 1006da853ecaSopenharmony_ci */ 1007da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFunctionTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUNCTION_011, TestSize.Level2) 1008da853ecaSopenharmony_ci{ 1009da853ecaSopenharmony_ci string coverTypeList[] = { "bmp", "jpg", "png" }; 1010da853ecaSopenharmony_ci for (int i = 0; i < 3; i++) 1011da853ecaSopenharmony_ci { 1012da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 1013da853ecaSopenharmony_ci string outputFile = "FUNCTION_011_" + coverTypeList[i]; 1014da853ecaSopenharmony_ci string coverFile = "greatwall." + coverTypeList[i]; 1015da853ecaSopenharmony_ci 1016da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 1017da853ecaSopenharmony_ci int32_t fd = muxerDemo->GetFdByName(format, outputFile); 1018da853ecaSopenharmony_ci 1019da853ecaSopenharmony_ci int32_t audioFileFd = open("aac_44100_2.bin", O_RDONLY); 1020da853ecaSopenharmony_ci int32_t videoFileFd = open("mpeg4_720_480.bin", O_RDONLY); 1021da853ecaSopenharmony_ci int32_t coverFileFd = open(coverFile.c_str(), O_RDONLY); 1022da853ecaSopenharmony_ci 1023da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 1024da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 1025da853ecaSopenharmony_ci 1026da853ecaSopenharmony_ci int32_t audioTrackId = AddAudioTrackAACByFd(muxerDemo, handle, audioFileFd); 1027da853ecaSopenharmony_ci int32_t videoTrackId = AddVideoTrackByFd(muxerDemo, handle, videoFileFd); 1028da853ecaSopenharmony_ci int32_t coverTrackId = AddCoverTrack(muxerDemo, handle, coverTypeList[i]); 1029da853ecaSopenharmony_ci 1030da853ecaSopenharmony_ci cout << "audio track id is: " << audioTrackId << ", video track id is: " << videoTrackId << 1031da853ecaSopenharmony_ci ", cover track id is: " << coverTrackId << endl; 1032da853ecaSopenharmony_ci 1033da853ecaSopenharmony_ci OH_AVErrCode ret; 1034da853ecaSopenharmony_ci 1035da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 1036da853ecaSopenharmony_ci cout << "Start ret is:" << ret << endl; 1037da853ecaSopenharmony_ci 1038da853ecaSopenharmony_ci WriteTrackCover(muxerDemo, handle, coverTrackId, coverFileFd); 1039da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, audioTrackId, audioFileFd); 1040da853ecaSopenharmony_ci WriteSingleTrackSample(muxerDemo, handle, videoTrackId, videoFileFd); 1041da853ecaSopenharmony_ci 1042da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 1043da853ecaSopenharmony_ci cout << "Stop ret is:" << ret << endl; 1044da853ecaSopenharmony_ci 1045da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 1046da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 1047da853ecaSopenharmony_ci 1048da853ecaSopenharmony_ci close(audioFileFd); 1049da853ecaSopenharmony_ci close(videoFileFd); 1050da853ecaSopenharmony_ci close(coverFileFd); 1051da853ecaSopenharmony_ci close(fd); 1052da853ecaSopenharmony_ci delete muxerDemo; 1053da853ecaSopenharmony_ci } 1054da853ecaSopenharmony_ci}