1 /* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <string> 17 #include <iostream> 18 #include <thread> 19 #include <vector> 20 #include <ctime> 21 #include "gtest/gtest.h" 22 #include "AudioEncoderDemoCommon.h" 23 #include "fcntl.h" 24 #include "media_description.h" 25 #include "avcodec_info.h" 26 #include "avcodec_errors.h" 27 #include "av_common.h" 28 #include "meta/format.h" 29 #include "avcodec_audio_common.h" 30 31 using namespace std; 32 using namespace testing::ext; 33 using namespace OHOS; 34 using namespace OHOS::MediaAVCodec; 35 36 namespace { 37 class InnerStablityTest : public testing::Test { 38 public: 39 static void SetUpTestCase(); 40 static void TearDownTestCase(); 41 void SetUp() override; 42 void TearDown() override; 43 }; 44 SetUpTestCase()45 void InnerStablityTest::SetUpTestCase() {} TearDownTestCase()46 void InnerStablityTest::TearDownTestCase() {} SetUp()47 void InnerStablityTest::SetUp() {} TearDown()48 void InnerStablityTest::TearDown() {} 49 constexpr int RUN_TIMES = 100000; 50 constexpr int RUN_TIME = 12 * 3600; 51 string inputFilePath = "/data/audioIn.mp3"; 52 string outputFilePath = "/data/audioOut.pcm"; 53 } 54 55 /** 56 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_001 57 * @tc.name : InnerCreateByMime(1000 times) 58 * @tc.desc : Stability test 59 */ 60 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_001, TestSize.Level2) 61 { 62 srand(time(nullptr) * 10); 63 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 64 ASSERT_NE(nullptr, encoderDemo); 65 string mimeType[] = { "audio/mp4a-latm", "audio/flac" }; 66 67 for (int i = 0; i < RUN_TIMES; i++) 68 { 69 int typeIndex = rand() % 4; 70 encoderDemo->InnerCreateByMime(mimeType[typeIndex].c_str()); 71 cout << "run time is: " << i << endl; 72 encoderDemo->InnerDestroy(); 73 } 74 75 delete encoderDemo; 76 } 77 78 /** 79 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_002 80 * @tc.name : InnerCreateByName(1000 times) 81 * @tc.desc : Stability test 82 */ 83 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_002, TestSize.Level2) 84 { 85 srand(time(nullptr) * 10); 86 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 87 ASSERT_NE(nullptr, encoderDemo); 88 for (int i = 0; i < RUN_TIMES; i++) 89 { 90 encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); 91 cout << "run time is: " << i << endl; 92 encoderDemo->InnerDestroy(); 93 } 94 delete encoderDemo; 95 } 96 97 /** 98 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_003 99 * @tc.name : InnerPrepare(1000 times) 100 * @tc.desc : Stability test 101 */ 102 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_003, TestSize.Level2) 103 { 104 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 105 encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); 106 ASSERT_NE(nullptr, encoderDemo); 107 Format format; 108 109 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); 110 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 111 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 112 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); 113 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); 114 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); 115 116 encoderDemo->InnerConfigure(format); 117 118 for (int i = 0; i < RUN_TIMES; i++) 119 { 120 int32_t ret = encoderDemo->InnerPrepare(); 121 cout << "run time is: " << i << ", ret is:" << ret << endl; 122 } 123 124 encoderDemo->InnerDestroy(); 125 126 delete encoderDemo; 127 } 128 129 130 /** 131 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_004 132 * @tc.name : InnerStart(1000 times) 133 * @tc.desc : Stability test 134 */ 135 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_004, TestSize.Level2) 136 { 137 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 138 encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); 139 ASSERT_NE(nullptr, encoderDemo); 140 Format format; 141 142 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); 143 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 144 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 145 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); 146 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); 147 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); 148 149 std::shared_ptr<AEncSignal> signal_ = encoderDemo->getSignal(); 150 std::shared_ptr<InnerAEnDemoCallback> cb_ = make_unique<InnerAEnDemoCallback>(signal_); 151 int32_t ret = encoderDemo->InnerSetCallback(cb_); 152 153 encoderDemo->InnerConfigure(format); 154 encoderDemo->InnerPrepare(); 155 156 for (int i = 0; i < RUN_TIMES; i++) 157 { 158 ret = encoderDemo->InnerStart(); 159 cout << "run time is: " << i << ", ret is:" << ret << endl; 160 } 161 162 encoderDemo->InnerDestroy(); 163 164 delete encoderDemo; 165 } 166 167 /** 168 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_005 169 * @tc.name : InnerStop(1000 times) 170 * @tc.desc : Stability test 171 */ 172 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_005, TestSize.Level2) 173 { 174 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 175 encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); 176 ASSERT_NE(nullptr, encoderDemo); 177 Format format; 178 179 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); 180 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 181 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 182 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); 183 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); 184 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); 185 186 std::shared_ptr<AEncSignal> signal_ = encoderDemo->getSignal(); 187 std::shared_ptr<InnerAEnDemoCallback> cb_ = make_unique<InnerAEnDemoCallback>(signal_); 188 int32_t ret = encoderDemo->InnerSetCallback(cb_); 189 190 encoderDemo->InnerConfigure(format); 191 encoderDemo->InnerPrepare(); 192 encoderDemo->InnerStart(); 193 194 for (int i = 0; i < RUN_TIMES; i++) 195 { 196 ret = encoderDemo->InnerStop(); 197 cout << "run time is: " << i << ", ret is:" << ret << endl; 198 } 199 200 encoderDemo->InnerDestroy(); 201 202 delete encoderDemo; 203 } 204 205 206 /** 207 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_006 208 * @tc.name : InnerDestroy(1000 times) 209 * @tc.desc : Stability test 210 */ 211 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_006, TestSize.Level2) 212 { 213 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 214 encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); 215 ASSERT_NE(nullptr, encoderDemo); 216 Format format; 217 218 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); 219 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 220 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 221 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); 222 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); 223 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); 224 225 std::shared_ptr<AEncSignal> signal_ = encoderDemo->getSignal(); 226 std::shared_ptr<InnerAEnDemoCallback> cb_ = make_unique<InnerAEnDemoCallback>(signal_); 227 int32_t ret = encoderDemo->InnerSetCallback(cb_); 228 229 encoderDemo->InnerConfigure(format); 230 encoderDemo->InnerPrepare(); 231 encoderDemo->InnerStart(); 232 encoderDemo->InnerStop(); 233 234 for (int i = 0; i < RUN_TIMES; i++) 235 { 236 ret = encoderDemo->InnerDestroy(); 237 cout << "run time is: " << i << ", ret is:" << ret << endl; 238 } 239 240 delete encoderDemo; 241 } 242 243 /** 244 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_007 245 * @tc.name : InnerReset(1000 times) 246 * @tc.desc : Stability test 247 */ 248 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_007, TestSize.Level2) 249 { 250 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 251 encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); 252 ASSERT_NE(nullptr, encoderDemo); 253 Format format; 254 255 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); 256 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 257 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 258 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); 259 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); 260 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); 261 262 std::shared_ptr<AEncSignal> signal_ = encoderDemo->getSignal(); 263 std::shared_ptr<InnerAEnDemoCallback> cb_ = make_unique<InnerAEnDemoCallback>(signal_); 264 int32_t ret = encoderDemo->InnerSetCallback(cb_); 265 266 encoderDemo->InnerConfigure(format); 267 encoderDemo->InnerPrepare(); 268 encoderDemo->InnerStart(); 269 270 for (int i = 0; i < RUN_TIMES; i++) 271 { 272 ret = encoderDemo->InnerReset(); 273 cout << "run time is: " << i << ", ret is:" << ret << endl; 274 } 275 encoderDemo->InnerDestroy(); 276 delete encoderDemo; 277 } 278 279 /** 280 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_008 281 * @tc.name : InnerFlush(1000 times) 282 * @tc.desc : Stability test 283 */ 284 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_008, TestSize.Level2) 285 { 286 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 287 encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); 288 ASSERT_NE(nullptr, encoderDemo); 289 Format format; 290 291 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); 292 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 293 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 294 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); 295 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); 296 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); 297 298 std::shared_ptr<AEncSignal> signal_ = encoderDemo->getSignal(); 299 std::shared_ptr<InnerAEnDemoCallback> cb_ = make_unique<InnerAEnDemoCallback>(signal_); 300 int32_t ret = encoderDemo->InnerSetCallback(cb_); 301 302 encoderDemo->InnerConfigure(format); 303 encoderDemo->InnerPrepare(); 304 encoderDemo->InnerStart(); 305 306 for (int i = 0; i < RUN_TIMES; i++) 307 { 308 ret = encoderDemo->InnerFlush(); 309 cout << "run time is: " << i << ", ret is:" << ret << endl; 310 } 311 encoderDemo->InnerDestroy(); 312 delete encoderDemo; 313 } 314 315 /** 316 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_009 317 * @tc.name : InnerRelease(1000 times) 318 * @tc.desc : Stability test 319 */ 320 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_009, TestSize.Level2) 321 { 322 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 323 encoderDemo->InnerCreateByName("OH.Media.Codec.Encoder.Audio.AAC"); 324 ASSERT_NE(nullptr, encoderDemo); 325 Format format; 326 327 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); 328 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 329 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 330 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); 331 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); 332 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); 333 334 std::shared_ptr<AEncSignal> signal_ = encoderDemo->getSignal(); 335 std::shared_ptr<InnerAEnDemoCallback> cb_ = make_unique<InnerAEnDemoCallback>(signal_); 336 int32_t ret = encoderDemo->InnerSetCallback(cb_); 337 338 encoderDemo->InnerConfigure(format); 339 encoderDemo->InnerPrepare(); 340 encoderDemo->InnerStart(); 341 342 for (int i = 0; i < RUN_TIMES; i++) 343 { 344 ret = encoderDemo->InnerRelease(); 345 cout << "run time is: " << i << ", ret is:" << ret << endl; 346 } 347 encoderDemo->InnerDestroy(); 348 delete encoderDemo; 349 } 350 351 /** 352 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_010 353 * @tc.name : aac(long time) 354 * @tc.desc : Function test 355 */ 356 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_010, TestSize.Level2) 357 { 358 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 359 time_t startTime = time(nullptr); 360 ASSERT_NE(startTime, -1); 361 time_t curTime = startTime; 362 363 while (difftime(curTime, startTime) < RUN_TIME) 364 { 365 cout << "run time: " << difftime(curTime, startTime) << " seconds" << endl; 366 inputFilePath = "f32le_44100_1_dayuhaitang.pcm"; 367 outputFilePath = "FUNCTION_010_stability.aac"; 368 369 Format format; 370 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 1); 371 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 372 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 373 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_F32LE); 374 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_F32LE); 375 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, MONO); 376 format.PutIntValue(MediaDescriptionKey::MD_KEY_AAC_IS_ADTS, 1); 377 378 encoderDemo->InnerRunCase(inputFilePath, outputFilePath, "OH.Media.Codec.Encoder.Audio.AAC", format); 379 curTime = time(nullptr); 380 ASSERT_NE(curTime, -1); 381 } 382 delete encoderDemo; 383 } 384 385 /** 386 * @tc.number : SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_011 387 * @tc.name : flac(long time) 388 * @tc.desc : Function test 389 */ 390 HWTEST_F(InnerStablityTest, SUB_MULTIMEDIA_AUDIO_ENCODER_STABILITY_011, TestSize.Level2) 391 { 392 AudioEncoderDemo* encoderDemo = new AudioEncoderDemo(); 393 time_t startTime = time(nullptr); 394 ASSERT_NE(startTime, -1); 395 time_t curTime = startTime; 396 397 while (difftime(curTime, startTime) < RUN_TIME) 398 { 399 cout << "run time: " << difftime(curTime, startTime) << " seconds" << endl; 400 inputFilePath = "s16_44100_2_dayuhaitang.pcm"; 401 outputFilePath = "FUNCTION_011_stability.flac"; 402 403 Format format; 404 format.PutIntValue(MediaDescriptionKey::MD_KEY_CHANNEL_COUNT, 2); 405 format.PutIntValue(MediaDescriptionKey::MD_KEY_SAMPLE_RATE, 44100); 406 format.PutLongValue(MediaDescriptionKey::MD_KEY_BITRATE, 112000); 407 format.PutIntValue(MediaDescriptionKey::MD_KEY_BITS_PER_CODED_SAMPLE, AudioSampleFormat::SAMPLE_S32LE); 408 format.PutIntValue(MediaDescriptionKey::MD_KEY_AUDIO_SAMPLE_FORMAT, AudioSampleFormat::SAMPLE_S32LE); 409 format.PutLongValue(MediaDescriptionKey::MD_KEY_CHANNEL_LAYOUT, STEREO); 410 format.PutIntValue(MediaDescriptionKey::MD_KEY_COMPLIANCE_LEVEL, -2); 411 encoderDemo->InnerRunCase(inputFilePath, outputFilePath, "OH.Media.Codec.Encoder.Audio.Flac", format); 412 curTime = time(nullptr); 413 ASSERT_NE(curTime, -1); 414 } 415 delete encoderDemo; 416 } 417