/* * 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 #include #include "gtest/gtest.h" #include "AudioEncoderDemoCommon.h" using namespace std; using namespace testing::ext; using namespace OHOS; using namespace OHOS::MediaAVCodec; namespace { class NativeFuzzTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); void SetUp() override; void TearDown() override; }; void NativeFuzzTest::SetUpTestCase() {} void NativeFuzzTest::TearDownTestCase() {} void NativeFuzzTest::SetUp() {} void NativeFuzzTest::TearDown() {} constexpr int FUZZ_TEST_NUM = 1000; std::atomic runningFlag = true; string rand_str(const int len) { string str; char c; int idx; constexpr uint32_t CONSTASNTS = 256; 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, OH_AVCodec* handle) { OH_AVCodecBufferAttr info; constexpr uint32_t INFO_SIZE = 100; info.size = INFO_SIZE; info.offset = 0; info.pts = 0; info.flags = AVCODEC_BUFFER_FLAGS_NONE; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is " << i << endl; int32_t inputIndex = encoderDemo->NativeGetInputIndex(); uint8_t* data = encoderDemo->NativeGetInputBuf(); uint8_t* inputData = (uint8_t*)malloc(info.size); if (inputData == nullptr) { cout << "null pointer" << endl; return; } memcpy_s(data, info.size, inputData, info.size); cout << "index is: " << inputIndex << endl; OH_AVErrCode ret = encoderDemo->NativePushInputData(handle, inputIndex, info); cout << "PushInputData return: " << ret << endl; free(inputData); } runningFlag.store(false); } void outputFunc(AudioEncoderDemo* encoderDemo, OH_AVCodec* handle) { while (runningFlag.load()) { int32_t outputIndex = encoderDemo->NativeGetOutputIndex(); OH_AVErrCode ret = encoderDemo->NativeFreeOutputData(handle, outputIndex); cout << "FreeOutputData return: " << ret << endl; } } } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_001 * @tc.name : OH_AudioEncoder_CreateByMime * @tc.desc : Fuzz test */ HWTEST_F(NativeFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_001, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); OH_AVCodec* handle = nullptr; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; int32_t strLen = rand() % 1000; string randStr = rand_str(strLen); handle = encoderDemo->NativeCreateByMime(randStr.c_str()); if (handle != nullptr) { encoderDemo->NativeDestroy(handle); handle = nullptr; } } delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_002 * @tc.name : OH_AudioEncoder_CreateByName * @tc.desc : Fuzz test */ HWTEST_F(NativeFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_002, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); OH_AVCodec* handle = nullptr; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; int32_t strLen = rand() % 1000; string randStr = rand_str(strLen); handle = encoderDemo->NativeCreateByName(randStr.c_str()); if (handle != nullptr) { encoderDemo->NativeDestroy(handle); handle = nullptr; } } delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_003 * @tc.name : OH_AudioEncoder_Configure * @tc.desc : Fuzz test */ HWTEST_F(NativeFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_003, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); OH_AVCodec* handle = encoderDemo->NativeCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); struct OH_AVCodecAsyncCallback cb = { &OnError, &OnOutputFormatChanged, &OnInputBufferAvailable, &OnOutputBufferAvailable }; encoderDemo->NativeSetCallback(handle, cb); for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; int32_t channel = getIntRand(); int32_t sampleRate = getIntRand(); int32_t codedSample = getIntRand(); int32_t bitrate = getIntRand(); int32_t layout = getIntRand(); OH_AVFormat* format = OH_AVFormat_Create(); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, channel); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, sampleRate); OH_AVFormat_SetIntValue(format, OH_MD_KEY_BITS_PER_CODED_SAMPLE, codedSample); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, codedSample); OH_AVFormat_SetLongValue(format, OH_MD_KEY_CHANNEL_LAYOUT, layout); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AAC_IS_ADTS, 1); OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, bitrate); cout << "OH_MD_KEY_AUD_CHANNEL_COUNT is: " << channel << ", OH_MD_KEY_AUD_SAMPLE_RATE is: " << sampleRate << endl; cout << "bits_per_coded_sample is: " << codedSample << ", OH_MD_KEY_BITRATE is: " << bitrate << endl; OH_AVErrCode ret = encoderDemo->NativeConfigure(handle, format); cout << "Configure return: " << ret << endl; encoderDemo->NativeReset(handle); OH_AVFormat_Destroy(format); } encoderDemo->NativeDestroy(handle); delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_004 * @tc.name : OH_AudioEncoder_SetParameter * @tc.desc : Fuzz test */ HWTEST_F(NativeFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_004, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); OH_AVCodec* handle = encoderDemo->NativeCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); struct OH_AVCodecAsyncCallback cb = { &OnError, &OnOutputFormatChanged, &OnInputBufferAvailable, &OnOutputBufferAvailable}; encoderDemo->NativeSetCallback(handle, cb); OH_AVFormat* format = OH_AVFormat_Create(); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, 2); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, 44100); OH_AVFormat_SetIntValue(format, OH_MD_KEY_BITS_PER_CODED_SAMPLE, OH_BitsPerSample::SAMPLE_F32P); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, OH_BitsPerSample::SAMPLE_F32P); OH_AVFormat_SetLongValue(format, OH_MD_KEY_CHANNEL_LAYOUT, STEREO); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AAC_IS_ADTS, 1); OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 169000); OH_AVErrCode ret = encoderDemo->NativeConfigure(handle, format); cout << "Configure return: " << ret << endl; OH_AVFormat_Destroy(format); ret = encoderDemo->NativePrepare(handle); cout << "Prepare return: " << ret << endl; ret = encoderDemo->NativeStart(handle); cout << "Start return: " << ret << endl; for (int i = 0; i < FUZZ_TEST_NUM; i++) { cout << "current run time is: " << i << endl; int32_t channel = getIntRand(); int32_t sampleRate = getIntRand(); int32_t codedSample = getIntRand(); int32_t bitrate = getIntRand(); int32_t layout = getIntRand(); format = OH_AVFormat_Create(); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, channel); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, sampleRate); OH_AVFormat_SetIntValue(format, OH_MD_KEY_BITS_PER_CODED_SAMPLE, codedSample); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, codedSample); OH_AVFormat_SetLongValue(format, OH_MD_KEY_CHANNEL_LAYOUT, layout); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AAC_IS_ADTS, 1); OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, bitrate); cout << "OH_MD_KEY_AUD_CHANNEL_COUNT is: " << channel << ", OH_MD_KEY_AUD_SAMPLE_RATE is: " << sampleRate << endl; cout << "bits_per_coded_sample is: " << codedSample << ", OH_MD_KEY_BITRATE is: " << bitrate << endl; ret = encoderDemo->NativeSetParameter(handle, format); cout << "SetParameter return: " << ret << endl; OH_AVFormat_Destroy(format); } encoderDemo->NativeDestroy(handle); delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_005 * @tc.name : OH_AudioEncoder_PushInputData * @tc.desc : Fuzz test */ HWTEST_F(NativeFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_005, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); OH_AVCodec* handle = encoderDemo->NativeCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); struct OH_AVCodecAsyncCallback cb = { &OnError, &OnOutputFormatChanged, &OnInputBufferAvailable, &OnOutputBufferAvailable}; encoderDemo->NativeSetCallback(handle, cb); OH_AVFormat* format = OH_AVFormat_Create(); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, 2); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, 44100); OH_AVFormat_SetIntValue(format, OH_MD_KEY_BITS_PER_CODED_SAMPLE, OH_BitsPerSample::SAMPLE_F32P); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, OH_BitsPerSample::SAMPLE_F32P); OH_AVFormat_SetLongValue(format, OH_MD_KEY_CHANNEL_LAYOUT, STEREO); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AAC_IS_ADTS, 1); OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 169000); OH_AVErrCode ret = encoderDemo->NativeConfigure(handle, format); cout << "Configure return: " << ret << endl; OH_AVFormat_Destroy(format); ret = encoderDemo->NativePrepare(handle); cout << "Prepare return: " << ret << endl; ret = encoderDemo->NativeStart(handle); cout << "Start return: " << ret << endl; for (int i = 0; i < FUZZ_TEST_NUM; i++) { int32_t index = getIntRand(); OH_AVCodecBufferAttr info; info.size = getIntRand(); info.offset = getIntRand(); info.pts = getIntRand(); info.flags = getIntRand(); cout << "index is: " << index << ", info.size is: " << info.size << endl; cout << "info.offset is: " << info.offset << ", info.pts is: " << info.pts << endl; cout << "info.flags is: " << info.flags << endl; ret = encoderDemo->NativePushInputData(handle, index, info); cout << "PushInputData return: " << ret << endl; } encoderDemo->NativeDestroy(handle); delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_006 * @tc.name : OH_AudioEncoder_FreeOutputData * @tc.desc : Fuzz test */ HWTEST_F(NativeFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_006, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); OH_AVCodec* handle = encoderDemo->NativeCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); struct OH_AVCodecAsyncCallback cb = { &OnError, &OnOutputFormatChanged, &OnInputBufferAvailable, &OnOutputBufferAvailable}; encoderDemo->NativeSetCallback(handle, cb); OH_AVFormat* format = OH_AVFormat_Create(); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, 2); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, 44100); OH_AVFormat_SetIntValue(format, OH_MD_KEY_BITS_PER_CODED_SAMPLE, OH_BitsPerSample::SAMPLE_F32P); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, OH_BitsPerSample::SAMPLE_F32P); OH_AVFormat_SetLongValue(format, OH_MD_KEY_CHANNEL_LAYOUT, STEREO); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AAC_IS_ADTS, 1); OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 169000); OH_AVErrCode ret = encoderDemo->NativeConfigure(handle, format); cout << "Configure return: " << ret << endl; OH_AVFormat_Destroy(format); ret = encoderDemo->NativePrepare(handle); cout << "Prepare return: " << ret << endl; ret = encoderDemo->NativeStart(handle); cout << "Start return: " << ret << endl; OH_AVCodecBufferAttr info; constexpr uint32_t INFO_SIZE = 100; info.size = INFO_SIZE; info.offset = 0; info.pts = 0; info.flags = AVCODEC_BUFFER_FLAGS_NONE; int32_t inputIndex = encoderDemo->NativeGetInputIndex(); for (int i = 0; i < FUZZ_TEST_NUM; i++) { int32_t outputIndex = getIntRand(); cout << "index is: " << outputIndex << endl; ret = encoderDemo->NativePushInputData(handle, inputIndex, info); cout << "PushInputData return: " << ret << endl; ret = encoderDemo->NativeFreeOutputData(handle, outputIndex); cout << "FreeOutputData return: " << ret << endl; } encoderDemo->NativeDestroy(handle); delete encoderDemo; } /** * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_007 * @tc.name : input file fuzz * @tc.desc : Fuzz test */ HWTEST_F(NativeFuzzTest, SUB_MULTIMEDIA_AUDIO_ENCODER_FUZZ_007, TestSize.Level2) { srand(time(nullptr) * 10); AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); OH_AVCodec* handle = encoderDemo->NativeCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); struct OH_AVCodecAsyncCallback cb = { &OnError, &OnOutputFormatChanged, &OnInputBufferAvailable, &OnOutputBufferAvailable}; encoderDemo->NativeSetCallback(handle, cb); OH_AVFormat* format = OH_AVFormat_Create(); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_CHANNEL_COUNT, 2); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUD_SAMPLE_RATE, 44100); OH_AVFormat_SetIntValue(format, OH_MD_KEY_BITS_PER_CODED_SAMPLE, OH_BitsPerSample::SAMPLE_F32P); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AUDIO_SAMPLE_FORMAT, OH_BitsPerSample::SAMPLE_F32P); OH_AVFormat_SetLongValue(format, OH_MD_KEY_CHANNEL_LAYOUT, STEREO); OH_AVFormat_SetIntValue(format, OH_MD_KEY_AAC_IS_ADTS, 1); OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 169000); OH_AVErrCode ret = encoderDemo->NativeConfigure(handle, format); cout << "Configure return: " << ret << endl; OH_AVFormat_Destroy(format); ret = encoderDemo->NativePrepare(handle); cout << "Prepare return: " << ret << endl; ret = encoderDemo->NativeStart(handle); cout << "Start return: " << ret << endl; vector threadVec; threadVec.push_back(thread(inputFunc, encoderDemo, handle)); threadVec.push_back(thread(outputFunc, encoderDemo, handle)); for (uint32_t i = 0; i < threadVec.size(); i++) { threadVec[i].join(); } encoderDemo->NativeDestroy(handle); delete encoderDemo; }