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