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