blob: 42d96db4dfc2d736dbb014be70ab0d40d7103fe2 [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.orgd94659d2013-01-29 12:09:21 +000011#include <assert.h>
12#include <stdlib.h>
13
kwiberg2d0c3322016-02-14 09:28:33 -080014#include <memory>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000015#include <string>
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000016#include <vector>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000017
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "api/audio_codecs/opus/audio_encoder_opus.h"
19#include "modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
20#include "modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
21#include "modules/audio_coding/codecs/g722/audio_decoder_g722.h"
22#include "modules/audio_coding/codecs/g722/audio_encoder_g722.h"
23#include "modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h"
24#include "modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h"
25#include "modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h"
26#include "modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"
27#include "modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h"
28#include "modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
29#include "modules/audio_coding/codecs/opus/audio_decoder_opus.h"
30#include "modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h"
31#include "modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h"
32#include "modules/audio_coding/neteq/tools/resample_input_audio_file.h"
33#include "test/gtest.h"
Steve Anton10542f22019-01-11 09:11:00 -080034#include "test/testsupport/file_utils.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000035
36namespace webrtc {
37
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000038namespace {
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
41// delays.
42void CompareInputOutput(const std::vector<int16_t>& input,
43 const std::vector<int16_t>& output,
44 size_t num_samples,
45 size_t channels,
46 int tolerance,
47 int delay) {
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;
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000053 }
54}
55
56// The absolute difference between the first two channels in |output| is
57// compared vs |tolerance|.
58void CompareTwoChannels(const std::vector<int16_t>& output,
59 size_t samples_per_channel,
60 size_t channels,
61 int tolerance) {
62 ASSERT_GE(channels, 2u);
63 ASSERT_LE(samples_per_channel * channels, output.size());
64 for (unsigned int n = 0; n < samples_per_channel; ++n)
65 ASSERT_NEAR(output[channels * n], output[channels * n + 1], tolerance)
66 << "Stereo samples differ.";
67}
68
69// Calculates mean-squared error between input and output (the first channel).
70// The parameter |delay| is used to correct for codec delays.
71double MseInputOutput(const std::vector<int16_t>& input,
72 const std::vector<int16_t>& output,
73 size_t num_samples,
74 size_t channels,
75 int delay) {
76 assert(delay < static_cast<int>(num_samples));
77 assert(num_samples <= input.size());
78 assert(num_samples * channels <= output.size());
79 if (num_samples == 0)
80 return 0.0;
81 double squared_sum = 0.0;
82 for (unsigned int n = 0; n < num_samples - delay; ++n) {
83 squared_sum += (input[n] - output[channels * n + delay]) *
84 (input[n] - output[channels * n + delay]);
85 }
86 return squared_sum / (num_samples - delay);
87}
88} // namespace
89
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000090class AudioDecoderTest : public ::testing::Test {
91 protected:
92 AudioDecoderTest()
kjellander02060002016-02-16 22:06:12 -080093 : input_audio_(
94 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
95 32000),
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000096 codec_input_rate_hz_(32000), // Legacy default value.
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +000097 frame_size_(0),
98 data_length_(0),
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +000099 channels_(1),
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000100 payload_type_(17),
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000101 decoder_(NULL) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000102
Mirko Bonadei682aac52018-07-20 13:59:20 +0200103 ~AudioDecoderTest() override {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000104
Mirko Bonadei682aac52018-07-20 13:59:20 +0200105 void SetUp() override {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000106 if (audio_encoder_)
kwiberg@webrtc.org05211272015-02-18 12:00:32 +0000107 codec_input_rate_hz_ = audio_encoder_->SampleRateHz();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000108 // Create arrays.
109 ASSERT_GT(data_length_, 0u) << "The test must set data_length_ > 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000110 }
111
Mirko Bonadei682aac52018-07-20 13:59:20 +0200112 void TearDown() override {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000113 delete decoder_;
114 decoder_ = NULL;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000115 }
116
Yves Gerey665174f2018-06-19 15:03:05 +0200117 virtual void InitEncoder() {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000118
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000119 // TODO(henrik.lundin) Change return type to size_t once most/all overriding
120 // implementations are gone.
121 virtual int EncodeFrame(const int16_t* input,
122 size_t input_len_samples,
ossu10a029e2016-03-01 00:41:31 -0800123 rtc::Buffer* output) {
124 AudioEncoder::EncodedInfo encoded_info;
kwiberg@webrtc.org05211272015-02-18 12:00:32 +0000125 const size_t samples_per_10ms = audio_encoder_->SampleRateHz() / 100;
henrikg91d6ede2015-09-17 00:24:34 -0700126 RTC_CHECK_EQ(samples_per_10ms * audio_encoder_->Num10MsFramesInNextPacket(),
127 input_len_samples);
kwiberg2d0c3322016-02-14 09:28:33 -0800128 std::unique_ptr<int16_t[]> interleaved_input(
henrik.lundin@webrtc.org130fef82014-12-08 21:07:59 +0000129 new int16_t[channels_ * samples_per_10ms]);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700130 for (size_t i = 0; i < audio_encoder_->Num10MsFramesInNextPacket(); ++i) {
ossu10a029e2016-03-01 00:41:31 -0800131 EXPECT_EQ(0u, encoded_info.encoded_bytes);
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000132
133 // Duplicate the mono input signal to however many channels the test
134 // wants.
henrik.lundin@webrtc.org130fef82014-12-08 21:07:59 +0000135 test::InputAudioFile::DuplicateInterleaved(input + i * samples_per_10ms,
136 samples_per_10ms, channels_,
137 interleaved_input.get());
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000138
Yves Gerey665174f2018-06-19 15:03:05 +0200139 encoded_info =
140 audio_encoder_->Encode(0,
141 rtc::ArrayView<const int16_t>(
142 interleaved_input.get(),
143 audio_encoder_->NumChannels() *
144 audio_encoder_->SampleRateHz() / 100),
145 output);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000146 }
ossu10a029e2016-03-01 00:41:31 -0800147 EXPECT_EQ(payload_type_, encoded_info.payload_type);
148 return static_cast<int>(encoded_info.encoded_bytes);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000149 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000150
151 // Encodes and decodes audio. The absolute difference between the input and
152 // output is compared vs |tolerance|, and the mean-squared error is compared
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000153 // with |mse|. The encoded stream should contain |expected_bytes|. For stereo
154 // audio, the absolute difference between the two channels is compared vs
155 // |channel_diff_tolerance|.
Yves Gerey665174f2018-06-19 15:03:05 +0200156 void EncodeDecodeTest(size_t expected_bytes,
157 int tolerance,
158 double mse,
159 int delay = 0,
160 int channel_diff_tolerance = 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000161 ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0";
Yves Gerey665174f2018-06-19 15:03:05 +0200162 ASSERT_GE(channel_diff_tolerance, 0)
163 << "Test must define a channel_diff_tolerance >= 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000164 size_t processed_samples = 0u;
ossu10a029e2016-03-01 00:41:31 -0800165 rtc::Buffer encoded;
166 size_t encoded_bytes = 0u;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000167 InitEncoder();
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000168 std::vector<int16_t> input;
169 std::vector<int16_t> decoded;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000170 while (processed_samples + frame_size_ <= data_length_) {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000171 // Extend input vector with |frame_size_|.
172 input.resize(input.size() + frame_size_, 0);
173 // Read from input file.
174 ASSERT_GE(input.size() - processed_samples, frame_size_);
Yves Gerey665174f2018-06-19 15:03:05 +0200175 ASSERT_TRUE(input_audio_.Read(frame_size_, codec_input_rate_hz_,
176 &input[processed_samples]));
177 size_t enc_len =
178 EncodeFrame(&input[processed_samples], frame_size_, &encoded);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000179 // Make sure that frame_size_ * channels_ samples are allocated and free.
180 decoded.resize((processed_samples + frame_size_) * channels_, 0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000181 AudioDecoder::SpeechType speech_type;
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000182 size_t dec_len = decoder_->Decode(
ossu10a029e2016-03-01 00:41:31 -0800183 &encoded.data()[encoded_bytes], enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000184 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000185 &decoded[processed_samples * channels_], &speech_type);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000186 EXPECT_EQ(frame_size_ * channels_, dec_len);
ossu10a029e2016-03-01 00:41:31 -0800187 encoded_bytes += enc_len;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000188 processed_samples += frame_size_;
189 }
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000190 // For some codecs it doesn't make sense to check expected number of bytes,
191 // since the number can vary for different platforms. Opus and iSAC are
192 // such codecs. In this case expected_bytes is set to 0.
193 if (expected_bytes) {
ossu10a029e2016-03-01 00:41:31 -0800194 EXPECT_EQ(expected_bytes, encoded_bytes);
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000195 }
Yves Gerey665174f2018-06-19 15:03:05 +0200196 CompareInputOutput(input, decoded, processed_samples, channels_, tolerance,
197 delay);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000198 if (channels_ == 2)
Yves Gerey665174f2018-06-19 15:03:05 +0200199 CompareTwoChannels(decoded, processed_samples, channels_,
200 channel_diff_tolerance);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000201 EXPECT_LE(
202 MseInputOutput(input, decoded, processed_samples, channels_, delay),
203 mse);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000204 }
205
206 // Encodes a payload and decodes it twice with decoder re-init before each
207 // decode. Verifies that the decoded result is the same.
208 void ReInitTest() {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000209 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800210 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000211 ASSERT_TRUE(
212 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800213 rtc::Buffer encoded;
214 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000215 size_t dec_len;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000216 AudioDecoder::SpeechType speech_type1, speech_type2;
Karl Wiberg43766482015-08-27 15:22:11 +0200217 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800218 std::unique_ptr<int16_t[]> output1(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800219 dec_len = decoder_->Decode(encoded.data(), enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000220 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000221 output1.get(), &speech_type1);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000222 ASSERT_LE(dec_len, frame_size_ * channels_);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000223 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000224 // Re-init decoder and decode again.
Karl Wiberg43766482015-08-27 15:22:11 +0200225 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800226 std::unique_ptr<int16_t[]> output2(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800227 dec_len = decoder_->Decode(encoded.data(), enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000228 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000229 output2.get(), &speech_type2);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000230 ASSERT_LE(dec_len, frame_size_ * channels_);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000231 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000232 for (unsigned int n = 0; n < frame_size_; ++n) {
233 ASSERT_EQ(output1[n], output2[n]) << "Exit test on first diff; n = " << n;
234 }
235 EXPECT_EQ(speech_type1, speech_type2);
236 }
237
238 // Call DecodePlc and verify that the correct number of samples is produced.
239 void DecodePlcTest() {
240 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800241 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000242 ASSERT_TRUE(
243 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800244 rtc::Buffer encoded;
245 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000246 AudioDecoder::SpeechType speech_type;
Karl Wiberg43766482015-08-27 15:22:11 +0200247 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800248 std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
Yves Gerey665174f2018-06-19 15:03:05 +0200249 size_t dec_len = decoder_->Decode(
250 encoded.data(), enc_len, codec_input_rate_hz_,
251 frame_size_ * channels_ * sizeof(int16_t), output.get(), &speech_type);
turaj@webrtc.org6ad6a072013-09-30 20:07:39 +0000252 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000253 // Call DecodePlc and verify that we get one frame of data.
254 // (Overwrite the output from the above Decode call, but that does not
255 // matter.)
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000256 dec_len = decoder_->DecodePlc(1, output.get());
turaj@webrtc.org6ad6a072013-09-30 20:07:39 +0000257 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000258 }
259
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000260 test::ResampleInputAudioFile input_audio_;
261 int codec_input_rate_hz_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000262 size_t frame_size_;
263 size_t data_length_;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000264 size_t channels_;
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000265 const int payload_type_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000266 AudioDecoder* decoder_;
kwiberg2d0c3322016-02-14 09:28:33 -0800267 std::unique_ptr<AudioEncoder> audio_encoder_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000268};
269
270class AudioDecoderPcmUTest : public AudioDecoderTest {
271 protected:
272 AudioDecoderPcmUTest() : AudioDecoderTest() {
273 frame_size_ = 160;
274 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700275 decoder_ = new AudioDecoderPcmU(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000276 AudioEncoderPcmU::Config config;
277 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000278 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000279 audio_encoder_.reset(new AudioEncoderPcmU(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000280 }
281};
282
283class AudioDecoderPcmATest : public AudioDecoderTest {
284 protected:
285 AudioDecoderPcmATest() : AudioDecoderTest() {
286 frame_size_ = 160;
287 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700288 decoder_ = new AudioDecoderPcmA(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000289 AudioEncoderPcmA::Config config;
290 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000291 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000292 audio_encoder_.reset(new AudioEncoderPcmA(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000293 }
294};
295
296class AudioDecoderPcm16BTest : public AudioDecoderTest {
297 protected:
298 AudioDecoderPcm16BTest() : AudioDecoderTest() {
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000299 codec_input_rate_hz_ = 16000;
300 frame_size_ = 20 * codec_input_rate_hz_ / 1000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000301 data_length_ = 10 * frame_size_;
kwiberg6c2eab32016-05-31 02:46:20 -0700302 decoder_ = new AudioDecoderPcm16B(codec_input_rate_hz_, 1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000303 assert(decoder_);
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000304 AudioEncoderPcm16B::Config config;
305 config.sample_rate_hz = codec_input_rate_hz_;
306 config.frame_size_ms =
307 static_cast<int>(frame_size_ / (config.sample_rate_hz / 1000));
308 config.payload_type = payload_type_;
309 audio_encoder_.reset(new AudioEncoderPcm16B(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000310 }
311};
312
313class AudioDecoderIlbcTest : public AudioDecoderTest {
314 protected:
315 AudioDecoderIlbcTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000316 codec_input_rate_hz_ = 8000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000317 frame_size_ = 240;
318 data_length_ = 10 * frame_size_;
solenbergdb3c9b02017-06-28 02:05:04 -0700319 decoder_ = new AudioDecoderIlbcImpl;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000320 assert(decoder_);
solenbergdb3c9b02017-06-28 02:05:04 -0700321 AudioEncoderIlbcConfig config;
kwiberg@webrtc.orgcb858ba2014-12-08 17:11:44 +0000322 config.frame_size_ms = 30;
solenbergdb3c9b02017-06-28 02:05:04 -0700323 audio_encoder_.reset(new AudioEncoderIlbcImpl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000324 }
325
326 // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does
327 // not return any data. It simply resets a few states and returns 0.
328 void DecodePlcTest() {
329 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800330 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000331 ASSERT_TRUE(
332 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800333 rtc::Buffer encoded;
334 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000335 AudioDecoder::SpeechType speech_type;
Karl Wiberg43766482015-08-27 15:22:11 +0200336 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800337 std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
Yves Gerey665174f2018-06-19 15:03:05 +0200338 size_t dec_len = decoder_->Decode(
339 encoded.data(), enc_len, codec_input_rate_hz_,
340 frame_size_ * channels_ * sizeof(int16_t), 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) {
Danil Chapovalovb6021232018-06-19 13:26:36 +0200467 audio_encoder->OnReceivedUplinkBandwidth(rate, absl::nullopt);
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
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000632} // namespace webrtc