blob: f6ae2ddaac52a993d58ffa79b0b68f617141ad98 [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +00001/*
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
henrik.lundin@webrtc.org9c55f0f2014-06-09 08:10:28 +000011#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000012
13#include <assert.h>
14#include <stdlib.h>
15
kwiberg2d0c3322016-02-14 09:28:33 -080016#include <memory>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000017#include <string>
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000018#include <vector>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000019
kwiberg96da0112017-06-30 04:23:22 -070020#include "webrtc/api/audio_codecs/opus/audio_encoder_opus.h"
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +010021#include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
22#include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
23#include "webrtc/modules/audio_coding/codecs/g722/audio_decoder_g722.h"
24#include "webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.h"
25#include "webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h"
26#include "webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h"
Henrik Kjellander74640892015-10-29 11:31:02 +010027#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h"
28#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"
29#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h"
30#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +010031#include "webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.h"
kjellander@webrtc.org3c652b62015-11-18 23:07:57 +010032#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h"
33#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h"
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000034#include "webrtc/modules/audio_coding/neteq/tools/resample_input_audio_file.h"
kwibergac9f8762016-09-30 22:29:43 -070035#include "webrtc/test/gtest.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000036#include "webrtc/test/testsupport/fileutils.h"
37
38namespace webrtc {
39
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000040namespace {
41// The absolute difference between the input and output (the first channel) is
42// compared vs |tolerance|. The parameter |delay| is used to correct for codec
43// delays.
44void CompareInputOutput(const std::vector<int16_t>& input,
45 const std::vector<int16_t>& output,
46 size_t num_samples,
47 size_t channels,
48 int tolerance,
49 int delay) {
50 ASSERT_LE(num_samples, input.size());
51 ASSERT_LE(num_samples * channels, output.size());
52 for (unsigned int n = 0; n < num_samples - delay; ++n) {
53 ASSERT_NEAR(input[n], output[channels * n + delay], tolerance)
54 << "Exit test on first diff; n = " << n;
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000055 }
56}
57
58// The absolute difference between the first two channels in |output| is
59// compared vs |tolerance|.
60void CompareTwoChannels(const std::vector<int16_t>& output,
61 size_t samples_per_channel,
62 size_t channels,
63 int tolerance) {
64 ASSERT_GE(channels, 2u);
65 ASSERT_LE(samples_per_channel * channels, output.size());
66 for (unsigned int n = 0; n < samples_per_channel; ++n)
67 ASSERT_NEAR(output[channels * n], output[channels * n + 1], tolerance)
68 << "Stereo samples differ.";
69}
70
71// Calculates mean-squared error between input and output (the first channel).
72// The parameter |delay| is used to correct for codec delays.
73double MseInputOutput(const std::vector<int16_t>& input,
74 const std::vector<int16_t>& output,
75 size_t num_samples,
76 size_t channels,
77 int delay) {
78 assert(delay < static_cast<int>(num_samples));
79 assert(num_samples <= input.size());
80 assert(num_samples * channels <= output.size());
81 if (num_samples == 0)
82 return 0.0;
83 double squared_sum = 0.0;
84 for (unsigned int n = 0; n < num_samples - delay; ++n) {
85 squared_sum += (input[n] - output[channels * n + delay]) *
86 (input[n] - output[channels * n + delay]);
87 }
88 return squared_sum / (num_samples - delay);
89}
90} // namespace
91
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000092class AudioDecoderTest : public ::testing::Test {
93 protected:
94 AudioDecoderTest()
kjellander02060002016-02-16 22:06:12 -080095 : input_audio_(
96 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
97 32000),
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000098 codec_input_rate_hz_(32000), // Legacy default value.
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +000099 frame_size_(0),
100 data_length_(0),
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000101 channels_(1),
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000102 payload_type_(17),
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000103 decoder_(NULL) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000104
105 virtual ~AudioDecoderTest() {}
106
107 virtual void SetUp() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000108 if (audio_encoder_)
kwiberg@webrtc.org05211272015-02-18 12:00:32 +0000109 codec_input_rate_hz_ = audio_encoder_->SampleRateHz();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000110 // Create arrays.
111 ASSERT_GT(data_length_, 0u) << "The test must set data_length_ > 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000112 }
113
114 virtual void TearDown() {
115 delete decoder_;
116 decoder_ = NULL;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000117 }
118
119 virtual void InitEncoder() { }
120
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000121 // TODO(henrik.lundin) Change return type to size_t once most/all overriding
122 // implementations are gone.
123 virtual int EncodeFrame(const int16_t* input,
124 size_t input_len_samples,
ossu10a029e2016-03-01 00:41:31 -0800125 rtc::Buffer* output) {
126 AudioEncoder::EncodedInfo encoded_info;
kwiberg@webrtc.org05211272015-02-18 12:00:32 +0000127 const size_t samples_per_10ms = audio_encoder_->SampleRateHz() / 100;
henrikg91d6ede2015-09-17 00:24:34 -0700128 RTC_CHECK_EQ(samples_per_10ms * audio_encoder_->Num10MsFramesInNextPacket(),
129 input_len_samples);
kwiberg2d0c3322016-02-14 09:28:33 -0800130 std::unique_ptr<int16_t[]> interleaved_input(
henrik.lundin@webrtc.org130fef82014-12-08 21:07:59 +0000131 new int16_t[channels_ * samples_per_10ms]);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700132 for (size_t i = 0; i < audio_encoder_->Num10MsFramesInNextPacket(); ++i) {
ossu10a029e2016-03-01 00:41:31 -0800133 EXPECT_EQ(0u, encoded_info.encoded_bytes);
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000134
135 // Duplicate the mono input signal to however many channels the test
136 // wants.
henrik.lundin@webrtc.org130fef82014-12-08 21:07:59 +0000137 test::InputAudioFile::DuplicateInterleaved(input + i * samples_per_10ms,
138 samples_per_10ms, channels_,
139 interleaved_input.get());
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000140
ossu10a029e2016-03-01 00:41:31 -0800141 encoded_info = audio_encoder_->Encode(
kwiberg288886b2015-11-06 01:21:35 -0800142 0, rtc::ArrayView<const int16_t>(interleaved_input.get(),
143 audio_encoder_->NumChannels() *
144 audio_encoder_->SampleRateHz() /
145 100),
ossu10a029e2016-03-01 00:41:31 -0800146 output);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000147 }
ossu10a029e2016-03-01 00:41:31 -0800148 EXPECT_EQ(payload_type_, encoded_info.payload_type);
149 return static_cast<int>(encoded_info.encoded_bytes);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000150 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000151
152 // Encodes and decodes audio. The absolute difference between the input and
153 // output is compared vs |tolerance|, and the mean-squared error is compared
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000154 // with |mse|. The encoded stream should contain |expected_bytes|. For stereo
155 // audio, the absolute difference between the two channels is compared vs
156 // |channel_diff_tolerance|.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000157 void EncodeDecodeTest(size_t expected_bytes, int tolerance, double mse,
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000158 int delay = 0, int channel_diff_tolerance = 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000159 ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0";
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000160 ASSERT_GE(channel_diff_tolerance, 0) <<
161 "Test must define a channel_diff_tolerance >= 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000162 size_t processed_samples = 0u;
ossu10a029e2016-03-01 00:41:31 -0800163 rtc::Buffer encoded;
164 size_t encoded_bytes = 0u;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000165 InitEncoder();
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000166 std::vector<int16_t> input;
167 std::vector<int16_t> decoded;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000168 while (processed_samples + frame_size_ <= data_length_) {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000169 // Extend input vector with |frame_size_|.
170 input.resize(input.size() + frame_size_, 0);
171 // Read from input file.
172 ASSERT_GE(input.size() - processed_samples, frame_size_);
173 ASSERT_TRUE(input_audio_.Read(
174 frame_size_, codec_input_rate_hz_, &input[processed_samples]));
175 size_t enc_len = EncodeFrame(
ossu10a029e2016-03-01 00:41:31 -0800176 &input[processed_samples], frame_size_, &encoded);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000177 // Make sure that frame_size_ * channels_ samples are allocated and free.
178 decoded.resize((processed_samples + frame_size_) * channels_, 0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000179 AudioDecoder::SpeechType speech_type;
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000180 size_t dec_len = decoder_->Decode(
ossu10a029e2016-03-01 00:41:31 -0800181 &encoded.data()[encoded_bytes], enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000182 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000183 &decoded[processed_samples * channels_], &speech_type);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000184 EXPECT_EQ(frame_size_ * channels_, dec_len);
ossu10a029e2016-03-01 00:41:31 -0800185 encoded_bytes += enc_len;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000186 processed_samples += frame_size_;
187 }
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000188 // For some codecs it doesn't make sense to check expected number of bytes,
189 // since the number can vary for different platforms. Opus and iSAC are
190 // such codecs. In this case expected_bytes is set to 0.
191 if (expected_bytes) {
ossu10a029e2016-03-01 00:41:31 -0800192 EXPECT_EQ(expected_bytes, encoded_bytes);
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000193 }
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000194 CompareInputOutput(
195 input, decoded, processed_samples, channels_, tolerance, delay);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000196 if (channels_ == 2)
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000197 CompareTwoChannels(
198 decoded, processed_samples, channels_, channel_diff_tolerance);
199 EXPECT_LE(
200 MseInputOutput(input, decoded, processed_samples, channels_, delay),
201 mse);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000202 }
203
204 // Encodes a payload and decodes it twice with decoder re-init before each
205 // decode. Verifies that the decoded result is the same.
206 void ReInitTest() {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000207 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800208 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000209 ASSERT_TRUE(
210 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800211 rtc::Buffer encoded;
212 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000213 size_t dec_len;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000214 AudioDecoder::SpeechType speech_type1, speech_type2;
Karl Wiberg43766482015-08-27 15:22:11 +0200215 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800216 std::unique_ptr<int16_t[]> output1(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800217 dec_len = decoder_->Decode(encoded.data(), enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000218 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000219 output1.get(), &speech_type1);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000220 ASSERT_LE(dec_len, frame_size_ * channels_);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000221 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000222 // Re-init decoder and decode again.
Karl Wiberg43766482015-08-27 15:22:11 +0200223 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800224 std::unique_ptr<int16_t[]> output2(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800225 dec_len = decoder_->Decode(encoded.data(), enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000226 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000227 output2.get(), &speech_type2);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000228 ASSERT_LE(dec_len, frame_size_ * channels_);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000229 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000230 for (unsigned int n = 0; n < frame_size_; ++n) {
231 ASSERT_EQ(output1[n], output2[n]) << "Exit test on first diff; n = " << n;
232 }
233 EXPECT_EQ(speech_type1, speech_type2);
234 }
235
236 // Call DecodePlc and verify that the correct number of samples is produced.
237 void DecodePlcTest() {
238 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800239 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000240 ASSERT_TRUE(
241 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800242 rtc::Buffer encoded;
243 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000244 AudioDecoder::SpeechType speech_type;
Karl Wiberg43766482015-08-27 15:22:11 +0200245 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800246 std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800247 size_t dec_len = decoder_->Decode(encoded.data(), enc_len,
248 codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000249 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000250 output.get(), &speech_type);
turaj@webrtc.org6ad6a072013-09-30 20:07:39 +0000251 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000252 // Call DecodePlc and verify that we get one frame of data.
253 // (Overwrite the output from the above Decode call, but that does not
254 // matter.)
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000255 dec_len = decoder_->DecodePlc(1, output.get());
turaj@webrtc.org6ad6a072013-09-30 20:07:39 +0000256 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000257 }
258
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000259 test::ResampleInputAudioFile input_audio_;
260 int codec_input_rate_hz_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000261 size_t frame_size_;
262 size_t data_length_;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000263 size_t channels_;
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000264 const int payload_type_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000265 AudioDecoder* decoder_;
kwiberg2d0c3322016-02-14 09:28:33 -0800266 std::unique_ptr<AudioEncoder> audio_encoder_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000267};
268
269class AudioDecoderPcmUTest : public AudioDecoderTest {
270 protected:
271 AudioDecoderPcmUTest() : AudioDecoderTest() {
272 frame_size_ = 160;
273 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700274 decoder_ = new AudioDecoderPcmU(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000275 AudioEncoderPcmU::Config config;
276 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000277 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000278 audio_encoder_.reset(new AudioEncoderPcmU(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000279 }
280};
281
282class AudioDecoderPcmATest : public AudioDecoderTest {
283 protected:
284 AudioDecoderPcmATest() : AudioDecoderTest() {
285 frame_size_ = 160;
286 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700287 decoder_ = new AudioDecoderPcmA(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000288 AudioEncoderPcmA::Config config;
289 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000290 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000291 audio_encoder_.reset(new AudioEncoderPcmA(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000292 }
293};
294
295class AudioDecoderPcm16BTest : public AudioDecoderTest {
296 protected:
297 AudioDecoderPcm16BTest() : AudioDecoderTest() {
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000298 codec_input_rate_hz_ = 16000;
299 frame_size_ = 20 * codec_input_rate_hz_ / 1000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000300 data_length_ = 10 * frame_size_;
kwiberg6c2eab32016-05-31 02:46:20 -0700301 decoder_ = new AudioDecoderPcm16B(codec_input_rate_hz_, 1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000302 assert(decoder_);
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000303 AudioEncoderPcm16B::Config config;
304 config.sample_rate_hz = codec_input_rate_hz_;
305 config.frame_size_ms =
306 static_cast<int>(frame_size_ / (config.sample_rate_hz / 1000));
307 config.payload_type = payload_type_;
308 audio_encoder_.reset(new AudioEncoderPcm16B(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000309 }
310};
311
312class AudioDecoderIlbcTest : public AudioDecoderTest {
313 protected:
314 AudioDecoderIlbcTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000315 codec_input_rate_hz_ = 8000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000316 frame_size_ = 240;
317 data_length_ = 10 * frame_size_;
solenbergdb3c9b02017-06-28 02:05:04 -0700318 decoder_ = new AudioDecoderIlbcImpl;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000319 assert(decoder_);
solenbergdb3c9b02017-06-28 02:05:04 -0700320 AudioEncoderIlbcConfig config;
kwiberg@webrtc.orgcb858ba2014-12-08 17:11:44 +0000321 config.frame_size_ms = 30;
solenbergdb3c9b02017-06-28 02:05:04 -0700322 audio_encoder_.reset(new AudioEncoderIlbcImpl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000323 }
324
325 // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does
326 // not return any data. It simply resets a few states and returns 0.
327 void DecodePlcTest() {
328 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800329 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000330 ASSERT_TRUE(
331 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800332 rtc::Buffer encoded;
333 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000334 AudioDecoder::SpeechType speech_type;
Karl Wiberg43766482015-08-27 15:22:11 +0200335 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800336 std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800337 size_t dec_len = decoder_->Decode(encoded.data(), enc_len,
338 codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000339 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000340 output.get(), &speech_type);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000341 EXPECT_EQ(frame_size_, dec_len);
342 // Simply call DecodePlc and verify that we get 0 as return value.
Peter Kastingdce40cf2015-08-24 14:52:23 -0700343 EXPECT_EQ(0U, decoder_->DecodePlc(1, output.get()));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000344 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000345};
346
347class AudioDecoderIsacFloatTest : public AudioDecoderTest {
348 protected:
349 AudioDecoderIsacFloatTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000350 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000351 frame_size_ = 480;
352 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700353 AudioEncoderIsacFloatImpl::Config config;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000354 config.payload_type = payload_type_;
355 config.sample_rate_hz = codec_input_rate_hz_;
Karl Wibergd3e8eda2015-04-23 14:07:06 +0200356 config.adaptive_mode = false;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000357 config.frame_size_ms =
358 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700359 audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
360 decoder_ = new AudioDecoderIsacFloatImpl(codec_input_rate_hz_);
turaj@webrtc.org1431e4d2014-11-11 01:44:13 +0000361 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000362};
363
364class AudioDecoderIsacSwbTest : public AudioDecoderTest {
365 protected:
366 AudioDecoderIsacSwbTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000367 codec_input_rate_hz_ = 32000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000368 frame_size_ = 960;
369 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700370 AudioEncoderIsacFloatImpl::Config config;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000371 config.payload_type = payload_type_;
372 config.sample_rate_hz = codec_input_rate_hz_;
Karl Wibergd3e8eda2015-04-23 14:07:06 +0200373 config.adaptive_mode = false;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000374 config.frame_size_ms =
375 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700376 audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
377 decoder_ = new AudioDecoderIsacFloatImpl(codec_input_rate_hz_);
turaj@webrtc.org1431e4d2014-11-11 01:44:13 +0000378 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000379};
380
381class AudioDecoderIsacFixTest : public AudioDecoderTest {
382 protected:
383 AudioDecoderIsacFixTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000384 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000385 frame_size_ = 480;
386 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700387 AudioEncoderIsacFixImpl::Config config;
kwiberg@webrtc.org88bdec82014-12-16 12:49:37 +0000388 config.payload_type = payload_type_;
389 config.sample_rate_hz = codec_input_rate_hz_;
Karl Wibergd3e8eda2015-04-23 14:07:06 +0200390 config.adaptive_mode = false;
kwiberg@webrtc.org88bdec82014-12-16 12:49:37 +0000391 config.frame_size_ms =
392 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700393 audio_encoder_.reset(new AudioEncoderIsacFixImpl(config));
394 decoder_ = new AudioDecoderIsacFixImpl(codec_input_rate_hz_);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000395 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000396};
397
398class AudioDecoderG722Test : public AudioDecoderTest {
399 protected:
400 AudioDecoderG722Test() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000401 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000402 frame_size_ = 160;
403 data_length_ = 10 * frame_size_;
kwibergb1ed7f02017-06-17 17:30:09 -0700404 decoder_ = new AudioDecoderG722Impl;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000405 assert(decoder_);
kwibergb8727ae2017-06-17 17:41:59 -0700406 AudioEncoderG722Config config;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000407 config.frame_size_ms = 10;
408 config.num_channels = 1;
kwibergb8727ae2017-06-17 17:41:59 -0700409 audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000410 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000411};
412
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000413class AudioDecoderG722StereoTest : public AudioDecoderTest {
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000414 protected:
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000415 AudioDecoderG722StereoTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000416 channels_ = 2;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000417 codec_input_rate_hz_ = 16000;
418 frame_size_ = 160;
419 data_length_ = 10 * frame_size_;
kwiberg1b97e262017-06-26 04:19:43 -0700420 decoder_ = new AudioDecoderG722StereoImpl;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000421 assert(decoder_);
kwibergb8727ae2017-06-17 17:41:59 -0700422 AudioEncoderG722Config config;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000423 config.frame_size_ms = 10;
424 config.num_channels = 2;
kwibergb8727ae2017-06-17 17:41:59 -0700425 audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000426 }
427};
428
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000429class AudioDecoderOpusTest : public AudioDecoderTest {
430 protected:
431 AudioDecoderOpusTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000432 codec_input_rate_hz_ = 48000;
minyue@webrtc.orgf563e852014-07-18 21:11:27 +0000433 frame_size_ = 480;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000434 data_length_ = 10 * frame_size_;
kwiberg96d74bb2017-06-30 05:24:56 -0700435 decoder_ = new AudioDecoderOpusImpl(1);
kwiberg96da0112017-06-30 04:23:22 -0700436 AudioEncoderOpusConfig config;
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000437 config.frame_size_ms = static_cast<int>(frame_size_) / 48;
kwiberg96da0112017-06-30 04:23:22 -0700438 config.application = AudioEncoderOpusConfig::ApplicationMode::kVoip;
439 audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000440 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000441};
442
minyue@webrtc.orgf563e852014-07-18 21:11:27 +0000443class AudioDecoderOpusStereoTest : public AudioDecoderOpusTest {
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000444 protected:
minyue@webrtc.orgf563e852014-07-18 21:11:27 +0000445 AudioDecoderOpusStereoTest() : AudioDecoderOpusTest() {
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000446 channels_ = 2;
minyue@webrtc.orgf563e852014-07-18 21:11:27 +0000447 delete decoder_;
kwiberg96d74bb2017-06-30 05:24:56 -0700448 decoder_ = new AudioDecoderOpusImpl(2);
kwiberg96da0112017-06-30 04:23:22 -0700449 AudioEncoderOpusConfig config;
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000450 config.frame_size_ms = static_cast<int>(frame_size_) / 48;
451 config.num_channels = 2;
kwiberg96da0112017-06-30 04:23:22 -0700452 config.application = AudioEncoderOpusConfig::ApplicationMode::kAudio;
453 audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000454 }
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000455};
456
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000457TEST_F(AudioDecoderPcmUTest, EncodeDecode) {
458 int tolerance = 251;
459 double mse = 1734.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000460 EncodeDecodeTest(data_length_, tolerance, mse);
461 ReInitTest();
462 EXPECT_FALSE(decoder_->HasDecodePlc());
463}
464
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200465namespace {
466int SetAndGetTargetBitrate(AudioEncoder* audio_encoder, int rate) {
michaelt566d8202017-01-12 10:17:38 -0800467 audio_encoder->OnReceivedUplinkBandwidth(rate, rtc::Optional<int64_t>());
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200468 return audio_encoder->GetTargetBitrate();
469}
470void TestSetAndGetTargetBitratesWithFixedCodec(AudioEncoder* audio_encoder,
471 int fixed_rate) {
472 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, 32000));
473 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate - 1));
474 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate));
475 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate + 1));
476}
477} // namespace
478
479TEST_F(AudioDecoderPcmUTest, SetTargetBitrate) {
480 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
481}
482
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000483TEST_F(AudioDecoderPcmATest, EncodeDecode) {
484 int tolerance = 308;
485 double mse = 1931.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000486 EncodeDecodeTest(data_length_, tolerance, mse);
487 ReInitTest();
488 EXPECT_FALSE(decoder_->HasDecodePlc());
489}
490
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200491TEST_F(AudioDecoderPcmATest, SetTargetBitrate) {
492 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
493}
494
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000495TEST_F(AudioDecoderPcm16BTest, EncodeDecode) {
496 int tolerance = 0;
497 double mse = 0.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000498 EncodeDecodeTest(2 * data_length_, tolerance, mse);
499 ReInitTest();
500 EXPECT_FALSE(decoder_->HasDecodePlc());
501}
502
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200503TEST_F(AudioDecoderPcm16BTest, SetTargetBitrate) {
504 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(),
505 codec_input_rate_hz_ * 16);
506}
507
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000508TEST_F(AudioDecoderIlbcTest, EncodeDecode) {
509 int tolerance = 6808;
510 double mse = 2.13e6;
511 int delay = 80; // Delay from input to output.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000512 EncodeDecodeTest(500, tolerance, mse, delay);
513 ReInitTest();
514 EXPECT_TRUE(decoder_->HasDecodePlc());
515 DecodePlcTest();
516}
517
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200518TEST_F(AudioDecoderIlbcTest, SetTargetBitrate) {
519 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 13333);
520}
521
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000522TEST_F(AudioDecoderIsacFloatTest, EncodeDecode) {
523 int tolerance = 3399;
524 double mse = 434951.0;
525 int delay = 48; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000526 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000527 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000528 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000529}
530
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200531TEST_F(AudioDecoderIsacFloatTest, SetTargetBitrate) {
532 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
533}
534
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000535TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) {
536 int tolerance = 19757;
537 double mse = 8.18e6;
538 int delay = 160; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000539 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000540 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000541 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000542}
543
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200544TEST_F(AudioDecoderIsacSwbTest, SetTargetBitrate) {
545 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
546}
547
kwiberg5b659c02015-12-11 07:33:59 -0800548TEST_F(AudioDecoderIsacFixTest, EncodeDecode) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000549 int tolerance = 11034;
550 double mse = 3.46e6;
551 int delay = 54; // Delay from input to output.
kwiberg5b659c02015-12-11 07:33:59 -0800552#if defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM)
kwiberg@webrtc.orge102e812014-12-17 07:30:23 +0000553 static const int kEncodedBytes = 685;
kwiberg5b659c02015-12-11 07:33:59 -0800554#elif defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM64)
555 static const int kEncodedBytes = 673;
kwiberg@webrtc.orge102e812014-12-17 07:30:23 +0000556#else
557 static const int kEncodedBytes = 671;
558#endif
559 EncodeDecodeTest(kEncodedBytes, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000560 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000561 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000562}
563
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200564TEST_F(AudioDecoderIsacFixTest, SetTargetBitrate) {
565 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
566}
567
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000568TEST_F(AudioDecoderG722Test, EncodeDecode) {
569 int tolerance = 6176;
570 double mse = 238630.0;
571 int delay = 22; // Delay from input to output.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000572 EncodeDecodeTest(data_length_ / 2, tolerance, mse, delay);
573 ReInitTest();
574 EXPECT_FALSE(decoder_->HasDecodePlc());
575}
576
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200577TEST_F(AudioDecoderG722Test, SetTargetBitrate) {
578 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
579}
580
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000581TEST_F(AudioDecoderG722StereoTest, EncodeDecode) {
582 int tolerance = 6176;
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000583 int channel_diff_tolerance = 0;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000584 double mse = 238630.0;
585 int delay = 22; // Delay from input to output.
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000586 EncodeDecodeTest(data_length_, tolerance, mse, delay, channel_diff_tolerance);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000587 ReInitTest();
588 EXPECT_FALSE(decoder_->HasDecodePlc());
589}
590
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200591TEST_F(AudioDecoderG722StereoTest, SetTargetBitrate) {
592 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 128000);
593}
594
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000595TEST_F(AudioDecoderOpusTest, EncodeDecode) {
596 int tolerance = 6176;
597 double mse = 238630.0;
598 int delay = 22; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000599 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000600 ReInitTest();
601 EXPECT_FALSE(decoder_->HasDecodePlc());
602}
603
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200604namespace {
605void TestOpusSetTargetBitrates(AudioEncoder* audio_encoder) {
michaelt54340d82017-01-31 09:06:53 -0800606 EXPECT_EQ(6000, SetAndGetTargetBitrate(audio_encoder, 5999));
607 EXPECT_EQ(6000, SetAndGetTargetBitrate(audio_encoder, 6000));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200608 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder, 32000));
ossua1a040a2017-04-06 10:03:21 -0700609 EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder, 510000));
610 EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder, 511000));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200611}
612} // namespace
613
614TEST_F(AudioDecoderOpusTest, SetTargetBitrate) {
615 TestOpusSetTargetBitrates(audio_encoder_.get());
616}
617
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000618TEST_F(AudioDecoderOpusStereoTest, EncodeDecode) {
619 int tolerance = 6176;
620 int channel_diff_tolerance = 0;
621 double mse = 238630.0;
622 int delay = 22; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000623 EncodeDecodeTest(0, tolerance, mse, delay, channel_diff_tolerance);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000624 ReInitTest();
625 EXPECT_FALSE(decoder_->HasDecodePlc());
626}
627
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200628TEST_F(AudioDecoderOpusStereoTest, SetTargetBitrate) {
629 TestOpusSetTargetBitrates(audio_encoder_.get());
630}
631
kwiberg98ab3a42015-09-30 21:54:21 -0700632namespace {
633#ifdef WEBRTC_CODEC_ILBC
634const bool has_ilbc = true;
635#else
636const bool has_ilbc = false;
637#endif
638#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
639const bool has_isac = true;
640#else
641const bool has_isac = false;
642#endif
643#ifdef WEBRTC_CODEC_ISAC
644const bool has_isac_swb = true;
645#else
646const bool has_isac_swb = false;
647#endif
648#ifdef WEBRTC_CODEC_G722
649const bool has_g722 = true;
650#else
651const bool has_g722 = false;
652#endif
653#ifdef WEBRTC_CODEC_OPUS
654const bool has_opus = true;
655#else
656const bool has_opus = false;
657#endif
658} // namespace
659
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000660TEST(AudioDecoder, CodecSupported) {
kwibergee1879c2015-10-29 06:20:28 -0700661 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCMu));
662 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCMa));
663 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCMu_2ch));
664 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCMa_2ch));
665 EXPECT_EQ(has_ilbc, CodecSupported(NetEqDecoder::kDecoderILBC));
666 EXPECT_EQ(has_isac, CodecSupported(NetEqDecoder::kDecoderISAC));
667 EXPECT_EQ(has_isac_swb, CodecSupported(NetEqDecoder::kDecoderISACswb));
668 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16B));
669 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bwb));
670 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bswb32kHz));
671 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bswb48kHz));
672 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16B_2ch));
673 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bwb_2ch));
674 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch));
675 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch));
676 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16B_5ch));
677 EXPECT_EQ(has_g722, CodecSupported(NetEqDecoder::kDecoderG722));
678 EXPECT_EQ(has_g722, CodecSupported(NetEqDecoder::kDecoderG722_2ch));
679 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderRED));
680 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderAVT));
solenberg2779bab2016-11-17 04:45:19 -0800681 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderAVT16kHz));
682 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderAVT32kHz));
683 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderAVT48kHz));
kwibergee1879c2015-10-29 06:20:28 -0700684 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderCNGnb));
685 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderCNGwb));
686 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderCNGswb32kHz));
687 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderCNGswb48kHz));
688 EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderArbitrary));
689 EXPECT_EQ(has_opus, CodecSupported(NetEqDecoder::kDecoderOpus));
690 EXPECT_EQ(has_opus, CodecSupported(NetEqDecoder::kDecoderOpus_2ch));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000691}
692
693} // namespace webrtc