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"
19 #include "testing/gtest/include/gtest/gtest.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/g711/include/audio_encoder_pcm.h"
25 #include "webrtc/modules/audio_coding/codecs/g722/include/g722_interface.h"
26 #include "webrtc/modules/audio_coding/codecs/ilbc/interface/ilbc.h"
27 #include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h"
28 #include "webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h"
29 #include "webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h"
30 #include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h"
31 #include "webrtc/modules/audio_coding/neteq/tools/resample_input_audio_file.h"
32 #include "webrtc/system_wrappers/interface/data_log.h"
33 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
34 #include "webrtc/test/testsupport/fileutils.h"
39 // The absolute difference between the input and output (the first channel) is
40 // compared vs |tolerance|. The parameter |delay| is used to correct for codec
42 void CompareInputOutput(const std::vector<int16_t>& input,
43 const std::vector<int16_t>& output,
48 ASSERT_LE(num_samples, input.size());
49 ASSERT_LE(num_samples * channels, output.size());
50 for (unsigned int n = 0; n < num_samples - delay; ++n) {
51 ASSERT_NEAR(input[n], output[channels * n + delay], tolerance)
52 << "Exit test on first diff; n = " << n;
53 DataLog::InsertCell("CodecTest", "input", input[n]);
54 DataLog::InsertCell("CodecTest", "output", output[channels * n]);
55 DataLog::NextRow("CodecTest");
59 // The absolute difference between the first two channels in |output| is
60 // compared vs |tolerance|.
61 void CompareTwoChannels(const std::vector<int16_t>& output,
62 size_t samples_per_channel,
65 ASSERT_GE(channels, 2u);
66 ASSERT_LE(samples_per_channel * channels, output.size());
67 for (unsigned int n = 0; n < samples_per_channel; ++n)
68 ASSERT_NEAR(output[channels * n], output[channels * n + 1], tolerance)
69 << "Stereo samples differ.";
72 // Calculates mean-squared error between input and output (the first channel).
73 // The parameter |delay| is used to correct for codec delays.
74 double MseInputOutput(const std::vector<int16_t>& input,
75 const std::vector<int16_t>& output,
79 assert(delay < static_cast<int>(num_samples));
80 assert(num_samples <= input.size());
81 assert(num_samples * channels <= output.size());
84 double squared_sum = 0.0;
85 for (unsigned int n = 0; n < num_samples - delay; ++n) {
86 squared_sum += (input[n] - output[channels * n + delay]) *
87 (input[n] - output[channels * n + delay]);
89 return squared_sum / (num_samples - delay);
93 class AudioDecoderTest : public ::testing::Test {
96 : input_audio_(webrtc::test::ProjectRootPath() +
97 "resources/audio_coding/testfile32kHz.pcm",
99 codec_input_rate_hz_(32000), // Legacy default value.
105 output_timestamp_(0),
108 virtual ~AudioDecoderTest() {}
110 virtual void SetUp() {
112 codec_input_rate_hz_ = audio_encoder_->sample_rate_hz();
114 ASSERT_GT(data_length_, 0u) << "The test must set data_length_ > 0";
115 // Longest encoded data is produced by PCM16b with 2 bytes per sample.
116 encoded_ = new uint8_t[data_length_ * 2];
117 // Logging to view input and output in Matlab.
118 // Use 'gyp -Denable_data_logging=1' to enable logging.
119 DataLog::CreateLog();
120 DataLog::AddTable("CodecTest");
121 DataLog::AddColumn("CodecTest", "input", 1);
122 DataLog::AddColumn("CodecTest", "output", 1);
125 virtual void TearDown() {
132 DataLog::ReturnLog();
135 virtual void InitEncoder() { }
137 // TODO(henrik.lundin) Change return type to size_t once most/all overriding
138 // implementations are gone.
139 virtual int EncodeFrame(const int16_t* input,
140 size_t input_len_samples,
142 size_t enc_len_bytes = 0;
143 scoped_ptr<int16_t[]> interleaved_input(
144 new int16_t[channels_ * input_len_samples]);
145 for (int i = 0; i < audio_encoder_->Num10MsFramesInNextPacket(); ++i) {
146 EXPECT_EQ(0u, enc_len_bytes);
148 // Duplicate the mono input signal to however many channels the test
150 test::InputAudioFile::DuplicateInterleaved(
151 input, input_len_samples, channels_, interleaved_input.get());
153 EXPECT_TRUE(audio_encoder_->Encode(
154 0, interleaved_input.get(), audio_encoder_->sample_rate_hz() / 100,
155 data_length_ * 2, output, &enc_len_bytes, &output_timestamp_));
157 return static_cast<int>(enc_len_bytes);
160 // Encodes and decodes audio. The absolute difference between the input and
161 // output is compared vs |tolerance|, and the mean-squared error is compared
162 // with |mse|. The encoded stream should contain |expected_bytes|. For stereo
163 // audio, the absolute difference between the two channels is compared vs
164 // |channel_diff_tolerance|.
165 void EncodeDecodeTest(size_t expected_bytes, int tolerance, double mse,
166 int delay = 0, int channel_diff_tolerance = 0) {
167 ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0";
168 ASSERT_GE(channel_diff_tolerance, 0) <<
169 "Test must define a channel_diff_tolerance >= 0";
170 size_t processed_samples = 0u;
173 EXPECT_EQ(0, decoder_->Init());
174 std::vector<int16_t> input;
175 std::vector<int16_t> decoded;
176 while (processed_samples + frame_size_ <= data_length_) {
177 // Extend input vector with |frame_size_|.
178 input.resize(input.size() + frame_size_, 0);
179 // Read from input file.
180 ASSERT_GE(input.size() - processed_samples, frame_size_);
181 ASSERT_TRUE(input_audio_.Read(
182 frame_size_, codec_input_rate_hz_, &input[processed_samples]));
183 size_t enc_len = EncodeFrame(
184 &input[processed_samples], frame_size_, &encoded_[encoded_bytes_]);
185 // Make sure that frame_size_ * channels_ samples are allocated and free.
186 decoded.resize((processed_samples + frame_size_) * channels_, 0);
187 AudioDecoder::SpeechType speech_type;
188 size_t dec_len = decoder_->Decode(&encoded_[encoded_bytes_],
190 &decoded[processed_samples * channels_],
192 EXPECT_EQ(frame_size_ * channels_, dec_len);
193 encoded_bytes_ += enc_len;
194 processed_samples += frame_size_;
196 // For some codecs it doesn't make sense to check expected number of bytes,
197 // since the number can vary for different platforms. Opus and iSAC are
198 // such codecs. In this case expected_bytes is set to 0.
199 if (expected_bytes) {
200 EXPECT_EQ(expected_bytes, encoded_bytes_);
203 input, decoded, processed_samples, channels_, tolerance, delay);
206 decoded, processed_samples, channels_, channel_diff_tolerance);
208 MseInputOutput(input, decoded, processed_samples, channels_, delay),
212 // Encodes a payload and decodes it twice with decoder re-init before each
213 // decode. Verifies that the decoded result is the same.
216 scoped_ptr<int16_t[]> input(new int16_t[frame_size_]);
218 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
219 size_t enc_len = EncodeFrame(input.get(), frame_size_, encoded_);
221 AudioDecoder::SpeechType speech_type1, speech_type2;
222 EXPECT_EQ(0, decoder_->Init());
223 scoped_ptr<int16_t[]> output1(new int16_t[frame_size_ * channels_]);
224 dec_len = decoder_->Decode(encoded_, enc_len, output1.get(), &speech_type1);
225 ASSERT_LE(dec_len, frame_size_ * channels_);
226 EXPECT_EQ(frame_size_ * channels_, dec_len);
227 // Re-init decoder and decode again.
228 EXPECT_EQ(0, decoder_->Init());
229 scoped_ptr<int16_t[]> output2(new int16_t[frame_size_ * channels_]);
230 dec_len = decoder_->Decode(encoded_, enc_len, output2.get(), &speech_type2);
231 ASSERT_LE(dec_len, frame_size_ * channels_);
232 EXPECT_EQ(frame_size_ * channels_, dec_len);
233 for (unsigned int n = 0; n < frame_size_; ++n) {
234 ASSERT_EQ(output1[n], output2[n]) << "Exit test on first diff; n = " << n;
236 EXPECT_EQ(speech_type1, speech_type2);
239 // Call DecodePlc and verify that the correct number of samples is produced.
240 void DecodePlcTest() {
242 scoped_ptr<int16_t[]> input(new int16_t[frame_size_]);
244 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
245 size_t enc_len = EncodeFrame(input.get(), frame_size_, encoded_);
246 AudioDecoder::SpeechType speech_type;
247 EXPECT_EQ(0, decoder_->Init());
248 scoped_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
250 decoder_->Decode(encoded_, enc_len, output.get(), &speech_type);
251 EXPECT_EQ(frame_size_ * channels_, dec_len);
252 // Call DecodePlc and verify that we get one frame of data.
253 // (Overwrite the output from the above Decode call, but that does not
255 dec_len = decoder_->DecodePlc(1, output.get());
256 EXPECT_EQ(frame_size_ * channels_, dec_len);
259 test::ResampleInputAudioFile input_audio_;
260 int codec_input_rate_hz_;
264 size_t encoded_bytes_;
266 uint32_t output_timestamp_;
267 AudioDecoder* decoder_;
268 scoped_ptr<AudioEncoder> audio_encoder_;
271 class AudioDecoderPcmUTest : public AudioDecoderTest {
273 AudioDecoderPcmUTest() : AudioDecoderTest() {
275 data_length_ = 10 * frame_size_;
276 decoder_ = new AudioDecoderPcmU;
277 AudioEncoderPcmU::Config config;
278 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
279 audio_encoder_.reset(new AudioEncoderPcmU(config));
283 class AudioDecoderPcmATest : public AudioDecoderTest {
285 AudioDecoderPcmATest() : AudioDecoderTest() {
287 data_length_ = 10 * frame_size_;
288 decoder_ = new AudioDecoderPcmA;
289 AudioEncoderPcmA::Config config;
290 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
291 audio_encoder_.reset(new AudioEncoderPcmA(config));
295 class AudioDecoderPcm16BTest : public AudioDecoderTest {
297 AudioDecoderPcm16BTest() : AudioDecoderTest() {
298 codec_input_rate_hz_ = 8000;
300 data_length_ = 10 * frame_size_;
301 decoder_ = new AudioDecoderPcm16B;
305 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
307 int enc_len_bytes = WebRtcPcm16b_EncodeW16(
308 const_cast<int16_t*>(input), static_cast<int>(input_len_samples),
309 reinterpret_cast<int16_t*>(output));
310 EXPECT_EQ(2 * input_len_samples, static_cast<size_t>(enc_len_bytes));
311 return enc_len_bytes;
315 class AudioDecoderIlbcTest : public AudioDecoderTest {
317 AudioDecoderIlbcTest() : AudioDecoderTest() {
318 codec_input_rate_hz_ = 8000;
320 data_length_ = 10 * frame_size_;
321 decoder_ = new AudioDecoderIlbc;
323 WebRtcIlbcfix_EncoderCreate(&encoder_);
326 ~AudioDecoderIlbcTest() {
327 WebRtcIlbcfix_EncoderFree(encoder_);
330 virtual void InitEncoder() {
331 ASSERT_EQ(0, WebRtcIlbcfix_EncoderInit(encoder_, 30)); // 30 ms.
334 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
337 WebRtcIlbcfix_Encode(encoder_, input,
338 static_cast<int>(input_len_samples),
339 reinterpret_cast<int16_t*>(output));
340 EXPECT_EQ(50, enc_len_bytes);
341 return enc_len_bytes;
344 // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does
345 // not return any data. It simply resets a few states and returns 0.
346 void DecodePlcTest() {
348 scoped_ptr<int16_t[]> input(new int16_t[frame_size_]);
350 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
351 size_t enc_len = EncodeFrame(input.get(), frame_size_, encoded_);
352 AudioDecoder::SpeechType speech_type;
353 EXPECT_EQ(0, decoder_->Init());
354 scoped_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
356 decoder_->Decode(encoded_, enc_len, output.get(), &speech_type);
357 EXPECT_EQ(frame_size_, dec_len);
358 // Simply call DecodePlc and verify that we get 0 as return value.
359 EXPECT_EQ(0, decoder_->DecodePlc(1, output.get()));
362 iLBC_encinst_t* encoder_;
365 class AudioDecoderIsacFloatTest : public AudioDecoderTest {
367 AudioDecoderIsacFloatTest() : AudioDecoderTest() {
368 codec_input_rate_hz_ = 16000;
371 data_length_ = 10 * frame_size_;
372 decoder_ = new AudioDecoderIsac(16000);
374 WebRtcIsac_Create(&encoder_);
375 WebRtcIsac_SetEncSampRate(encoder_, 16000);
378 ~AudioDecoderIsacFloatTest() {
379 WebRtcIsac_Free(encoder_);
382 virtual void InitEncoder() {
383 ASSERT_EQ(0, WebRtcIsac_EncoderInit(encoder_, 1)); // Fixed mode.
384 ASSERT_EQ(0, WebRtcIsac_Control(encoder_, 32000, 30)); // 32 kbps, 30 ms.
387 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
389 // Insert 3 * 10 ms. Expect non-zero output on third call.
390 EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output));
391 input += input_size_;
392 EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output));
393 input += input_size_;
394 int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output);
395 EXPECT_GT(enc_len_bytes, 0);
396 return enc_len_bytes;
399 ISACStruct* encoder_;
403 class AudioDecoderIsacSwbTest : public AudioDecoderTest {
405 AudioDecoderIsacSwbTest() : AudioDecoderTest() {
406 codec_input_rate_hz_ = 32000;
409 data_length_ = 10 * frame_size_;
410 decoder_ = new AudioDecoderIsac(32000);
412 WebRtcIsac_Create(&encoder_);
413 WebRtcIsac_SetEncSampRate(encoder_, 32000);
416 ~AudioDecoderIsacSwbTest() {
417 WebRtcIsac_Free(encoder_);
420 virtual void InitEncoder() {
421 ASSERT_EQ(0, WebRtcIsac_EncoderInit(encoder_, 1)); // Fixed mode.
422 ASSERT_EQ(0, WebRtcIsac_Control(encoder_, 32000, 30)); // 32 kbps, 30 ms.
425 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
427 // Insert 3 * 10 ms. Expect non-zero output on third call.
428 EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output));
429 input += input_size_;
430 EXPECT_EQ(0, WebRtcIsac_Encode(encoder_, input, output));
431 input += input_size_;
432 int enc_len_bytes = WebRtcIsac_Encode(encoder_, input, output);
433 EXPECT_GT(enc_len_bytes, 0);
434 return enc_len_bytes;
437 ISACStruct* encoder_;
441 class AudioDecoderIsacFixTest : public AudioDecoderTest {
443 AudioDecoderIsacFixTest() : AudioDecoderTest() {
444 codec_input_rate_hz_ = 16000;
447 data_length_ = 10 * frame_size_;
448 decoder_ = new AudioDecoderIsacFix;
450 WebRtcIsacfix_Create(&encoder_);
453 ~AudioDecoderIsacFixTest() {
454 WebRtcIsacfix_Free(encoder_);
457 virtual void InitEncoder() {
458 ASSERT_EQ(0, WebRtcIsacfix_EncoderInit(encoder_, 1)); // Fixed mode.
460 WebRtcIsacfix_Control(encoder_, 32000, 30)); // 32 kbps, 30 ms.
463 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
465 // Insert 3 * 10 ms. Expect non-zero output on third call.
466 EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output));
467 input += input_size_;
468 EXPECT_EQ(0, WebRtcIsacfix_Encode(encoder_, input, output));
469 input += input_size_;
470 int enc_len_bytes = WebRtcIsacfix_Encode(encoder_, input, output);
471 EXPECT_GT(enc_len_bytes, 0);
472 return enc_len_bytes;
475 ISACFIX_MainStruct* encoder_;
479 class AudioDecoderG722Test : public AudioDecoderTest {
481 AudioDecoderG722Test() : AudioDecoderTest() {
482 codec_input_rate_hz_ = 16000;
484 data_length_ = 10 * frame_size_;
485 decoder_ = new AudioDecoderG722;
487 WebRtcG722_CreateEncoder(&encoder_);
490 ~AudioDecoderG722Test() {
491 WebRtcG722_FreeEncoder(encoder_);
494 virtual void InitEncoder() {
495 ASSERT_EQ(0, WebRtcG722_EncoderInit(encoder_));
498 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
501 WebRtcG722_Encode(encoder_, const_cast<int16_t*>(input),
502 static_cast<int>(input_len_samples),
503 reinterpret_cast<int16_t*>(output));
504 EXPECT_EQ(80, enc_len_bytes);
505 return enc_len_bytes;
508 G722EncInst* encoder_;
511 class AudioDecoderG722StereoTest : public AudioDecoderG722Test {
513 AudioDecoderG722StereoTest() : AudioDecoderG722Test() {
515 // Delete the |decoder_| that was created by AudioDecoderG722Test and
516 // create an AudioDecoderG722Stereo object instead.
518 decoder_ = new AudioDecoderG722Stereo;
522 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
524 uint8_t* temp_output = new uint8_t[data_length_ * 2];
525 // Encode a mono payload using the base test class.
526 int mono_enc_len_bytes =
527 AudioDecoderG722Test::EncodeFrame(input, input_len_samples,
529 // The bit-stream consists of 4-bit samples:
530 // +--------+--------+--------+
531 // | s0 s1 | s2 s3 | s4 s5 |
532 // +--------+--------+--------+
534 // Duplicate them to the |output| such that the stereo stream becomes:
535 // +--------+--------+--------+
536 // | s0 s0 | s1 s1 | s2 s2 |
537 // +--------+--------+--------+
538 EXPECT_LE(mono_enc_len_bytes * 2, static_cast<int>(data_length_ * 2));
539 uint8_t* output_ptr = output;
540 for (int i = 0; i < mono_enc_len_bytes; ++i) {
541 *output_ptr = (temp_output[i] & 0xF0) + (temp_output[i] >> 4);
543 *output_ptr = (temp_output[i] << 4) + (temp_output[i] & 0x0F);
546 delete [] temp_output;
547 return mono_enc_len_bytes * 2;
551 #ifdef WEBRTC_CODEC_CELT
552 class AudioDecoderCeltTest : public AudioDecoderTest {
554 static const int kEncodingRateBitsPerSecond = 64000;
555 AudioDecoderCeltTest() : AudioDecoderTest(), encoder_(NULL) {
557 data_length_ = 10 * frame_size_;
558 decoder_ = AudioDecoder::CreateAudioDecoder(kDecoderCELT_32);
560 WebRtcCelt_CreateEnc(&encoder_, static_cast<int>(channels_));
563 ~AudioDecoderCeltTest() {
564 WebRtcCelt_FreeEnc(encoder_);
567 virtual void InitEncoder() {
569 ASSERT_EQ(0, WebRtcCelt_EncoderInit(
570 encoder_, static_cast<int>(channels_), kEncodingRateBitsPerSecond));
573 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
576 return WebRtcCelt_Encode(encoder_, input, output);
579 CELT_encinst_t* encoder_;
582 class AudioDecoderCeltStereoTest : public AudioDecoderTest {
584 static const int kEncodingRateBitsPerSecond = 64000;
585 AudioDecoderCeltStereoTest() : AudioDecoderTest(), encoder_(NULL) {
588 data_length_ = 10 * frame_size_;
589 decoder_ = AudioDecoder::CreateAudioDecoder(kDecoderCELT_32_2ch);
591 stereo_input_ = new int16_t[frame_size_ * channels_];
592 WebRtcCelt_CreateEnc(&encoder_, static_cast<int>(channels_));
595 ~AudioDecoderCeltStereoTest() {
596 delete [] stereo_input_;
597 WebRtcCelt_FreeEnc(encoder_);
600 virtual void InitEncoder() {
602 ASSERT_EQ(0, WebRtcCelt_EncoderInit(
603 encoder_, static_cast<int>(channels_), kEncodingRateBitsPerSecond));
606 virtual int EncodeFrame(const int16_t* input, size_t input_len_samples,
609 assert(stereo_input_);
610 for (size_t n = 0; n < frame_size_; ++n) {
611 stereo_input_[n * 2] = stereo_input_[n * 2 + 1] = input[n];
613 return WebRtcCelt_Encode(encoder_, stereo_input_, output);
616 int16_t* stereo_input_;
617 CELT_encinst_t* encoder_;
622 class AudioDecoderOpusTest : public AudioDecoderTest {
624 AudioDecoderOpusTest() : AudioDecoderTest() {
625 codec_input_rate_hz_ = 48000;
627 data_length_ = 10 * frame_size_;
628 decoder_ = new AudioDecoderOpus(1);
629 AudioEncoderOpus::Config config;
630 config.frame_size_ms = static_cast<int>(frame_size_) / 48;
631 audio_encoder_.reset(new AudioEncoderOpus(config));
635 class AudioDecoderOpusStereoTest : public AudioDecoderOpusTest {
637 AudioDecoderOpusStereoTest() : AudioDecoderOpusTest() {
640 decoder_ = new AudioDecoderOpus(2);
641 AudioEncoderOpus::Config config;
642 config.frame_size_ms = static_cast<int>(frame_size_) / 48;
643 config.num_channels = 2;
644 audio_encoder_.reset(new AudioEncoderOpus(config));
648 TEST_F(AudioDecoderPcmUTest, EncodeDecode) {
651 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu));
652 EncodeDecodeTest(data_length_, tolerance, mse);
654 EXPECT_FALSE(decoder_->HasDecodePlc());
657 TEST_F(AudioDecoderPcmATest, EncodeDecode) {
660 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa));
661 EncodeDecodeTest(data_length_, tolerance, mse);
663 EXPECT_FALSE(decoder_->HasDecodePlc());
666 TEST_F(AudioDecoderPcm16BTest, EncodeDecode) {
669 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B));
670 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb));
671 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz));
672 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz));
673 EncodeDecodeTest(2 * data_length_, tolerance, mse);
675 EXPECT_FALSE(decoder_->HasDecodePlc());
678 TEST_F(AudioDecoderIlbcTest, EncodeDecode) {
679 int tolerance = 6808;
681 int delay = 80; // Delay from input to output.
682 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderILBC));
683 EncodeDecodeTest(500, tolerance, mse, delay);
685 EXPECT_TRUE(decoder_->HasDecodePlc());
689 TEST_F(AudioDecoderIsacFloatTest, EncodeDecode) {
690 int tolerance = 3399;
691 double mse = 434951.0;
692 int delay = 48; // Delay from input to output.
693 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC));
694 EncodeDecodeTest(0, tolerance, mse, delay);
696 EXPECT_TRUE(decoder_->HasDecodePlc());
700 TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) {
701 int tolerance = 19757;
703 int delay = 160; // Delay from input to output.
704 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb));
705 EncodeDecodeTest(0, tolerance, mse, delay);
707 EXPECT_TRUE(decoder_->HasDecodePlc());
711 TEST_F(AudioDecoderIsacFixTest, DISABLED_EncodeDecode) {
712 int tolerance = 11034;
714 int delay = 54; // Delay from input to output.
715 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC));
716 EncodeDecodeTest(735, tolerance, mse, delay);
718 EXPECT_FALSE(decoder_->HasDecodePlc());
721 TEST_F(AudioDecoderG722Test, EncodeDecode) {
722 int tolerance = 6176;
723 double mse = 238630.0;
724 int delay = 22; // Delay from input to output.
725 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722));
726 EncodeDecodeTest(data_length_ / 2, tolerance, mse, delay);
728 EXPECT_FALSE(decoder_->HasDecodePlc());
731 TEST_F(AudioDecoderG722StereoTest, CreateAndDestroy) {
732 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch));
735 TEST_F(AudioDecoderG722StereoTest, EncodeDecode) {
736 int tolerance = 6176;
737 int channel_diff_tolerance = 0;
738 double mse = 238630.0;
739 int delay = 22; // Delay from input to output.
740 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch));
741 EncodeDecodeTest(data_length_, tolerance, mse, delay, channel_diff_tolerance);
743 EXPECT_FALSE(decoder_->HasDecodePlc());
746 TEST_F(AudioDecoderOpusTest, EncodeDecode) {
747 int tolerance = 6176;
748 double mse = 238630.0;
749 int delay = 22; // Delay from input to output.
750 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus));
751 EncodeDecodeTest(0, tolerance, mse, delay);
753 EXPECT_FALSE(decoder_->HasDecodePlc());
756 TEST_F(AudioDecoderOpusStereoTest, EncodeDecode) {
757 int tolerance = 6176;
758 int channel_diff_tolerance = 0;
759 double mse = 238630.0;
760 int delay = 22; // Delay from input to output.
761 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus_2ch));
762 EncodeDecodeTest(0, tolerance, mse, delay, channel_diff_tolerance);
764 EXPECT_FALSE(decoder_->HasDecodePlc());
767 #ifdef WEBRTC_CODEC_CELT
768 // In the two following CELT tests, the low amplitude of the test signal allow
769 // us to have such low error thresholds, i.e. |tolerance|, |mse|. Furthermore,
770 // in general, stereo signals with identical channels do not result in identical
772 TEST_F(AudioDecoderCeltTest, EncodeDecode) {
775 int delay = 80; // Delay from input to output in samples.
776 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32));
777 EncodeDecodeTest(1600, tolerance, mse, delay);
779 EXPECT_TRUE(decoder_->HasDecodePlc());
783 TEST_F(AudioDecoderCeltStereoTest, EncodeDecode) {
785 // If both channels are identical, CELT not necessarily decodes identical
786 // channels. However, for this input this is the case.
787 int channel_diff_tolerance = 0;
789 // Delay from input to output in samples, accounting for stereo.
791 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch));
792 EncodeDecodeTest(1600, tolerance, mse, delay, channel_diff_tolerance);
794 EXPECT_TRUE(decoder_->HasDecodePlc());
799 TEST(AudioDecoder, CodecSampleRateHz) {
800 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMu));
801 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMa));
802 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMu_2ch));
803 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCMa_2ch));
804 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderILBC));
805 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderISAC));
806 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderISACswb));
807 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderISACfb));
808 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B));
809 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bwb));
810 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb32kHz));
811 EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb48kHz));
812 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B_2ch));
813 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bwb_2ch));
814 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb32kHz_2ch));
815 EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16Bswb48kHz_2ch));
816 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderPCM16B_5ch));
817 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderG722));
818 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderG722_2ch));
819 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderRED));
820 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderAVT));
821 EXPECT_EQ(8000, AudioDecoder::CodecSampleRateHz(kDecoderCNGnb));
822 EXPECT_EQ(16000, AudioDecoder::CodecSampleRateHz(kDecoderCNGwb));
823 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCNGswb32kHz));
824 EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderOpus));
825 EXPECT_EQ(48000, AudioDecoder::CodecSampleRateHz(kDecoderOpus_2ch));
826 // TODO(tlegrand): Change 32000 to 48000 below once ACM has 48 kHz support.
827 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCNGswb48kHz));
828 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderArbitrary));
829 #ifdef WEBRTC_CODEC_CELT
830 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32));
831 EXPECT_EQ(32000, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32_2ch));
833 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32));
834 EXPECT_EQ(-1, AudioDecoder::CodecSampleRateHz(kDecoderCELT_32_2ch));
838 TEST(AudioDecoder, CodecSupported) {
839 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu));
840 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa));
841 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMu_2ch));
842 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCMa_2ch));
843 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderILBC));
844 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISAC));
845 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACswb));
846 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderISACfb));
847 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B));
848 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb));
849 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz));
850 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz));
851 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B_2ch));
852 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bwb_2ch));
853 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb32kHz_2ch));
854 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16Bswb48kHz_2ch));
855 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderPCM16B_5ch));
856 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722));
857 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderG722_2ch));
858 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderRED));
859 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderAVT));
860 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGnb));
861 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGwb));
862 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGswb32kHz));
863 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCNGswb48kHz));
864 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderArbitrary));
865 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus));
866 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderOpus_2ch));
867 #ifdef WEBRTC_CODEC_CELT
868 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32));
869 EXPECT_TRUE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch));
871 EXPECT_FALSE(AudioDecoder::CodecSupported(kDecoderCELT_32));
872 EXPECT_FALSE(AudioDecoder::CodecSupported(kDecoderCELT_32_2ch));
876 } // namespace webrtc