/* * Copyright (C) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "gtest/gtest.h" #include "AudioEncoderDemoCommon.h" #include "avcodec_info.h" #include "avcodec_errors.h" #include "avcodec_audio_common.h" using namespace std; using namespace testing::ext; using namespace OHOS; using namespace OHOS::MediaAVCodec; constexpr uint32_t SIZE_NUM = 100; namespace { class InnerFuzzTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); void SetUp() override; void TearDown() override; }; void InnerFuzzTest::SetUpTestCase() {} void InnerFuzzTest::TearDownTestCase() {} void InnerFuzzTest::SetUp() {} void InnerFuzzTest::TearDown() {} constexpr uint32_t FUZZ_TEST_NUM = 1000000; constexpr uint32_t CONSTASNTS = 256; std::atomic runningFlag = true; string getRandStr(const int len) { string str; char c; int idx; for (idx = 0; idx < len; idx++) { c = rand() % CONSTASNTS; str.push_back(c); } return str; } int32_t getIntRand() { int32_t data = -10000 + rand() % 20001; return data; } void inputFunc(AudioEncoderDemo* encoderDemo) { AVCodecBufferInfo info; AVCodecBufferFlag flag; info.size = SIZE_NUM; info.offset = 0; info.presentationTimeUs = 0; flag = AVCODEC_BUFFER_FLAG_NONE; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is " << i << endl; std::shared_ptr signal_ = encoderDemo->getSignal(); int index = signal_->inQueue_.front(); std::shared_ptr buffer = signal_->inInnerBufQueue_.front(); uint8_t* inputData = (uint8_t*)malloc(info.size); if (inputData == nullptr) { cout << "malloc failed" << endl; return; } (void)memset_s(inputData, info.size, 0, info.size); memcpy_s(buffer->GetBase(), info.size, inputData, info.size); cout << "index is: " << index << endl; int32_t ret = encoderDemo->InnerQueueInputBuffer(index, info, flag); ASSERT_EQ(AVCS_ERR_OK, ret); cout << "InnerQueueInputBuffer return: " << ret << endl; } runningFlag.store(false); } void outputFunc(AudioEncoderDemo* encoderDemo) { while (runningFlag.load()) { std::shared_ptr signal_ = encoderDemo->getSignal(); int index = signal_->outQueue_.front(); int32_t ret = encoderDemo->InnerReleaseOutputBuffer(index); cout << "InnerReleaseOutputBuffer return: " << ret << endl; } } } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_001 * @tc.name : InnerCreateByMime * @tc.desc : Fuzz test */ HWTEST_F(InnerFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_001, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); ASSERT_NE(nullptr, encoderDemo); for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; int32_t strLen = rand() % 1000; string randStr = getRandStr(strLen); encoderDemo->InnerCreateByMime(randStr.c_str()); encoderDemo->InnerDestroy(); } delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_002 * @tc.name : InnerCreateByName * @tc.desc : Fuzz test */ HWTEST_F(InnerFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_002, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); ASSERT_NE(nullptr, encoderDemo); int strLen = 0; string test_value = ""; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; strLen = rand() % 65536; test_value = getRandStr(strLen); encoderDemo->InnerCreateByName(test_value.c_str()); encoderDemo->InnerDestroy(); } delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_003 * @tc.name : InnerConfigure * @tc.desc : Fuzz test */ HWTEST_F(InnerFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_003, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); ASSERT_NE(nullptr, encoderDemo); encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); Format format; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; int32_t bitRate = getIntRand(); int32_t audioChannels = getIntRand(); int32_t audioSampleRate = getIntRand(); int32_t audioSampleKey = getIntRand(); int32_t audioSampleFormat = getIntRand(); int32_t audioChannelLayout = getIntRand(); cout << "BIT_RATE is: " << bitRate << endl; cout << ", AUDIO_CHANNELS len is: " << audioChannels << endl; cout << ", SAMPLE_RATE len is: " << audioSampleRate << endl; format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, audioChannels); format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, audioSampleRate); format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, bitRate); format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, audioSampleKey); format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, audioSampleFormat); format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, audioChannelLayout); encoderDemo->InnerConfigure(format); encoderDemo->InnerReset(); } encoderDemo->InnerDestroy(); delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_004 * @tc.name : InnerSetParameter * @tc.desc : Fuzz test */ HWTEST_F(InnerFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_004, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); ASSERT_NE(nullptr, encoderDemo); encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); Format format; int32_t ret; format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); std::shared_ptr signal_ = encoderDemo->getSignal(); std::shared_ptr cb_ = make_unique(signal_); ret = encoderDemo->InnerSetCallback(cb_); cout << "SetCallback ret is: " << ret << endl; ret = encoderDemo->InnerConfigure(format); cout << "Configure return: " << ret << endl; ret = encoderDemo->InnerPrepare(); cout << "Prepare return: " << ret << endl; ret = encoderDemo->InnerStart(); cout << "Start return: " << ret << endl; for (int i = 0; i < FUZZ_TEST_NUM; i++) { Format generalFormat; cout << "current run time is: " << i << endl; int32_t bitRate = getIntRand(); int32_t audioChannels = getIntRand(); int32_t audioSampleRate = getIntRand(); int32_t audioSampleKey = getIntRand(); int32_t audioSampleFormat = getIntRand(); int32_t audioChannelLayout = getIntRand(); cout << "BIT_RATE is: " << bitRate << endl; cout << ", AUDIO_CHANNELS len is: " << audioChannels << endl; cout << ", SAMPLE_RATE len is: " << audioSampleRate << endl; generalFormat.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, audioChannels); generalFormat.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, audioSampleRate); generalFormat.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, bitRate); generalFormat.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, audioSampleKey); generalFormat.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, audioSampleFormat); generalFormat.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, audioChannelLayout); ret = encoderDemo->InnerSetParameter(generalFormat); cout << "ret code is: " << ret << endl; } encoderDemo->InnerDestroy(); delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_005 * @tc.name : InnerQueueInputBuffer * @tc.desc : Fuzz test */ HWTEST_F(InnerFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_005, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); ASSERT_NE(nullptr, encoderDemo); encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); Format format; format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); int32_t ret; int index = 0; std::shared_ptr signal_ = encoderDemo->getSignal(); std::shared_ptr cb_ = make_unique(signal_); ret = encoderDemo->InnerSetCallback(cb_); cout << "SetCallback ret is: " << ret << endl; ret = encoderDemo->InnerConfigure(format); cout << "Configure ret is: " << ret << endl; ASSERT_EQ(AVCS_ERR_OK, ret); ret = encoderDemo->InnerPrepare(); ASSERT_EQ(AVCS_ERR_OK, ret); ret = encoderDemo->InnerStart(); ASSERT_EQ(AVCS_ERR_OK, ret); AVCodecBufferInfo info; AVCodecBufferFlag flag; info.presentationTimeUs = 0; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; index = getIntRand(); int dataLen = rand() % 65536; info.presentationTimeUs += 21; info.size = dataLen; info.offset = getIntRand(); flag = AVCODEC_BUFFER_FLAG_NONE; cout << "info.presentationTimeUs is:" << info.presentationTimeUs << endl; cout << "info.size is:" << info.size << endl; cout << "info.offset is:" << info.offset << endl; cout << "flag is:" << flag << endl; ret = encoderDemo->InnerQueueInputBuffer(index, info, flag); cout << "ret code is: " << ret << endl; } encoderDemo->InnerDestroy(); delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_006 * @tc.name : InnerGetOutputFormat * @tc.desc : Fuzz test */ HWTEST_F(InnerFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_006, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); ASSERT_NE(nullptr, encoderDemo); encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); Format format; format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); int32_t ret; std::shared_ptr signal_ = encoderDemo->getSignal(); std::shared_ptr cb_ = make_unique(signal_); ret = encoderDemo->InnerSetCallback(cb_); cout << "SetCallback ret is: " << ret << endl; ret = encoderDemo->InnerConfigure(format); cout << "Configure ret is: " << ret << endl; ASSERT_EQ(AVCS_ERR_OK, ret); ret = encoderDemo->InnerPrepare(); ASSERT_EQ(AVCS_ERR_OK, ret); ret = encoderDemo->InnerStart(); ASSERT_EQ(AVCS_ERR_OK, ret); int strLen = 0; string test_key = ""; string test_value = ""; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; strLen = rand() % 65536; test_key = getRandStr(strLen); cout << "test key len is:" << strLen << endl; strLen = rand() % 65536; test_value = getRandStr(strLen); cout << "test value len is:" << strLen << endl; format.PutStringValue(test_key.c_str(), test_value.c_str()); ret = encoderDemo->InnerGetOutputFormat(format); cout << "ret code is: " << ret << endl; } encoderDemo->InnerDestroy(); delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_007 * @tc.name : input file fuzz * @tc.desc : Fuzz test */ HWTEST_F(InnerFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_007, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); int32_t ret = encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); ASSERT_EQ(AVCS_ERR_OK, ret); Format format; format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); std::shared_ptr signal = encoderDemo->getSignal(); std::shared_ptr cb_ = make_unique(signal); ret = encoderDemo->InnerSetCallback(cb_); cout << "SetCallback ret is: " << ret << endl; ret = encoderDemo->InnerConfigure(format); cout << "Configure ret is: " << ret << endl; ASSERT_EQ(AVCS_ERR_OK, ret); ret = encoderDemo->InnerPrepare(); ASSERT_EQ(AVCS_ERR_OK, ret); ret = encoderDemo->InnerStart(); ASSERT_EQ(AVCS_ERR_OK, ret); vector threadVec; threadVec.push_back(thread(inputFunc, encoderDemo)); threadVec.push_back(thread(outputFunc, encoderDemo)); for (uint32_t i = 0; i < threadVec.size(); i++) { threadVec[i].join(); } encoderDemo->InnerDestroy(); delete encoderDemo; }