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 <ctime> 19da853ecaSopenharmony_ci#include "gtest/gtest.h" 20da853ecaSopenharmony_ci#include "AVMuxerDemo.h" 21da853ecaSopenharmony_ci 22da853ecaSopenharmony_ciusing namespace std; 23da853ecaSopenharmony_ciusing namespace testing::ext; 24da853ecaSopenharmony_ciusing namespace OHOS; 25da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec; 26da853ecaSopenharmony_ci 27da853ecaSopenharmony_ci 28da853ecaSopenharmony_cinamespace { 29da853ecaSopenharmony_ci class NativeAVMuxerFuzzTest : public testing::Test { 30da853ecaSopenharmony_ci public: 31da853ecaSopenharmony_ci static void SetUpTestCase(); 32da853ecaSopenharmony_ci static void TearDownTestCase(); 33da853ecaSopenharmony_ci void SetUp() override; 34da853ecaSopenharmony_ci void TearDown() override; 35da853ecaSopenharmony_ci }; 36da853ecaSopenharmony_ci 37da853ecaSopenharmony_ci void NativeAVMuxerFuzzTest::SetUpTestCase() {} 38da853ecaSopenharmony_ci void NativeAVMuxerFuzzTest::TearDownTestCase() {} 39da853ecaSopenharmony_ci void NativeAVMuxerFuzzTest::SetUp() {} 40da853ecaSopenharmony_ci void NativeAVMuxerFuzzTest::TearDown() {} 41da853ecaSopenharmony_ci 42da853ecaSopenharmony_ci constexpr int FUZZ_TEST_NUM = 1000000; 43da853ecaSopenharmony_ci constexpr int AUDIO_PTS_ADD = 21; 44da853ecaSopenharmony_ci 45da853ecaSopenharmony_ci int32_t getIntRand() 46da853ecaSopenharmony_ci { 47da853ecaSopenharmony_ci int32_t data = -10000 + rand() % 20001; 48da853ecaSopenharmony_ci return data; 49da853ecaSopenharmony_ci } 50da853ecaSopenharmony_ci} 51da853ecaSopenharmony_ci 52da853ecaSopenharmony_ci/** 53da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_001 54da853ecaSopenharmony_ci * @tc.name : OH_AVMuxer_Create 55da853ecaSopenharmony_ci * @tc.desc : Fuzz test 56da853ecaSopenharmony_ci */ 57da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_001, TestSize.Level2) 58da853ecaSopenharmony_ci{ 59da853ecaSopenharmony_ci srand(time(nullptr) * 10); 60da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 61da853ecaSopenharmony_ci 62da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 63da853ecaSopenharmony_ci int32_t fd = -1; 64da853ecaSopenharmony_ci 65da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 66da853ecaSopenharmony_ci 67da853ecaSopenharmony_ci for (int i = 0; i < FUZZ_TEST_NUM; i++) { 68da853ecaSopenharmony_ci cout << "current run time is: " << i << endl; 69da853ecaSopenharmony_ci fd = rand(); 70da853ecaSopenharmony_ci format = OH_AVOutputFormat(rand() % 3); 71da853ecaSopenharmony_ci handle = muxerDemo->NativeCreate(fd, format); 72da853ecaSopenharmony_ci if (handle != nullptr) { 73da853ecaSopenharmony_ci muxerDemo->NativeDestroy(handle); 74da853ecaSopenharmony_ci } 75da853ecaSopenharmony_ci } 76da853ecaSopenharmony_ci 77da853ecaSopenharmony_ci delete muxerDemo; 78da853ecaSopenharmony_ci} 79da853ecaSopenharmony_ci 80da853ecaSopenharmony_ci 81da853ecaSopenharmony_ci/** 82da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_002 83da853ecaSopenharmony_ci * @tc.name : OH_AVMuxer_SetRotation 84da853ecaSopenharmony_ci * @tc.desc : Fuzz test 85da853ecaSopenharmony_ci */ 86da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_002, TestSize.Level2) 87da853ecaSopenharmony_ci{ 88da853ecaSopenharmony_ci srand(time(nullptr) * 10); 89da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 90da853ecaSopenharmony_ci 91da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 92da853ecaSopenharmony_ci int32_t fd = -1; 93da853ecaSopenharmony_ci fd = muxerDemo->GetFdByMode(format); 94da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 95da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 96da853ecaSopenharmony_ci 97da853ecaSopenharmony_ci int32_t rotation; 98da853ecaSopenharmony_ci OH_AVErrCode ret; 99da853ecaSopenharmony_ci 100da853ecaSopenharmony_ci for (int i = 0; i < FUZZ_TEST_NUM; i++) { 101da853ecaSopenharmony_ci cout << "current run time is: " << i << endl; 102da853ecaSopenharmony_ci rotation = getIntRand(); 103da853ecaSopenharmony_ci cout << "rotation is: " << rotation << endl; 104da853ecaSopenharmony_ci ret = muxerDemo->NativeSetRotation(handle, rotation); 105da853ecaSopenharmony_ci cout << "ret code is: " << ret << endl; 106da853ecaSopenharmony_ci } 107da853ecaSopenharmony_ci 108da853ecaSopenharmony_ci delete muxerDemo; 109da853ecaSopenharmony_ci} 110da853ecaSopenharmony_ci 111da853ecaSopenharmony_ci 112da853ecaSopenharmony_ci/** 113da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_003 114da853ecaSopenharmony_ci * @tc.name : OH_AVMuxer_AddTrack 115da853ecaSopenharmony_ci * @tc.desc : Fuzz test 116da853ecaSopenharmony_ci */ 117da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_003, TestSize.Level2) 118da853ecaSopenharmony_ci{ 119da853ecaSopenharmony_ci srand(time(nullptr) * 10); 120da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 121da853ecaSopenharmony_ci 122da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 123da853ecaSopenharmony_ci int32_t fd = -1; 124da853ecaSopenharmony_ci fd = muxerDemo->GetFdByMode(format); 125da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 126da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 127da853ecaSopenharmony_ci 128da853ecaSopenharmony_ci string mimeType[] = {"audio/mp4a-latm", "audio/mpeg", "video/avc", "video/mp4v-es"}; 129da853ecaSopenharmony_ci OH_AVFormat* trackFormat = OH_AVFormat_Create(); 130da853ecaSopenharmony_ci int32_t trackId; 131da853ecaSopenharmony_ci OH_AVErrCode ret; 132da853ecaSopenharmony_ci 133da853ecaSopenharmony_ci for (int i = 0; i < FUZZ_TEST_NUM; i++) { 134da853ecaSopenharmony_ci cout << "current run time is: " << i << endl; 135da853ecaSopenharmony_ci int typeIndex = rand() % 4; 136da853ecaSopenharmony_ci int audioChannels = getIntRand(); 137da853ecaSopenharmony_ci int audioSampleRate = getIntRand(); 138da853ecaSopenharmony_ci 139da853ecaSopenharmony_ci int videoWidth = getIntRand(); 140da853ecaSopenharmony_ci int videoHeight = getIntRand(); 141da853ecaSopenharmony_ci 142da853ecaSopenharmony_ci // audio config 143da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, mimeType[typeIndex].c_str()); 144da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, audioChannels); 145da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, audioSampleRate); 146da853ecaSopenharmony_ci 147da853ecaSopenharmony_ci // video config 148da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_WIDTH, videoWidth); 149da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_HEIGHT, videoHeight); 150da853ecaSopenharmony_ci 151da853ecaSopenharmony_ci ret = muxerDemo->NativeAddTrack(handle, &trackId, trackFormat); 152da853ecaSopenharmony_ci cout << "trackId is: " << trackId << ", ret is: " << ret << endl; 153da853ecaSopenharmony_ci } 154da853ecaSopenharmony_ci 155da853ecaSopenharmony_ci OH_AVFormat_Destroy(trackFormat); 156da853ecaSopenharmony_ci muxerDemo->NativeDestroy(handle); 157da853ecaSopenharmony_ci delete muxerDemo; 158da853ecaSopenharmony_ci} 159da853ecaSopenharmony_ci 160da853ecaSopenharmony_ci 161da853ecaSopenharmony_ci/** 162da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_004 163da853ecaSopenharmony_ci * @tc.name : WriteSampleBuffer 164da853ecaSopenharmony_ci * @tc.desc : Fuzz test 165da853ecaSopenharmony_ci */ 166da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_004, TestSize.Level2) 167da853ecaSopenharmony_ci{ 168da853ecaSopenharmony_ci srand(time(nullptr) * 10); 169da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 170da853ecaSopenharmony_ci 171da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_M4A; 172da853ecaSopenharmony_ci int32_t fd = -1; 173da853ecaSopenharmony_ci fd = muxerDemo->GetFdByMode(format); 174da853ecaSopenharmony_ci OH_AVMuxer* handle = muxerDemo->NativeCreate(fd, format); 175da853ecaSopenharmony_ci ASSERT_NE(nullptr, handle); 176da853ecaSopenharmony_ci 177da853ecaSopenharmony_ci uint8_t a[100]; 178da853ecaSopenharmony_ci OH_AVFormat* trackFormat = OH_AVFormat_Create(); 179da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); 180da853ecaSopenharmony_ci OH_AVFormat_SetLongValue(trackFormat, OH_MD_KEY_BITRATE, 320000); 181da853ecaSopenharmony_ci OH_AVFormat_SetBuffer(trackFormat, OH_MD_KEY_CODEC_CONFIG, a, 100); 182da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, 1); 183da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, 48000); 184da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_PROFILE, 0); 185da853ecaSopenharmony_ci 186da853ecaSopenharmony_ci int32_t trackId; 187da853ecaSopenharmony_ci OH_AVErrCode ret; 188da853ecaSopenharmony_ci 189da853ecaSopenharmony_ci ret = muxerDemo->NativeAddTrack(handle, &trackId, trackFormat); 190da853ecaSopenharmony_ci ASSERT_EQ(0, trackId); 191da853ecaSopenharmony_ci 192da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 193da853ecaSopenharmony_ci ASSERT_EQ(AV_ERR_OK, ret); 194da853ecaSopenharmony_ci 195da853ecaSopenharmony_ci OH_AVCodecBufferAttr info; 196da853ecaSopenharmony_ci info.pts = 0; 197da853ecaSopenharmony_ci 198da853ecaSopenharmony_ci for (int i = 0; i < FUZZ_TEST_NUM; i++) { 199da853ecaSopenharmony_ci cout << "current run time is: " << i << endl; 200da853ecaSopenharmony_ci int dataLen = rand() % 65536; 201da853ecaSopenharmony_ci OH_AVMemory* avMemBuffer = OH_AVMemory_Create(dataLen); 202da853ecaSopenharmony_ci 203da853ecaSopenharmony_ci cout << "data len is:" << dataLen << endl; 204da853ecaSopenharmony_ci 205da853ecaSopenharmony_ci info.pts += AUDIO_PTS_ADD; 206da853ecaSopenharmony_ci info.size = dataLen; 207da853ecaSopenharmony_ci info.offset = getIntRand(); 208da853ecaSopenharmony_ci info.flags = getIntRand(); 209da853ecaSopenharmony_ci 210da853ecaSopenharmony_ci cout << "info.pts is:" << info.pts << endl; 211da853ecaSopenharmony_ci cout << "info.size is:" << info.size << endl; 212da853ecaSopenharmony_ci cout << "info.offset is:" << info.offset << endl; 213da853ecaSopenharmony_ci cout << "info.flags is:" << info.flags << endl; 214da853ecaSopenharmony_ci 215da853ecaSopenharmony_ci ret = muxerDemo->NativeWriteSampleBuffer(handle, trackId, avMemBuffer, info); 216da853ecaSopenharmony_ci cout << "ret code is: " << ret << endl; 217da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 218da853ecaSopenharmony_ci } 219da853ecaSopenharmony_ci 220da853ecaSopenharmony_ci muxerDemo->NativeDestroy(handle); 221da853ecaSopenharmony_ci delete muxerDemo; 222da853ecaSopenharmony_ci} 223da853ecaSopenharmony_ci 224da853ecaSopenharmony_ci 225da853ecaSopenharmony_ci/** 226da853ecaSopenharmony_ci * @tc.number : SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_005 227da853ecaSopenharmony_ci * @tc.name : WriteSampleBuffer 228da853ecaSopenharmony_ci * @tc.desc : Fuzz test 229da853ecaSopenharmony_ci */ 230da853ecaSopenharmony_ciHWTEST_F(NativeAVMuxerFuzzTest, SUB_MULTIMEDIA_MEDIA_MUXER_FUZZ_005, TestSize.Level2) 231da853ecaSopenharmony_ci{ 232da853ecaSopenharmony_ci srand(time(nullptr) * 10); 233da853ecaSopenharmony_ci AVMuxerDemo* muxerDemo = new AVMuxerDemo(); 234da853ecaSopenharmony_ci 235da853ecaSopenharmony_ci OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4; 236da853ecaSopenharmony_ci int32_t fd = -1; 237da853ecaSopenharmony_ci OH_AVMuxer* handle; 238da853ecaSopenharmony_ci 239da853ecaSopenharmony_ci string test_key = ""; 240da853ecaSopenharmony_ci string test_value = ""; 241da853ecaSopenharmony_ci 242da853ecaSopenharmony_ci OH_AVFormat* trackFormat = OH_AVFormat_Create(); 243da853ecaSopenharmony_ci string mimeType[] = { 244da853ecaSopenharmony_ci "audio/mp4a-latm", "audio/mpeg", "video/avc", "video/mp4v-es","image/jpeg", "image/png", "image/bmp" 245da853ecaSopenharmony_ci }; 246da853ecaSopenharmony_ci 247da853ecaSopenharmony_ci int32_t trackId; 248da853ecaSopenharmony_ci OH_AVErrCode ret; 249da853ecaSopenharmony_ci 250da853ecaSopenharmony_ci OH_AVCodecBufferAttr info; 251da853ecaSopenharmony_ci info.pts = 0; 252da853ecaSopenharmony_ci 253da853ecaSopenharmony_ci for (int i = 0; i < FUZZ_TEST_NUM; i++) { 254da853ecaSopenharmony_ci cout << "current run time is: " << i << endl; 255da853ecaSopenharmony_ci // Create 256da853ecaSopenharmony_ci fd = rand(); 257da853ecaSopenharmony_ci format = OH_AVOutputFormat(rand() % 3); 258da853ecaSopenharmony_ci handle = muxerDemo->NativeCreate(fd, format); 259da853ecaSopenharmony_ci 260da853ecaSopenharmony_ci // SetRotation 261da853ecaSopenharmony_ci float rotation = getIntRand(); 262da853ecaSopenharmony_ci ret = muxerDemo->NativeSetRotation(handle, rotation); 263da853ecaSopenharmony_ci 264da853ecaSopenharmony_ci // AddTrack 265da853ecaSopenharmony_ci int typeIndex = rand() % 4; 266da853ecaSopenharmony_ci int audioChannels = getIntRand(); 267da853ecaSopenharmony_ci int audioSampleRate = getIntRand(); 268da853ecaSopenharmony_ci 269da853ecaSopenharmony_ci int videoWidth = getIntRand(); 270da853ecaSopenharmony_ci int videoHeight = getIntRand(); 271da853ecaSopenharmony_ci 272da853ecaSopenharmony_ci // audio config 273da853ecaSopenharmony_ci OH_AVFormat_SetStringValue(trackFormat, OH_MD_KEY_CODEC_MIME, mimeType[typeIndex].c_str()); 274da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_CHANNEL_COUNT, audioChannels); 275da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_AUD_SAMPLE_RATE, audioSampleRate); 276da853ecaSopenharmony_ci 277da853ecaSopenharmony_ci // video config 278da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_WIDTH, videoWidth); 279da853ecaSopenharmony_ci OH_AVFormat_SetIntValue(trackFormat, OH_MD_KEY_HEIGHT, videoHeight); 280da853ecaSopenharmony_ci 281da853ecaSopenharmony_ci ret = muxerDemo->NativeAddTrack(handle, &trackId, trackFormat); 282da853ecaSopenharmony_ci ret = muxerDemo->NativeStart(handle); 283da853ecaSopenharmony_ci 284da853ecaSopenharmony_ci int dataLen = rand() % 65536; 285da853ecaSopenharmony_ci OH_AVMemory* avMemBuffer = OH_AVMemory_Create(dataLen); 286da853ecaSopenharmony_ci 287da853ecaSopenharmony_ci info.pts += AUDIO_PTS_ADD; 288da853ecaSopenharmony_ci info.size = dataLen; 289da853ecaSopenharmony_ci info.offset = getIntRand(); 290da853ecaSopenharmony_ci info.flags = getIntRand(); 291da853ecaSopenharmony_ci 292da853ecaSopenharmony_ci ret = muxerDemo->NativeWriteSampleBuffer(handle, trackId, avMemBuffer, info); 293da853ecaSopenharmony_ci 294da853ecaSopenharmony_ci ret = muxerDemo->NativeStop(handle); 295da853ecaSopenharmony_ci 296da853ecaSopenharmony_ci ret = muxerDemo->NativeDestroy(handle); 297da853ecaSopenharmony_ci cout << "Destroy ret is:" << ret << endl; 298da853ecaSopenharmony_ci OH_AVMemory_Destroy(avMemBuffer); 299da853ecaSopenharmony_ci } 300da853ecaSopenharmony_ci 301da853ecaSopenharmony_ci delete muxerDemo; 302da853ecaSopenharmony_ci}