1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #include <string> 11 12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "webrtc/base/checks.h" 14 #include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h" 15 #include "webrtc/modules/audio_coding/codecs/opus/opus_inst.h" 16 #include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h" 17 #include "webrtc/test/testsupport/fileutils.h" 18 19 namespace webrtc { 20 21 using test::AudioLoop; 22 using ::testing::TestWithParam; 23 using ::testing::Values; 24 using ::testing::Combine; 25 26 // Maximum number of bytes in output bitstream. 27 const size_t kMaxBytes = 1000; 28 // Sample rate of Opus. 29 const size_t kOpusRateKhz = 48; 30 // Number of samples-per-channel in a 20 ms frame, sampled at 48 kHz. 31 const size_t kOpus20msFrameSamples = kOpusRateKhz * 20; 32 // Number of samples-per-channel in a 10 ms frame, sampled at 48 kHz. 33 const size_t kOpus10msFrameSamples = kOpusRateKhz * 10; 34 35 class OpusTest : public TestWithParam<::testing::tuple<int, int>> { 36 protected: 37 OpusTest(); 38 39 void TestDtxEffect(bool dtx, int block_length_ms); 40 41 // Prepare |speech_data_| for encoding, read from a hard-coded file. 42 // After preparation, |speech_data_.GetNextBlock()| returns a pointer to a 43 // block of |block_length_ms| milliseconds. The data is looped every 44 // |loop_length_ms| milliseconds. 45 void PrepareSpeechData(size_t channel, 46 int block_length_ms, 47 int loop_length_ms); 48 49 int EncodeDecode(WebRtcOpusEncInst* encoder, 50 rtc::ArrayView<const int16_t> input_audio, 51 WebRtcOpusDecInst* decoder, 52 int16_t* output_audio, 53 int16_t* audio_type); 54 55 void SetMaxPlaybackRate(WebRtcOpusEncInst* encoder, 56 opus_int32 expect, int32_t set); 57 58 void CheckAudioBounded(const int16_t* audio, size_t samples, size_t channels, 59 uint16_t bound) const; 60 61 WebRtcOpusEncInst* opus_encoder_; 62 WebRtcOpusDecInst* opus_decoder_; 63 64 AudioLoop speech_data_; 65 uint8_t bitstream_[kMaxBytes]; 66 size_t encoded_bytes_; 67 size_t channels_; 68 int application_; 69 }; 70 71 OpusTest::OpusTest() 72 : opus_encoder_(NULL), 73 opus_decoder_(NULL), 74 encoded_bytes_(0), 75 channels_(static_cast<size_t>(::testing::get<0>(GetParam()))), 76 application_(::testing::get<1>(GetParam())) { 77 } 78 79 void OpusTest::PrepareSpeechData(size_t channel, int block_length_ms, 80 int loop_length_ms) { 81 const std::string file_name = 82 webrtc::test::ResourcePath((channel == 1) ? 83 "audio_coding/testfile32kHz" : 84 "audio_coding/teststereo32kHz", "pcm"); 85 if (loop_length_ms < block_length_ms) { 86 loop_length_ms = block_length_ms; 87 } 88 EXPECT_TRUE(speech_data_.Init(file_name, 89 loop_length_ms * kOpusRateKhz * channel, 90 block_length_ms * kOpusRateKhz * channel)); 91 } 92 93 void OpusTest::SetMaxPlaybackRate(WebRtcOpusEncInst* encoder, 94 opus_int32 expect, 95 int32_t set) { 96 opus_int32 bandwidth; 97 EXPECT_EQ(0, WebRtcOpus_SetMaxPlaybackRate(opus_encoder_, set)); 98 opus_encoder_ctl(opus_encoder_->encoder, 99 OPUS_GET_MAX_BANDWIDTH(&bandwidth)); 100 EXPECT_EQ(expect, bandwidth); 101 } 102 103 void OpusTest::CheckAudioBounded(const int16_t* audio, size_t samples, 104 size_t channels, uint16_t bound) const { 105 for (size_t i = 0; i < samples; ++i) { 106 for (size_t c = 0; c < channels; ++c) { 107 ASSERT_GE(audio[i * channels + c], -bound); 108 ASSERT_LE(audio[i * channels + c], bound); 109 } 110 } 111 } 112 113 int OpusTest::EncodeDecode(WebRtcOpusEncInst* encoder, 114 rtc::ArrayView<const int16_t> input_audio, 115 WebRtcOpusDecInst* decoder, 116 int16_t* output_audio, 117 int16_t* audio_type) { 118 int encoded_bytes_int = WebRtcOpus_Encode( 119 encoder, input_audio.data(), 120 rtc::CheckedDivExact(input_audio.size(), channels_), 121 kMaxBytes, bitstream_); 122 EXPECT_GE(encoded_bytes_int, 0); 123 encoded_bytes_ = static_cast<size_t>(encoded_bytes_int); 124 int est_len = WebRtcOpus_DurationEst(decoder, bitstream_, encoded_bytes_); 125 int act_len = WebRtcOpus_Decode(decoder, bitstream_, 126 encoded_bytes_, output_audio, 127 audio_type); 128 EXPECT_EQ(est_len, act_len); 129 return act_len; 130 } 131 132 // Test if encoder/decoder can enter DTX mode properly and do not enter DTX when 133 // they should not. This test is signal dependent. 134 void OpusTest::TestDtxEffect(bool dtx, int block_length_ms) { 135 PrepareSpeechData(channels_, block_length_ms, 2000); 136 const size_t samples = kOpusRateKhz * block_length_ms; 137 138 // Create encoder memory. 139 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 140 channels_, 141 application_)); 142 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_)); 143 144 // Set bitrate. 145 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 146 channels_ == 1 ? 32000 : 64000)); 147 148 // Set input audio as silence. 149 std::vector<int16_t> silence(samples * channels_, 0); 150 151 // Setting DTX. 152 EXPECT_EQ(0, dtx ? WebRtcOpus_EnableDtx(opus_encoder_) : 153 WebRtcOpus_DisableDtx(opus_encoder_)); 154 155 int16_t audio_type; 156 int16_t* output_data_decode = new int16_t[samples * channels_]; 157 158 for (int i = 0; i < 100; ++i) { 159 EXPECT_EQ(samples, 160 static_cast<size_t>(EncodeDecode( 161 opus_encoder_, speech_data_.GetNextBlock(), opus_decoder_, 162 output_data_decode, &audio_type))); 163 // If not DTX, it should never enter DTX mode. If DTX, we do not care since 164 // whether it enters DTX depends on the signal type. 165 if (!dtx) { 166 EXPECT_GT(encoded_bytes_, 1U); 167 EXPECT_EQ(0, opus_encoder_->in_dtx_mode); 168 EXPECT_EQ(0, opus_decoder_->in_dtx_mode); 169 EXPECT_EQ(0, audio_type); // Speech. 170 } 171 } 172 173 // We input some silent segments. In DTX mode, the encoder will stop sending. 174 // However, DTX may happen after a while. 175 for (int i = 0; i < 30; ++i) { 176 EXPECT_EQ(samples, 177 static_cast<size_t>(EncodeDecode( 178 opus_encoder_, silence, opus_decoder_, output_data_decode, 179 &audio_type))); 180 if (!dtx) { 181 EXPECT_GT(encoded_bytes_, 1U); 182 EXPECT_EQ(0, opus_encoder_->in_dtx_mode); 183 EXPECT_EQ(0, opus_decoder_->in_dtx_mode); 184 EXPECT_EQ(0, audio_type); // Speech. 185 } else if (encoded_bytes_ == 1) { 186 EXPECT_EQ(1, opus_encoder_->in_dtx_mode); 187 EXPECT_EQ(1, opus_decoder_->in_dtx_mode); 188 EXPECT_EQ(2, audio_type); // Comfort noise. 189 break; 190 } 191 } 192 193 // When Opus is in DTX, it wakes up in a regular basis. It sends two packets, 194 // one with an arbitrary size and the other of 1-byte, then stops sending for 195 // a certain number of frames. 196 197 // |max_dtx_frames| is the maximum number of frames Opus can stay in DTX. 198 const int max_dtx_frames = 400 / block_length_ms + 1; 199 200 // We run |kRunTimeMs| milliseconds of pure silence. 201 const int kRunTimeMs = 2000; 202 203 // We check that, after a |kCheckTimeMs| milliseconds (given that the CNG in 204 // Opus needs time to adapt), the absolute values of DTX decoded signal are 205 // bounded by |kOutputValueBound|. 206 const int kCheckTimeMs = 1500; 207 208 #if defined(OPUS_FIXED_POINT) 209 const uint16_t kOutputValueBound = 20; 210 #else 211 const uint16_t kOutputValueBound = 2; 212 #endif 213 214 int time = 0; 215 while (time < kRunTimeMs) { 216 // DTX mode is maintained for maximum |max_dtx_frames| frames. 217 int i = 0; 218 for (; i < max_dtx_frames; ++i) { 219 time += block_length_ms; 220 EXPECT_EQ(samples, 221 static_cast<size_t>(EncodeDecode( 222 opus_encoder_, silence, opus_decoder_, output_data_decode, 223 &audio_type))); 224 if (dtx) { 225 if (encoded_bytes_ > 1) 226 break; 227 EXPECT_EQ(0U, encoded_bytes_) // Send 0 byte. 228 << "Opus should have entered DTX mode."; 229 EXPECT_EQ(1, opus_encoder_->in_dtx_mode); 230 EXPECT_EQ(1, opus_decoder_->in_dtx_mode); 231 EXPECT_EQ(2, audio_type); // Comfort noise. 232 if (time >= kCheckTimeMs) { 233 CheckAudioBounded(output_data_decode, samples, channels_, 234 kOutputValueBound); 235 } 236 } else { 237 EXPECT_GT(encoded_bytes_, 1U); 238 EXPECT_EQ(0, opus_encoder_->in_dtx_mode); 239 EXPECT_EQ(0, opus_decoder_->in_dtx_mode); 240 EXPECT_EQ(0, audio_type); // Speech. 241 } 242 } 243 244 if (dtx) { 245 // With DTX, Opus must stop transmission for some time. 246 EXPECT_GT(i, 1); 247 } 248 249 // We expect a normal payload. 250 EXPECT_EQ(0, opus_encoder_->in_dtx_mode); 251 EXPECT_EQ(0, opus_decoder_->in_dtx_mode); 252 EXPECT_EQ(0, audio_type); // Speech. 253 254 // Enters DTX again immediately. 255 time += block_length_ms; 256 EXPECT_EQ(samples, 257 static_cast<size_t>(EncodeDecode( 258 opus_encoder_, silence, opus_decoder_, output_data_decode, 259 &audio_type))); 260 if (dtx) { 261 EXPECT_EQ(1U, encoded_bytes_); // Send 1 byte. 262 EXPECT_EQ(1, opus_encoder_->in_dtx_mode); 263 EXPECT_EQ(1, opus_decoder_->in_dtx_mode); 264 EXPECT_EQ(2, audio_type); // Comfort noise. 265 if (time >= kCheckTimeMs) { 266 CheckAudioBounded(output_data_decode, samples, channels_, 267 kOutputValueBound); 268 } 269 } else { 270 EXPECT_GT(encoded_bytes_, 1U); 271 EXPECT_EQ(0, opus_encoder_->in_dtx_mode); 272 EXPECT_EQ(0, opus_decoder_->in_dtx_mode); 273 EXPECT_EQ(0, audio_type); // Speech. 274 } 275 } 276 277 silence[0] = 10000; 278 if (dtx) { 279 // Verify that encoder/decoder can jump out from DTX mode. 280 EXPECT_EQ(samples, 281 static_cast<size_t>(EncodeDecode( 282 opus_encoder_, silence, opus_decoder_, output_data_decode, 283 &audio_type))); 284 EXPECT_GT(encoded_bytes_, 1U); 285 EXPECT_EQ(0, opus_encoder_->in_dtx_mode); 286 EXPECT_EQ(0, opus_decoder_->in_dtx_mode); 287 EXPECT_EQ(0, audio_type); // Speech. 288 } 289 290 // Free memory. 291 delete[] output_data_decode; 292 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 293 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_)); 294 } 295 296 // Test failing Create. 297 TEST(OpusTest, OpusCreateFail) { 298 WebRtcOpusEncInst* opus_encoder; 299 WebRtcOpusDecInst* opus_decoder; 300 301 // Test to see that an invalid pointer is caught. 302 EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(NULL, 1, 0)); 303 // Invalid channel number. 304 EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(&opus_encoder, 3, 0)); 305 // Invalid applciation mode. 306 EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(&opus_encoder, 1, 2)); 307 308 EXPECT_EQ(-1, WebRtcOpus_DecoderCreate(NULL, 1)); 309 // Invalid channel number. 310 EXPECT_EQ(-1, WebRtcOpus_DecoderCreate(&opus_decoder, 3)); 311 } 312 313 // Test failing Free. 314 TEST(OpusTest, OpusFreeFail) { 315 // Test to see that an invalid pointer is caught. 316 EXPECT_EQ(-1, WebRtcOpus_EncoderFree(NULL)); 317 EXPECT_EQ(-1, WebRtcOpus_DecoderFree(NULL)); 318 } 319 320 // Test normal Create and Free. 321 TEST_P(OpusTest, OpusCreateFree) { 322 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 323 channels_, 324 application_)); 325 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_)); 326 EXPECT_TRUE(opus_encoder_ != NULL); 327 EXPECT_TRUE(opus_decoder_ != NULL); 328 // Free encoder and decoder memory. 329 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 330 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_)); 331 } 332 333 TEST_P(OpusTest, OpusEncodeDecode) { 334 PrepareSpeechData(channels_, 20, 20); 335 336 // Create encoder memory. 337 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 338 channels_, 339 application_)); 340 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, 341 channels_)); 342 343 // Set bitrate. 344 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 345 channels_ == 1 ? 32000 : 64000)); 346 347 // Check number of channels for decoder. 348 EXPECT_EQ(channels_, WebRtcOpus_DecoderChannels(opus_decoder_)); 349 350 // Check application mode. 351 opus_int32 app; 352 opus_encoder_ctl(opus_encoder_->encoder, 353 OPUS_GET_APPLICATION(&app)); 354 EXPECT_EQ(application_ == 0 ? OPUS_APPLICATION_VOIP : OPUS_APPLICATION_AUDIO, 355 app); 356 357 // Encode & decode. 358 int16_t audio_type; 359 int16_t* output_data_decode = new int16_t[kOpus20msFrameSamples * channels_]; 360 EXPECT_EQ(kOpus20msFrameSamples, 361 static_cast<size_t>( 362 EncodeDecode(opus_encoder_, speech_data_.GetNextBlock(), 363 opus_decoder_, output_data_decode, &audio_type))); 364 365 // Free memory. 366 delete[] output_data_decode; 367 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 368 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_)); 369 } 370 371 TEST_P(OpusTest, OpusSetBitRate) { 372 // Test without creating encoder memory. 373 EXPECT_EQ(-1, WebRtcOpus_SetBitRate(opus_encoder_, 60000)); 374 375 // Create encoder memory, try with different bitrates. 376 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 377 channels_, 378 application_)); 379 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 30000)); 380 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 60000)); 381 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 300000)); 382 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 600000)); 383 384 // Free memory. 385 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 386 } 387 388 TEST_P(OpusTest, OpusSetComplexity) { 389 // Test without creating encoder memory. 390 EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_encoder_, 9)); 391 392 // Create encoder memory, try with different complexities. 393 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 394 channels_, 395 application_)); 396 397 EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_encoder_, 0)); 398 EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_encoder_, 10)); 399 EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_encoder_, 11)); 400 401 // Free memory. 402 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 403 } 404 405 // Encode and decode one frame, initialize the decoder and 406 // decode once more. 407 TEST_P(OpusTest, OpusDecodeInit) { 408 PrepareSpeechData(channels_, 20, 20); 409 410 // Create encoder memory. 411 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 412 channels_, 413 application_)); 414 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_)); 415 416 // Encode & decode. 417 int16_t audio_type; 418 int16_t* output_data_decode = new int16_t[kOpus20msFrameSamples * channels_]; 419 EXPECT_EQ(kOpus20msFrameSamples, 420 static_cast<size_t>( 421 EncodeDecode(opus_encoder_, speech_data_.GetNextBlock(), 422 opus_decoder_, output_data_decode, &audio_type))); 423 424 WebRtcOpus_DecoderInit(opus_decoder_); 425 426 EXPECT_EQ(kOpus20msFrameSamples, 427 static_cast<size_t>(WebRtcOpus_Decode( 428 opus_decoder_, bitstream_, encoded_bytes_, output_data_decode, 429 &audio_type))); 430 431 // Free memory. 432 delete[] output_data_decode; 433 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 434 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_)); 435 } 436 437 TEST_P(OpusTest, OpusEnableDisableFec) { 438 // Test without creating encoder memory. 439 EXPECT_EQ(-1, WebRtcOpus_EnableFec(opus_encoder_)); 440 EXPECT_EQ(-1, WebRtcOpus_DisableFec(opus_encoder_)); 441 442 // Create encoder memory. 443 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 444 channels_, 445 application_)); 446 447 EXPECT_EQ(0, WebRtcOpus_EnableFec(opus_encoder_)); 448 EXPECT_EQ(0, WebRtcOpus_DisableFec(opus_encoder_)); 449 450 // Free memory. 451 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 452 } 453 454 TEST_P(OpusTest, OpusEnableDisableDtx) { 455 // Test without creating encoder memory. 456 EXPECT_EQ(-1, WebRtcOpus_EnableDtx(opus_encoder_)); 457 EXPECT_EQ(-1, WebRtcOpus_DisableDtx(opus_encoder_)); 458 459 // Create encoder memory. 460 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 461 channels_, 462 application_)); 463 464 opus_int32 dtx; 465 466 // DTX is off by default. 467 opus_encoder_ctl(opus_encoder_->encoder, 468 OPUS_GET_DTX(&dtx)); 469 EXPECT_EQ(0, dtx); 470 471 // Test to enable DTX. 472 EXPECT_EQ(0, WebRtcOpus_EnableDtx(opus_encoder_)); 473 opus_encoder_ctl(opus_encoder_->encoder, 474 OPUS_GET_DTX(&dtx)); 475 EXPECT_EQ(1, dtx); 476 477 // Test to disable DTX. 478 EXPECT_EQ(0, WebRtcOpus_DisableDtx(opus_encoder_)); 479 opus_encoder_ctl(opus_encoder_->encoder, 480 OPUS_GET_DTX(&dtx)); 481 EXPECT_EQ(0, dtx); 482 483 484 // Free memory. 485 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 486 } 487 488 TEST_P(OpusTest, OpusDtxOff) { 489 TestDtxEffect(false, 10); 490 TestDtxEffect(false, 20); 491 TestDtxEffect(false, 40); 492 } 493 494 TEST_P(OpusTest, OpusDtxOn) { 495 TestDtxEffect(true, 10); 496 TestDtxEffect(true, 20); 497 TestDtxEffect(true, 40); 498 } 499 500 TEST_P(OpusTest, OpusSetPacketLossRate) { 501 // Test without creating encoder memory. 502 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_encoder_, 50)); 503 504 // Create encoder memory. 505 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 506 channels_, 507 application_)); 508 509 EXPECT_EQ(0, WebRtcOpus_SetPacketLossRate(opus_encoder_, 50)); 510 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_encoder_, -1)); 511 EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_encoder_, 101)); 512 513 // Free memory. 514 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 515 } 516 517 TEST_P(OpusTest, OpusSetMaxPlaybackRate) { 518 // Test without creating encoder memory. 519 EXPECT_EQ(-1, WebRtcOpus_SetMaxPlaybackRate(opus_encoder_, 20000)); 520 521 // Create encoder memory. 522 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 523 channels_, 524 application_)); 525 526 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_FULLBAND, 48000); 527 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_FULLBAND, 24001); 528 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_SUPERWIDEBAND, 24000); 529 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_SUPERWIDEBAND, 16001); 530 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_WIDEBAND, 16000); 531 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_WIDEBAND, 12001); 532 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_MEDIUMBAND, 12000); 533 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_MEDIUMBAND, 8001); 534 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_NARROWBAND, 8000); 535 SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_NARROWBAND, 4000); 536 537 // Free memory. 538 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 539 } 540 541 // Test PLC. 542 TEST_P(OpusTest, OpusDecodePlc) { 543 PrepareSpeechData(channels_, 20, 20); 544 545 // Create encoder memory. 546 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 547 channels_, 548 application_)); 549 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_)); 550 551 // Set bitrate. 552 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 553 channels_== 1 ? 32000 : 64000)); 554 555 // Check number of channels for decoder. 556 EXPECT_EQ(channels_, WebRtcOpus_DecoderChannels(opus_decoder_)); 557 558 // Encode & decode. 559 int16_t audio_type; 560 int16_t* output_data_decode = new int16_t[kOpus20msFrameSamples * channels_]; 561 EXPECT_EQ(kOpus20msFrameSamples, 562 static_cast<size_t>( 563 EncodeDecode(opus_encoder_, speech_data_.GetNextBlock(), 564 opus_decoder_, output_data_decode, &audio_type))); 565 566 // Call decoder PLC. 567 int16_t* plc_buffer = new int16_t[kOpus20msFrameSamples * channels_]; 568 EXPECT_EQ(kOpus20msFrameSamples, 569 static_cast<size_t>(WebRtcOpus_DecodePlc( 570 opus_decoder_, plc_buffer, 1))); 571 572 // Free memory. 573 delete[] plc_buffer; 574 delete[] output_data_decode; 575 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 576 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_)); 577 } 578 579 // Duration estimation. 580 TEST_P(OpusTest, OpusDurationEstimation) { 581 PrepareSpeechData(channels_, 20, 20); 582 583 // Create. 584 EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 585 channels_, 586 application_)); 587 EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_)); 588 589 // 10 ms. We use only first 10 ms of a 20 ms block. 590 auto speech_block = speech_data_.GetNextBlock(); 591 int encoded_bytes_int = WebRtcOpus_Encode( 592 opus_encoder_, speech_block.data(), 593 rtc::CheckedDivExact(speech_block.size(), 2 * channels_), 594 kMaxBytes, bitstream_); 595 EXPECT_GE(encoded_bytes_int, 0); 596 EXPECT_EQ(kOpus10msFrameSamples, 597 static_cast<size_t>(WebRtcOpus_DurationEst( 598 opus_decoder_, bitstream_, 599 static_cast<size_t>(encoded_bytes_int)))); 600 601 // 20 ms 602 speech_block = speech_data_.GetNextBlock(); 603 encoded_bytes_int = WebRtcOpus_Encode( 604 opus_encoder_, speech_block.data(), 605 rtc::CheckedDivExact(speech_block.size(), channels_), 606 kMaxBytes, bitstream_); 607 EXPECT_GE(encoded_bytes_int, 0); 608 EXPECT_EQ(kOpus20msFrameSamples, 609 static_cast<size_t>(WebRtcOpus_DurationEst( 610 opus_decoder_, bitstream_, 611 static_cast<size_t>(encoded_bytes_int)))); 612 613 // Free memory. 614 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 615 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_)); 616 } 617 618 TEST_P(OpusTest, OpusDecodeRepacketized) { 619 const int kPackets = 6; 620 621 PrepareSpeechData(channels_, 20, 20 * kPackets); 622 623 // Create encoder memory. 624 ASSERT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, 625 channels_, 626 application_)); 627 ASSERT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, 628 channels_)); 629 630 // Set bitrate. 631 EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 632 channels_ == 1 ? 32000 : 64000)); 633 634 // Check number of channels for decoder. 635 EXPECT_EQ(channels_, WebRtcOpus_DecoderChannels(opus_decoder_)); 636 637 // Encode & decode. 638 int16_t audio_type; 639 rtc::scoped_ptr<int16_t[]> output_data_decode( 640 new int16_t[kPackets * kOpus20msFrameSamples * channels_]); 641 OpusRepacketizer* rp = opus_repacketizer_create(); 642 643 for (int idx = 0; idx < kPackets; idx++) { 644 auto speech_block = speech_data_.GetNextBlock(); 645 encoded_bytes_ = 646 WebRtcOpus_Encode(opus_encoder_, speech_block.data(), 647 rtc::CheckedDivExact(speech_block.size(), channels_), 648 kMaxBytes, bitstream_); 649 EXPECT_EQ(OPUS_OK, opus_repacketizer_cat(rp, bitstream_, encoded_bytes_)); 650 } 651 652 encoded_bytes_ = opus_repacketizer_out(rp, bitstream_, kMaxBytes); 653 654 EXPECT_EQ(kOpus20msFrameSamples * kPackets, 655 static_cast<size_t>(WebRtcOpus_DurationEst( 656 opus_decoder_, bitstream_, encoded_bytes_))); 657 658 EXPECT_EQ(kOpus20msFrameSamples * kPackets, 659 static_cast<size_t>(WebRtcOpus_Decode( 660 opus_decoder_, bitstream_, encoded_bytes_, 661 output_data_decode.get(), &audio_type))); 662 663 // Free memory. 664 opus_repacketizer_destroy(rp); 665 EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_)); 666 EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_)); 667 } 668 669 INSTANTIATE_TEST_CASE_P(VariousMode, 670 OpusTest, 671 Combine(Values(1, 2), Values(0, 1))); 672 673 674 } // namespace webrtc 675