1 /* 2 * Copyright (c) 2012 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 11 #include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" 12 13 #include <assert.h> 14 #include <stdlib.h> 15 16 #include <string> 17 18 #include "testing/gtest/include/gtest/gtest.h" 19 #include "webrtc/common_audio/resampler/include/resampler.h" 20 #ifdef WEBRTC_CODEC_CELT 21 #include "webrtc/modules/audio_coding/codecs/celt/include/celt_interface.h" 22 #endif 23 #include "webrtc/modules/audio_coding/codecs/g711/include/g711_interface.h" 24 #include "webrtc/modules/audio_coding/codecs/g722/include/g722_interface.h" 25 #include "webrtc/modules/audio_coding/codecs/ilbc/interface/ilbc.h" 26 #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h" 27 #include "webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h" 28 #include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h" 29 #include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h" 30 #include "webrtc/system_wrappers/interface/data_log.h" 31 #include "webrtc/test/testsupport/fileutils.h" 32 33 namespace webrtc { 34 35 class AudioDecoderTest : public ::testing::Test { 36 protected: 37 AudioDecoderTest() 38 : input_fp_(NULL), 39 input_(NULL), 40 encoded_(NULL), 41 decoded_(NULL), 42 frame_size_(0), 43 data_length_(0), 44 encoded_bytes_(0), 45 channels_(1), 46 decoder_(NULL) { 47 input_file_ = webrtc::test::ProjectRootPath() + 48 "resources/audio_coding/testfile32kHz.pcm"; 49 } 50 51 virtual ~AudioDecoderTest() {} 52 53 virtual void SetUp() { 54 // Create arrays. 55 ASSERT_GT(data_length_, 0u) << "The test must set data_length_ > 0"; 56 input_ = new int16_t[data_length_]; 57 // Longest encoded data is produced by PCM16b with 2 bytes per sample. 58 encoded_ = new uint8_t[data_length_ * 2]; 59 decoded_ = new int16_t[data_length_ * channels_]; 60 // Open input file. 61 input_fp_ = fopen(input_file_.c_str(), "rb"); 62 ASSERT_TRUE(input_fp_ != NULL) << "Failed to open file " << input_file_; 63 // Read data to |input_|. 64 ASSERT_EQ(data_length_, 65 fread(input_, sizeof(int16_t), data_length_, input_fp_)) << 66 "Could not read enough data from file"; 67 // Logging to view input and output in Matlab. 68 // Use 'gyp -Denable_data_logging=1' to enable logging. 69 DataLog::CreateLog(); 70 DataLog::AddTable("CodecTest"); 71 DataLog::AddColumn("CodecTest", "input", 1); 72 DataLog::AddColumn("CodecTest", "output", 1); 73 } 74 75 virtual void TearDown() { 76 delete decoder_; 77 decoder_ = NULL; 78 // Close input file. 79 fclose(input_fp_); 80 // Delete arrays. 81 delete [] input_; 82 input_ = NULL; 83 delete [] encoded_; 84 encoded_ = NULL; 85 delete [] decoded_; 86 decoded_ = NULL; 87 // Close log. 88 DataLog::ReturnLog(); 89 } 90 91 virtual void InitEncoder() { } 92 93 // This method must be implemented for all tests derived from this class. 94 virtual int EncodeFrame(const int16_t* input, size_t input_len, 95 uint8_t* output) = 0; 96 97 // Encodes and decodes audio. The absolute difference between the input and 98 // output is compared vs |tolerance|, and the mean-squared error is compared 99 // with |mse|. The encoded stream should contain |expected_bytes|. For stereo 100 // audio, the absolute difference between the two channels is compared vs 101 // |channel_diff_tolerance|. 102 void EncodeDecodeTest(size_t expected_bytes, int tolerance, double mse, 103 int delay = 0, int channel_diff_tolerance = 0) { 104 ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0"; 105 ASSERT_GE(channel_diff_tolerance, 0) << 106 "Test must define a channel_diff_tolerance >= 0"; 107 size_t processed_samples = 0u; 108 encoded_bytes_ = 0u; 109 InitEncoder(); 110 EXPECT_EQ(0, decoder_->Init()); 111 while (processed_samples + frame_size_ <= data_length_) { 112 size_t enc_len = EncodeFrame(&input_[processed_samples], frame_size_, 113 &encoded_[encoded_bytes_]); 114 AudioDecoder::SpeechType speech_type; 115 size_t dec_len = decoder_->Decode(&encoded_[encoded_bytes_], enc_len, 116 &decoded_[processed_samples * 117 channels_], 118 &speech_type); 119 EXPECT_EQ(frame_size_ * channels_, dec_len); 120 encoded_bytes_ += enc_len; 121 processed_samples += frame_size_; 122 } 123 // For some codecs it doesn't make sense to check expected number of bytes, 124 // since the number can vary for different platforms. Opus and iSAC are 125 // such codecs. In this case expected_bytes is set to 0. 126 if (expected_bytes) { 127 EXPECT_EQ(expected_bytes, encoded_bytes_); 128 } 129 CompareInputOutput(processed_samples, tolerance, delay); 130 if (channels_ == 2) 131 CompareTwoChannels(processed_samples, channel_diff_tolerance); 132 EXPECT_LE(MseInputOutput(processed_samples, delay), mse); 133 } 134 135 // The absolute difference between the input and output (the first channel) is 136 // compared vs |tolerance|. The parameter |delay| is used to correct for codec 137 // delays. 138 virtual void CompareInputOutput(size_t num_samples, int tolerance, 139 int delay) const { 140 assert(num_samples <= data_length_); 141 for (unsigned int n = 0; n < num_samples - delay; ++n) { 142 ASSERT_NEAR(input_[n], decoded_[channels_ * n + delay], tolerance) << 143 "Exit test on first diff; n = " << n; 144 DataLog::InsertCell("CodecTest", "input", input_[n]); 145 DataLog::InsertCell("CodecTest", "output", decoded_[channels_ * n]); 146 DataLog::NextRow("CodecTest"); 147 } 148 } 149 150 // The absolute difference between the two channels in a stereo is compared vs 151 // |tolerance|. 152 virtual void CompareTwoChannels(size_t samples_per_channel, 153 int tolerance) const { 154 assert(samples_per_channel <= data_length_); 155 for (unsigned int n = 0; n < samples_per_channel; ++n) 156 ASSERT_NEAR(decoded_[channels_ * n], decoded_[channels_ * n + 1], 157 tolerance) << "Stereo samples differ."; 158 } 159 160 // Calculates mean-squared error between input and output (the first channel). 161 // The parameter |delay| is used to correct for codec delays. 162 virtual double MseInputOutput(size_t num_samples, int delay) const { 163 assert(num_samples <= data_length_); 164 if (num_samples == 0) return 0.0; 165 double squared_sum = 0.0; 166 for (unsigned int n = 0; n < num_samples - delay; ++n) { 167 squared_sum += (input_[n] - decoded_[channels_ * n + delay]) * 168 (input_[n] - decoded_[channels_ * n + delay]); 169 } 170 return squared_sum / (num_samples - delay); 171 } 172 173 // Encodes a payload and decodes it twice with decoder re-init before each 174 // decode. Verifies that the decoded result is the same. 175 void ReInitTest() { 176 int16_t* output1 = decoded_; 177 int16_t* output2 = decoded_ + frame_size_; 178 InitEncoder(); 179 size_t enc_len = EncodeFrame(input_, frame_size_, encoded_); 180 size_t dec_len; 181 AudioDecoder::SpeechType speech_type1, speech_type2; 182 EXPECT_EQ(0, decoder_->Init()); 183 dec_len = decoder_->Decode(encoded_, enc_len, output1, &speech_type1); 184 EXPECT_EQ(frame_size_ * channels_, dec_len); 185 // Re-init decoder and decode again. 186 EXPECT_EQ(0, decoder_->Init()); 187 dec_len = decoder_->Decode(encoded_, enc_len, output2, &speech_type2); 188 EXPECT_EQ(frame_size_ * channels_, dec_len); 189 for (unsigned int n = 0; n < frame_size_; ++n) { 190 ASSERT_EQ(output1[n], output2[n]) << "Exit test on first diff; n = " << n; 191 } 192 EXPECT_EQ(speech_type1, speech_type2); 193 } 194 195 // Call DecodePlc and verify that the correct number of samples is produced. 196 void DecodePlcTest() { 197 InitEncoder(); 198 size_t enc_len = EncodeFrame(input_, frame_size_, encoded_); 199 AudioDecoder::SpeechType speech_type; 200 EXPECT_EQ(0, decoder_->Init()); 201 size_t dec_len = 202 decoder_->Decode(encoded_, enc_len, decoded_, &speech_type); 203 EXPECT_EQ(frame_size_ * channels_, dec_len); 204 // Call DecodePlc and verify that we get one frame of data. 205 // (Overwrite the output from the above Decode call, but that does not 206 // matter.) 207 dec_len = decoder_->DecodePlc(1, decoded_); 208 EXPECT_EQ(frame_size_ * channels_, dec_len); 209 } 210 211 std::string input_file_; 212 FILE* input_fp_; 213 int16_t* input_; 214 uint8_t* encoded_; 215 int16_t* decoded_; 216 size_t frame_size_; 217 size_t data_length_; 218 size_t encoded_bytes_; 219 size_t channels_; 220 AudioDecoder* decoder_; 221 }; 222 223 class AudioDecoderPcmUTest : public AudioDecoderTest { 224 protected: 225 AudioDecoderPcmUTest() : AudioDecoderTest() { 226 frame_size_ = 160; 227 data_length_ = 10 * frame_size_; 228 decoder_ = new AudioDecoderPcmU; 229 assert(decoder_); 230 } 231 232 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 233 uint8_t* output) { 234 int enc_len_bytes = 235 WebRtcG711_EncodeU(NULL, const_cast<int16_t*>(input), 236 static_cast<int>(input_len_samples), 237 reinterpret_cast<int16_t*>(output)); 238 EXPECT_EQ(input_len_samples, static_cast<size_t>(enc_len_bytes)); 239 return enc_len_bytes; 240 } 241 }; 242 243 class AudioDecoderPcmATest : public AudioDecoderTest { 244 protected: 245 AudioDecoderPcmATest() : AudioDecoderTest() { 246 frame_size_ = 160; 247 data_length_ = 10 * frame_size_; 248 decoder_ = new AudioDecoderPcmA; 249 assert(decoder_); 250 } 251 252 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 253 uint8_t* output) { 254 int enc_len_bytes = 255 WebRtcG711_EncodeA(NULL, const_cast<int16_t*>(input), 256 static_cast<int>(input_len_samples), 257 reinterpret_cast<int16_t*>(output)); 258 EXPECT_EQ(input_len_samples, static_cast<size_t>(enc_len_bytes)); 259 return enc_len_bytes; 260 } 261 }; 262 263 class AudioDecoderPcm16BTest : public AudioDecoderTest { 264 protected: 265 AudioDecoderPcm16BTest() : AudioDecoderTest() { 266 frame_size_ = 160; 267 data_length_ = 10 * frame_size_; 268 decoder_ = new AudioDecoderPcm16B(kDecoderPCM16B); 269 assert(decoder_); 270 } 271 272 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 273 uint8_t* output) { 274 int enc_len_bytes = WebRtcPcm16b_EncodeW16( 275 const_cast<int16_t*>(input), static_cast<int>(input_len_samples), 276 reinterpret_cast<int16_t*>(output)); 277 EXPECT_EQ(2 * input_len_samples, static_cast<size_t>(enc_len_bytes)); 278 return enc_len_bytes; 279 } 280 }; 281 282 class AudioDecoderIlbcTest : public AudioDecoderTest { 283 protected: 284 AudioDecoderIlbcTest() : AudioDecoderTest() { 285 frame_size_ = 240; 286 data_length_ = 10 * frame_size_; 287 decoder_ = new AudioDecoderIlbc; 288 assert(decoder_); 289 WebRtcIlbcfix_EncoderCreate(&encoder_); 290 } 291 292 ~AudioDecoderIlbcTest() { 293 WebRtcIlbcfix_EncoderFree(encoder_); 294 } 295 296 virtual void InitEncoder() { 297 ASSERT_EQ(0, WebRtcIlbcfix_EncoderInit(encoder_, 30)); // 30 ms. 298 } 299 300 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 301 uint8_t* output) { 302 int enc_len_bytes = 303 WebRtcIlbcfix_Encode(encoder_, input, 304 static_cast<int>(input_len_samples), 305 reinterpret_cast<int16_t*>(output)); 306 EXPECT_EQ(50, enc_len_bytes); 307 return enc_len_bytes; 308 } 309 310 // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does 311 // not return any data. It simply resets a few states and returns 0. 312 void DecodePlcTest() { 313 InitEncoder(); 314 size_t enc_len = EncodeFrame(input_, frame_size_, encoded_); 315 AudioDecoder::SpeechType speech_type; 316 EXPECT_EQ(0, decoder_->Init()); 317 size_t dec_len = 318 decoder_->Decode(encoded_, enc_len, decoded_, &speech_type); 319 EXPECT_EQ(frame_size_, dec_len); 320 // Simply call DecodePlc and verify that we get 0 as return value. 321 EXPECT_EQ(0, decoder_->DecodePlc(1, decoded_)); 322 } 323 324 iLBC_encinst_t* encoder_; 325 }; 326 327 class AudioDecoderIsacFloatTest : public AudioDecoderTest { 328 protected: 329 AudioDecoderIsacFloatTest() : AudioDecoderTest() { 330 input_size_ = 160; 331 frame_size_ = 480; 332 data_length_ = 10 * frame_size_; 333 decoder_ = new AudioDecoderIsac; 334 assert(decoder_); 335 WebRtcIsac_Create(&encoder_); 336 WebRtcIsac_SetEncSampRate(encoder_, 16000); 337 } 338 339 ~AudioDecoderIsacFloatTest() { 340 WebRtcIsac_Free(encoder_); 341 } 342 343 virtual void InitEncoder() { 344 ASSERT_EQ(0, WebRtcIsac_EncoderInit(encoder_, 1)); // Fixed mode. 345 ASSERT_EQ(0, WebRtcIsac_Control(encoder_, 32000, 30)); // 32 kbps, 30 ms. 346 } 347 348 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 349 uint8_t* output) { 350 // Insert 3 * 10 ms. Expect non-zero output on third call. 351 EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); 352 input += input_size_; 353 EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); 354 input += input_size_; 355 int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output); 356 EXPECT_GT(enc_len_bytes, 0); 357 return enc_len_bytes; 358 } 359 360 ISACStruct* encoder_; 361 int input_size_; 362 }; 363 364 class AudioDecoderIsacSwbTest : public AudioDecoderTest { 365 protected: 366 AudioDecoderIsacSwbTest() : AudioDecoderTest() { 367 input_size_ = 320; 368 frame_size_ = 960; 369 data_length_ = 10 * frame_size_; 370 decoder_ = new AudioDecoderIsacSwb; 371 assert(decoder_); 372 WebRtcIsac_Create(&encoder_); 373 WebRtcIsac_SetEncSampRate(encoder_, 32000); 374 } 375 376 ~AudioDecoderIsacSwbTest() { 377 WebRtcIsac_Free(encoder_); 378 } 379 380 virtual void InitEncoder() { 381 ASSERT_EQ(0, WebRtcIsac_EncoderInit(encoder_, 1)); // Fixed mode. 382 ASSERT_EQ(0, WebRtcIsac_Control(encoder_, 32000, 30)); // 32 kbps, 30 ms. 383 } 384 385 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 386 uint8_t* output) { 387 // Insert 3 * 10 ms. Expect non-zero output on third call. 388 EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); 389 input += input_size_; 390 EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output)); 391 input += input_size_; 392 int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output); 393 EXPECT_GT(enc_len_bytes, 0); 394 return enc_len_bytes; 395 } 396 397 ISACStruct* encoder_; 398 int input_size_; 399 }; 400 401 // This test is identical to AudioDecoderIsacSwbTest, except that it creates 402 // an AudioDecoderIsacFb decoder object. 403 class AudioDecoderIsacFbTest : public AudioDecoderIsacSwbTest { 404 protected: 405 AudioDecoderIsacFbTest() : AudioDecoderIsacSwbTest() { 406 // Delete the |decoder_| that was created by AudioDecoderIsacSwbTest and 407 // create an AudioDecoderIsacFb object instead. 408 delete decoder_; 409 decoder_ = new AudioDecoderIsacFb; 410 assert(decoder_); 411 } 412 }; 413 414 class AudioDecoderIsacFixTest : public AudioDecoderTest { 415 protected: 416 AudioDecoderIsacFixTest() : AudioDecoderTest() { 417 input_size_ = 160; 418 frame_size_ = 480; 419 data_length_ = 10 * frame_size_; 420 decoder_ = new AudioDecoderIsacFix; 421 assert(decoder_); 422 WebRtcIsacfix_Create(&encoder_); 423 } 424 425 ~AudioDecoderIsacFixTest() { 426 WebRtcIsacfix_Free(encoder_); 427 } 428 429 virtual void InitEncoder() { 430 ASSERT_EQ(0, WebRtcIsacfix_EncoderInit(encoder_, 1)); // Fixed mode. 431 ASSERT_EQ(0, 432 WebRtcIsacfix_Control(encoder_, 32000, 30)); // 32 kbps, 30 ms. 433 } 434 435 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 436 uint8_t* output) { 437 // Insert 3 * 10 ms. Expect non-zero output on third call. 438 EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output)); 439 input += input_size_; 440 EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output)); 441 input += input_size_; 442 int enc_len_bytes = WebRtcIsacfix_Encode(encoder_, input, output); 443 EXPECT_GT(enc_len_bytes, 0); 444 return enc_len_bytes; 445 } 446 447 ISACFIX_MainStruct* encoder_; 448 int input_size_; 449 }; 450 451 class AudioDecoderG722Test : public AudioDecoderTest { 452 protected: 453 AudioDecoderG722Test() : AudioDecoderTest() { 454 frame_size_ = 160; 455 data_length_ = 10 * frame_size_; 456 decoder_ = new AudioDecoderG722; 457 assert(decoder_); 458 WebRtcG722_CreateEncoder(&encoder_); 459 } 460 461 ~AudioDecoderG722Test() { 462 WebRtcG722_FreeEncoder(encoder_); 463 } 464 465 virtual void InitEncoder() { 466 ASSERT_EQ(0, WebRtcG722_EncoderInit(encoder_)); 467 } 468 469 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 470 uint8_t* output) { 471 int enc_len_bytes = 472 WebRtcG722_Encode(encoder_, const_cast<int16_t*>(input), 473 static_cast<int>(input_len_samples), 474 reinterpret_cast<int16_t*>(output)); 475 EXPECT_EQ(80, enc_len_bytes); 476 return enc_len_bytes; 477 } 478 479 G722EncInst* encoder_; 480 }; 481 482 class AudioDecoderG722StereoTest : public AudioDecoderG722Test { 483 protected: 484 AudioDecoderG722StereoTest() : AudioDecoderG722Test() { 485 channels_ = 2; 486 // Delete the |decoder_| that was created by AudioDecoderG722Test and 487 // create an AudioDecoderG722Stereo object instead. 488 delete decoder_; 489 decoder_ = new AudioDecoderG722Stereo; 490 assert(decoder_); 491 } 492 493 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 494 uint8_t* output) { 495 uint8_t* temp_output = new uint8_t[data_length_ * 2]; 496 // Encode a mono payload using the base test class. 497 int mono_enc_len_bytes = 498 AudioDecoderG722Test::EncodeFrame(input, input_len_samples, 499 temp_output); 500 // The bit-stream consists of 4-bit samples: 501 // +--------+--------+--------+ 502 // | s0 s1 | s2 s3 | s4 s5 | 503 // +--------+--------+--------+ 504 // 505 // Duplicate them to the |output| such that the stereo stream becomes: 506 // +--------+--------+--------+ 507 // | s0 s0 | s1 s1 | s2 s2 | 508 // +--------+--------+--------+ 509 EXPECT_LE(mono_enc_len_bytes * 2, static_cast<int>(data_length_ * 2)); 510 uint8_t* output_ptr = output; 511 for (int i = 0; i < mono_enc_len_bytes; ++i) { 512 *output_ptr = (temp_output[i] & 0xF0) + (temp_output[i] >> 4); 513 ++output_ptr; 514 *output_ptr = (temp_output[i] << 4) + (temp_output[i] & 0x0F); 515 ++output_ptr; 516 } 517 delete [] temp_output; 518 return mono_enc_len_bytes * 2; 519 } 520 }; 521 522 #ifdef WEBRTC_CODEC_CELT 523 class AudioDecoderCeltTest : public AudioDecoderTest { 524 protected: 525 static const int kEncodingRateBitsPerSecond = 64000; 526 AudioDecoderCeltTest() : AudioDecoderTest(), encoder_(NULL) { 527 frame_size_ = 640; 528 data_length_ = 10 * frame_size_; 529 decoder_ = AudioDecoder::CreateAudioDecoder(kDecoderCELT_32); 530 assert(decoder_); 531 WebRtcCelt_CreateEnc(&encoder_, static_cast<int>(channels_)); 532 } 533 534 ~AudioDecoderCeltTest() { 535 WebRtcCelt_FreeEnc(encoder_); 536 } 537 538 virtual void InitEncoder() { 539 assert(encoder_); 540 ASSERT_EQ(0, WebRtcCelt_EncoderInit( 541 encoder_, static_cast<int>(channels_), kEncodingRateBitsPerSecond)); 542 } 543 544 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 545 uint8_t* output) { 546 assert(encoder_); 547 return WebRtcCelt_Encode(encoder_, input, output); 548 } 549 550 CELT_encinst_t* encoder_; 551 }; 552 553 class AudioDecoderCeltStereoTest : public AudioDecoderTest { 554 protected: 555 static const int kEncodingRateBitsPerSecond = 64000; 556 AudioDecoderCeltStereoTest() : AudioDecoderTest(), encoder_(NULL) { 557 channels_ = 2; 558 frame_size_ = 640; 559 data_length_ = 10 * frame_size_; 560 decoder_ = AudioDecoder::CreateAudioDecoder(kDecoderCELT_32_2ch); 561 assert(decoder_); 562 stereo_input_ = new int16_t[frame_size_ * channels_]; 563 WebRtcCelt_CreateEnc(&encoder_, static_cast<int>(channels_)); 564 } 565 566 ~AudioDecoderCeltStereoTest() { 567 delete [] stereo_input_; 568 WebRtcCelt_FreeEnc(encoder_); 569 } 570 571 virtual void InitEncoder() { 572 assert(encoder_); 573 ASSERT_EQ(0, WebRtcCelt_EncoderInit( 574 encoder_, static_cast<int>(channels_), kEncodingRateBitsPerSecond)); 575 } 576 577 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 578 uint8_t* output) { 579 assert(encoder_); 580 assert(stereo_input_); 581 for (size_t n = 0; n < frame_size_; ++n) { 582 stereo_input_[n * 2] = stereo_input_[n * 2 + 1] = input[n]; 583 } 584 return WebRtcCelt_Encode(encoder_, stereo_input_, output); 585 } 586 587 int16_t* stereo_input_; 588 CELT_encinst_t* encoder_; 589 }; 590 591 #endif 592 593 class AudioDecoderOpusTest : public AudioDecoderTest { 594 protected: 595 AudioDecoderOpusTest() : AudioDecoderTest() { 596 frame_size_ = 480; 597 data_length_ = 10 * frame_size_; 598 decoder_ = new AudioDecoderOpus(kDecoderOpus); 599 assert(decoder_); 600 WebRtcOpus_EncoderCreate(&encoder_, 1); 601 } 602 603 ~AudioDecoderOpusTest() { 604 WebRtcOpus_EncoderFree(encoder_); 605 } 606 607 virtual void SetUp() OVERRIDE { 608 AudioDecoderTest::SetUp(); 609 // Upsample from 32 to 48 kHz. 610 // Because Opus is 48 kHz codec but the input file is 32 kHz, so the data 611 // read in |AudioDecoderTest::SetUp| has to be upsampled. 612 // |AudioDecoderTest::SetUp| has read |data_length_| samples, which is more 613 // than necessary after upsampling, so the end of audio that has been read 614 // is unused and the end of the buffer is overwritten by the resampled data. 615 Resampler rs; 616 rs.Reset(32000, 48000, kResamplerSynchronous); 617 const int before_resamp_len_samples = static_cast<int>(data_length_) * 2 618 / 3; 619 int16_t* before_resamp_input = new int16_t[before_resamp_len_samples]; 620 memcpy(before_resamp_input, input_, 621 sizeof(int16_t) * before_resamp_len_samples); 622 int resamp_len_samples; 623 EXPECT_EQ(0, rs.Push(before_resamp_input, before_resamp_len_samples, 624 input_, static_cast<int>(data_length_), 625 resamp_len_samples)); 626 EXPECT_EQ(static_cast<int>(data_length_), resamp_len_samples); 627 delete[] before_resamp_input; 628 } 629 630 virtual void InitEncoder() {} 631 632 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 633 uint8_t* output) OVERRIDE { 634 int enc_len_bytes = WebRtcOpus_Encode(encoder_, const_cast<int16_t*>(input), 635 static_cast<int16_t>(input_len_samples), 636 static_cast<int16_t>(data_length_), output); 637 EXPECT_GT(enc_len_bytes, 0); 638 return enc_len_bytes; 639 } 640 641 OpusEncInst* encoder_; 642 }; 643 644 class AudioDecoderOpusStereoTest : public AudioDecoderOpusTest { 645 protected: 646 AudioDecoderOpusStereoTest() : AudioDecoderOpusTest() { 647 channels_ = 2; 648 WebRtcOpus_EncoderFree(encoder_); 649 delete decoder_; 650 decoder_ = new AudioDecoderOpus(kDecoderOpus_2ch); 651 assert(decoder_); 652 WebRtcOpus_EncoderCreate(&encoder_, 2); 653 } 654 655 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples, 656 uint8_t* output) OVERRIDE { 657 // Create stereo by duplicating each sample in |input|. 658 const int input_stereo_samples = static_cast<int>(input_len_samples) * 2; 659 int16_t* input_stereo = new int16_t[input_stereo_samples]; 660 for (size_t i = 0; i < input_len_samples; i++) 661 input_stereo[i * 2] = input_stereo[i * 2 + 1] = input[i]; 662 663 int enc_len_bytes = WebRtcOpus_Encode( 664 encoder_, input_stereo, static_cast<int16_t>(input_len_samples), 665 static_cast<int16_t>(data_length_), output); 666 EXPECT_GT(enc_len_bytes, 0); 667 delete[] input_stereo; 668 return enc_len_bytes; 669 } 670 }; 671 672 TEST_F(AudioDecoderPcmUTest, EncodeDecode) { 673 int tolerance = 251; 674 double mse = 1734.0; 675 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu)); 676 EncodeDecodeTest(data_length_, tolerance, mse); 677 ReInitTest(); 678 EXPECT_FALSE(decoder_->HasDecodePlc()); 679 } 680 681 TEST_F(AudioDecoderPcmATest, EncodeDecode) { 682 int tolerance = 308; 683 double mse = 1931.0; 684 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa)); 685 EncodeDecodeTest(data_length_, tolerance, mse); 686 ReInitTest(); 687 EXPECT_FALSE(decoder_->HasDecodePlc()); 688 } 689 690 TEST_F(AudioDecoderPcm16BTest, EncodeDecode) { 691 int tolerance = 0; 692 double mse = 0.0; 693 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B)); 694 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb)); 695 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz)); 696 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz)); 697 EncodeDecodeTest(2 * data_length_, tolerance, mse); 698 ReInitTest(); 699 EXPECT_FALSE(decoder_->HasDecodePlc()); 700 } 701 702 TEST_F(AudioDecoderIlbcTest, EncodeDecode) { 703 int tolerance = 6808; 704 double mse = 2.13e6; 705 int delay = 80; // Delay from input to output. 706 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderILBC)); 707 EncodeDecodeTest(500, tolerance, mse, delay); 708 ReInitTest(); 709 EXPECT_TRUE(decoder_->HasDecodePlc()); 710 DecodePlcTest(); 711 } 712 713 TEST_F(AudioDecoderIsacFloatTest, EncodeDecode) { 714 int tolerance = 3399; 715 double mse = 434951.0; 716 int delay = 48; // Delay from input to output. 717 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC)); 718 EncodeDecodeTest(0, tolerance, mse, delay); 719 ReInitTest(); 720 EXPECT_TRUE(decoder_->HasDecodePlc()); 721 DecodePlcTest(); 722 } 723 724 TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) { 725 int tolerance = 19757; 726 double mse = 8.18e6; 727 int delay = 160; // Delay from input to output. 728 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb)); 729 EncodeDecodeTest(0, tolerance, mse, delay); 730 ReInitTest(); 731 EXPECT_TRUE(decoder_->HasDecodePlc()); 732 DecodePlcTest(); 733 } 734 735 TEST_F(AudioDecoderIsacFbTest, EncodeDecode) { 736 int tolerance = 19757; 737 double mse = 8.18e6; 738 int delay = 160; // Delay from input to output. 739 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb)); 740 EncodeDecodeTest(0, tolerance, mse, delay); 741 ReInitTest(); 742 EXPECT_TRUE(decoder_->HasDecodePlc()); 743 DecodePlcTest(); 744 } 745 746 TEST_F(AudioDecoderIsacFixTest, DISABLED_EncodeDecode) { 747 int tolerance = 11034; 748 double mse = 3.46e6; 749 int delay = 54; // Delay from input to output. 750 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC)); 751 EncodeDecodeTest(735, tolerance, mse, delay); 752 ReInitTest(); 753 EXPECT_FALSE(decoder_->HasDecodePlc()); 754 } 755 756 TEST_F(AudioDecoderG722Test, EncodeDecode) { 757 int tolerance = 6176; 758 double mse = 238630.0; 759 int delay = 22; // Delay from input to output. 760 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722)); 761 EncodeDecodeTest(data_length_ / 2, tolerance, mse, delay); 762 ReInitTest(); 763 EXPECT_FALSE(decoder_->HasDecodePlc()); 764 } 765 766 TEST_F(AudioDecoderG722StereoTest, CreateAndDestroy) { 767 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch)); 768 } 769 770 TEST_F(AudioDecoderG722StereoTest, EncodeDecode) { 771 int tolerance = 6176; 772 int channel_diff_tolerance = 0; 773 double mse = 238630.0; 774 int delay = 22; // Delay from input to output. 775 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch)); 776 EncodeDecodeTest(data_length_, tolerance, mse, delay, channel_diff_tolerance); 777 ReInitTest(); 778 EXPECT_FALSE(decoder_->HasDecodePlc()); 779 } 780 781 TEST_F(AudioDecoderOpusTest, EncodeDecode) { 782 int tolerance = 6176; 783 double mse = 238630.0; 784 int delay = 22; // Delay from input to output. 785 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus)); 786 EncodeDecodeTest(0, tolerance, mse, delay); 787 ReInitTest(); 788 EXPECT_FALSE(decoder_->HasDecodePlc()); 789 } 790 791 TEST_F(AudioDecoderOpusStereoTest, EncodeDecode) { 792 int tolerance = 6176; 793 int channel_diff_tolerance = 0; 794 double mse = 238630.0; 795 int delay = 22; // Delay from input to output. 796 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus_2ch)); 797 EncodeDecodeTest(0, tolerance, mse, delay, channel_diff_tolerance); 798 ReInitTest(); 799 EXPECT_FALSE(decoder_->HasDecodePlc()); 800 } 801 802 #ifdef WEBRTC_CODEC_CELT 803 // In the two following CELT tests, the low amplitude of the test signal allow 804 // us to have such low error thresholds, i.e. |tolerance|, |mse|. Furthermore, 805 // in general, stereo signals with identical channels do not result in identical 806 // encoded channels. 807 TEST_F(AudioDecoderCeltTest, EncodeDecode) { 808 int tolerance = 20; 809 double mse = 17.0; 810 int delay = 80; // Delay from input to output in samples. 811 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32)); 812 EncodeDecodeTest(1600, tolerance, mse, delay); 813 ReInitTest(); 814 EXPECT_TRUE(decoder_->HasDecodePlc()); 815 DecodePlcTest(); 816 } 817 818 TEST_F(AudioDecoderCeltStereoTest, EncodeDecode) { 819 int tolerance = 20; 820 // If both channels are identical, CELT not necessarily decodes identical 821 // channels. However, for this input this is the case. 822 int channel_diff_tolerance = 0; 823 double mse = 20.0; 824 // Delay from input to output in samples, accounting for stereo. 825 int delay = 160; 826 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch)); 827 EncodeDecodeTest(1600, tolerance, mse, delay, channel_diff_tolerance); 828 ReInitTest(); 829 EXPECT_TRUE(decoder_->HasDecodePlc()); 830 DecodePlcTest(); 831 } 832 #endif 833 834 TEST(AudioDecoder, CodecSampleRateHz) { 835 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMu)); 836 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMa)); 837 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMu_2ch)); 838 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMa_2ch)); 839 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderILBC)); 840 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderISAC)); 841 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderISACswb)); 842 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderISACfb)); 843 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B)); 844 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bwb)); 845 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb32kHz)); 846 EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb48kHz)); 847 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B_2ch)); 848 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bwb_2ch)); 849 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb32kHz_2ch)); 850 EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb48kHz_2ch)); 851 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B_5ch)); 852 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderG722)); 853 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderG722_2ch)); 854 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderRED)); 855 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderAVT)); 856 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderCNGnb)); 857 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderCNGwb)); 858 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCNGswb32kHz)); 859 EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderOpus)); 860 EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderOpus_2ch)); 861 // TODO(tlegrand): Change 32000 to 48000 below once ACM has 48 kHz support. 862 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCNGswb48kHz)); 863 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderArbitrary)); 864 #ifdef WEBRTC_CODEC_CELT 865 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32)); 866 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32_2ch)); 867 #else 868 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32)); 869 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32_2ch)); 870 #endif 871 } 872 873 TEST(AudioDecoder, CodecSupported) { 874 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu)); 875 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa)); 876 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu_2ch)); 877 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa_2ch)); 878 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderILBC)); 879 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC)); 880 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb)); 881 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACfb)); 882 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B)); 883 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb)); 884 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz)); 885 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz)); 886 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B_2ch)); 887 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb_2ch)); 888 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz_2ch)); 889 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz_2ch)); 890 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B_5ch)); 891 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722)); 892 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch)); 893 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderRED)); 894 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderAVT)); 895 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGnb)); 896 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGwb)); 897 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGswb32kHz)); 898 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGswb48kHz)); 899 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderArbitrary)); 900 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus)); 901 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus_2ch)); 902 #ifdef WEBRTC_CODEC_CELT 903 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32)); 904 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch)); 905 #else 906 EXPECT_FALSE(AudioDecoder::CodecSupported(kDecoderCELT_32)); 907 EXPECT_FALSE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch)); 908 #endif 909 } 910 911 } // namespace webrtc 912