2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
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.
11 #include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
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"
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"
35 class AudioDecoderTest : public ::testing::Test {
47 input_file_ = webrtc::test::ProjectRootPath() +
48 "resources/audio_coding/testfile32kHz.pcm";
51 virtual ~AudioDecoderTest() {}
53 virtual void SetUp() {
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_];
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.
70 DataLog::AddTable("CodecTest");
71 DataLog::AddColumn("CodecTest", "input", 1);
72 DataLog::AddColumn("CodecTest", "output", 1);
75 virtual void TearDown() {
91 virtual void InitEncoder() { }
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,
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;
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 *
119 EXPECT_EQ(frame_size_ * channels_, dec_len);
120 encoded_bytes_ += enc_len;
121 processed_samples += frame_size_;
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_);
129 CompareInputOutput(processed_samples, tolerance, delay);
131 CompareTwoChannels(processed_samples, channel_diff_tolerance);
132 EXPECT_LE(MseInputOutput(processed_samples, delay), mse);
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
138 virtual void CompareInputOutput(size_t num_samples, int tolerance,
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");
150 // The absolute difference between the two channels in a stereo is compared vs
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.";
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]);
170 return squared_sum / (num_samples - delay);
173 // Encodes a payload and decodes it twice with decoder re-init before each
174 // decode. Verifies that the decoded result is the same.
176 int16_t* output1 = decoded_;
177 int16_t* output2 = decoded_ + frame_size_;
179 size_t enc_len = EncodeFrame(input_, frame_size_, encoded_);
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;
192 EXPECT_EQ(speech_type1, speech_type2);
195 // Call DecodePlc and verify that the correct number of samples is produced.
196 void DecodePlcTest() {
198 size_t enc_len = EncodeFrame(input_, frame_size_, encoded_);
199 AudioDecoder::SpeechType speech_type;
200 EXPECT_EQ(0, decoder_->Init());
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
207 dec_len = decoder_->DecodePlc(1, decoded_);
208 EXPECT_EQ(frame_size_ * channels_, dec_len);
211 std::string input_file_;
218 size_t encoded_bytes_;
220 AudioDecoder* decoder_;
223 class AudioDecoderPcmUTest : public AudioDecoderTest {
225 AudioDecoderPcmUTest() : AudioDecoderTest() {
227 data_length_ = 10 * frame_size_;
228 decoder_ = new AudioDecoderPcmU;
232 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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;
243 class AudioDecoderPcmATest : public AudioDecoderTest {
245 AudioDecoderPcmATest() : AudioDecoderTest() {
247 data_length_ = 10 * frame_size_;
248 decoder_ = new AudioDecoderPcmA;
252 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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;
263 class AudioDecoderPcm16BTest : public AudioDecoderTest {
265 AudioDecoderPcm16BTest() : AudioDecoderTest() {
267 data_length_ = 10 * frame_size_;
268 decoder_ = new AudioDecoderPcm16B(kDecoderPCM16B);
272 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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;
282 class AudioDecoderIlbcTest : public AudioDecoderTest {
284 AudioDecoderIlbcTest() : AudioDecoderTest() {
286 data_length_ = 10 * frame_size_;
287 decoder_ = new AudioDecoderIlbc;
289 WebRtcIlbcfix_EncoderCreate(&encoder_);
292 ~AudioDecoderIlbcTest() {
293 WebRtcIlbcfix_EncoderFree(encoder_);
296 virtual void InitEncoder() {
297 ASSERT_EQ(0, WebRtcIlbcfix_EncoderInit(encoder_, 30)); // 30 ms.
300 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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;
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() {
314 size_t enc_len = EncodeFrame(input_, frame_size_, encoded_);
315 AudioDecoder::SpeechType speech_type;
316 EXPECT_EQ(0, decoder_->Init());
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_));
324 iLBC_encinst_t* encoder_;
327 class AudioDecoderIsacFloatTest : public AudioDecoderTest {
329 AudioDecoderIsacFloatTest() : AudioDecoderTest() {
332 data_length_ = 10 * frame_size_;
333 decoder_ = new AudioDecoderIsac;
335 WebRtcIsac_Create(&encoder_);
336 WebRtcIsac_SetEncSampRate(encoder_, 16000);
339 ~AudioDecoderIsacFloatTest() {
340 WebRtcIsac_Free(encoder_);
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.
348 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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;
360 ISACStruct* encoder_;
364 class AudioDecoderIsacSwbTest : public AudioDecoderTest {
366 AudioDecoderIsacSwbTest() : AudioDecoderTest() {
369 data_length_ = 10 * frame_size_;
370 decoder_ = new AudioDecoderIsacSwb;
372 WebRtcIsac_Create(&encoder_);
373 WebRtcIsac_SetEncSampRate(encoder_, 32000);
376 ~AudioDecoderIsacSwbTest() {
377 WebRtcIsac_Free(encoder_);
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.
385 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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;
397 ISACStruct* encoder_;
401 // This test is identical to AudioDecoderIsacSwbTest, except that it creates
402 // an AudioDecoderIsacFb decoder object.
403 class AudioDecoderIsacFbTest : public AudioDecoderIsacSwbTest {
405 AudioDecoderIsacFbTest() : AudioDecoderIsacSwbTest() {
406 // Delete the |decoder_| that was created by AudioDecoderIsacSwbTest and
407 // create an AudioDecoderIsacFb object instead.
409 decoder_ = new AudioDecoderIsacFb;
414 class AudioDecoderIsacFixTest : public AudioDecoderTest {
416 AudioDecoderIsacFixTest() : AudioDecoderTest() {
419 data_length_ = 10 * frame_size_;
420 decoder_ = new AudioDecoderIsacFix;
422 WebRtcIsacfix_Create(&encoder_);
425 ~AudioDecoderIsacFixTest() {
426 WebRtcIsacfix_Free(encoder_);
429 virtual void InitEncoder() {
430 ASSERT_EQ(0, WebRtcIsacfix_EncoderInit(encoder_, 1)); // Fixed mode.
432 WebRtcIsacfix_Control(encoder_, 32000, 30)); // 32 kbps, 30 ms.
435 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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;
447 ISACFIX_MainStruct* encoder_;
451 class AudioDecoderG722Test : public AudioDecoderTest {
453 AudioDecoderG722Test() : AudioDecoderTest() {
455 data_length_ = 10 * frame_size_;
456 decoder_ = new AudioDecoderG722;
458 WebRtcG722_CreateEncoder(&encoder_);
461 ~AudioDecoderG722Test() {
462 WebRtcG722_FreeEncoder(encoder_);
465 virtual void InitEncoder() {
466 ASSERT_EQ(0, WebRtcG722_EncoderInit(encoder_));
469 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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;
479 G722EncInst* encoder_;
482 class AudioDecoderG722StereoTest : public AudioDecoderG722Test {
484 AudioDecoderG722StereoTest() : AudioDecoderG722Test() {
486 // Delete the |decoder_| that was created by AudioDecoderG722Test and
487 // create an AudioDecoderG722Stereo object instead.
489 decoder_ = new AudioDecoderG722Stereo;
493 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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,
500 // The bit-stream consists of 4-bit samples:
501 // +--------+--------+--------+
502 // | s0 s1 | s2 s3 | s4 s5 |
503 // +--------+--------+--------+
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);
514 *output_ptr = (temp_output[i] << 4) + (temp_output[i] & 0x0F);
517 delete [] temp_output;
518 return mono_enc_len_bytes * 2;
522 #ifdef WEBRTC_CODEC_CELT
523 class AudioDecoderCeltTest : public AudioDecoderTest {
525 static const int kEncodingRateBitsPerSecond = 64000;
526 AudioDecoderCeltTest() : AudioDecoderTest(), encoder_(NULL) {
528 data_length_ = 10 * frame_size_;
529 decoder_ = AudioDecoder::CreateAudioDecoder(kDecoderCELT_32);
531 WebRtcCelt_CreateEnc(&encoder_, static_cast<int>(channels_));
534 ~AudioDecoderCeltTest() {
535 WebRtcCelt_FreeEnc(encoder_);
538 virtual void InitEncoder() {
540 ASSERT_EQ(0, WebRtcCelt_EncoderInit(
541 encoder_, static_cast<int>(channels_), kEncodingRateBitsPerSecond));
544 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
547 return WebRtcCelt_Encode(encoder_, input, output);
550 CELT_encinst_t* encoder_;
553 class AudioDecoderCeltStereoTest : public AudioDecoderTest {
555 static const int kEncodingRateBitsPerSecond = 64000;
556 AudioDecoderCeltStereoTest() : AudioDecoderTest(), encoder_(NULL) {
559 data_length_ = 10 * frame_size_;
560 decoder_ = AudioDecoder::CreateAudioDecoder(kDecoderCELT_32_2ch);
562 stereo_input_ = new int16_t[frame_size_ * channels_];
563 WebRtcCelt_CreateEnc(&encoder_, static_cast<int>(channels_));
566 ~AudioDecoderCeltStereoTest() {
567 delete [] stereo_input_;
568 WebRtcCelt_FreeEnc(encoder_);
571 virtual void InitEncoder() {
573 ASSERT_EQ(0, WebRtcCelt_EncoderInit(
574 encoder_, static_cast<int>(channels_), kEncodingRateBitsPerSecond));
577 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
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];
584 return WebRtcCelt_Encode(encoder_, stereo_input_, output);
587 int16_t* stereo_input_;
588 CELT_encinst_t* encoder_;
593 class AudioDecoderOpusTest : public AudioDecoderTest {
595 AudioDecoderOpusTest() : AudioDecoderTest() {
597 data_length_ = 10 * frame_size_;
598 decoder_ = new AudioDecoderOpus(kDecoderOpus);
600 WebRtcOpus_EncoderCreate(&encoder_, 1);
603 ~AudioDecoderOpusTest() {
604 WebRtcOpus_EncoderFree(encoder_);
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.
616 rs.Reset(32000, 48000, kResamplerSynchronous);
617 const int before_resamp_len_samples = static_cast<int>(data_length_) * 2
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;
630 virtual void InitEncoder() {}
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;
641 OpusEncInst* encoder_;
644 class AudioDecoderOpusStereoTest : public AudioDecoderOpusTest {
646 AudioDecoderOpusStereoTest() : AudioDecoderOpusTest() {
648 WebRtcOpus_EncoderFree(encoder_);
650 decoder_ = new AudioDecoderOpus(kDecoderOpus_2ch);
652 WebRtcOpus_EncoderCreate(&encoder_, 2);
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];
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;
672 TEST_F(AudioDecoderPcmUTest, EncodeDecode) {
675 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu));
676 EncodeDecodeTest(data_length_, tolerance, mse);
678 EXPECT_FALSE(decoder_->HasDecodePlc());
681 TEST_F(AudioDecoderPcmATest, EncodeDecode) {
684 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa));
685 EncodeDecodeTest(data_length_, tolerance, mse);
687 EXPECT_FALSE(decoder_->HasDecodePlc());
690 TEST_F(AudioDecoderPcm16BTest, EncodeDecode) {
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);
699 EXPECT_FALSE(decoder_->HasDecodePlc());
702 TEST_F(AudioDecoderIlbcTest, EncodeDecode) {
703 int tolerance = 6808;
705 int delay = 80; // Delay from input to output.
706 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderILBC));
707 EncodeDecodeTest(500, tolerance, mse, delay);
709 EXPECT_TRUE(decoder_->HasDecodePlc());
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);
720 EXPECT_TRUE(decoder_->HasDecodePlc());
724 TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) {
725 int tolerance = 19757;
727 int delay = 160; // Delay from input to output.
728 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb));
729 EncodeDecodeTest(0, tolerance, mse, delay);
731 EXPECT_TRUE(decoder_->HasDecodePlc());
735 TEST_F(AudioDecoderIsacFbTest, EncodeDecode) {
736 int tolerance = 19757;
738 int delay = 160; // Delay from input to output.
739 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb));
740 EncodeDecodeTest(0, tolerance, mse, delay);
742 EXPECT_TRUE(decoder_->HasDecodePlc());
746 TEST_F(AudioDecoderIsacFixTest, DISABLED_EncodeDecode) {
747 int tolerance = 11034;
749 int delay = 54; // Delay from input to output.
750 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC));
751 EncodeDecodeTest(735, tolerance, mse, delay);
753 EXPECT_FALSE(decoder_->HasDecodePlc());
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);
763 EXPECT_FALSE(decoder_->HasDecodePlc());
766 TEST_F(AudioDecoderG722StereoTest, CreateAndDestroy) {
767 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch));
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);
778 EXPECT_FALSE(decoder_->HasDecodePlc());
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);
788 EXPECT_FALSE(decoder_->HasDecodePlc());
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);
799 EXPECT_FALSE(decoder_->HasDecodePlc());
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
807 TEST_F(AudioDecoderCeltTest, EncodeDecode) {
810 int delay = 80; // Delay from input to output in samples.
811 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32));
812 EncodeDecodeTest(1600, tolerance, mse, delay);
814 EXPECT_TRUE(decoder_->HasDecodePlc());
818 TEST_F(AudioDecoderCeltStereoTest, EncodeDecode) {
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;
824 // Delay from input to output in samples, accounting for stereo.
826 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch));
827 EncodeDecodeTest(1600, tolerance, mse, delay, channel_diff_tolerance);
829 EXPECT_TRUE(decoder_->HasDecodePlc());
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));
868 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32));
869 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32_2ch));
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));
906 EXPECT_FALSE(AudioDecoder::CodecSupported(kDecoderCELT_32));
907 EXPECT_FALSE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch));
911 } // namespace webrtc