blob: 3181d6fc1c6f535169b79acc1a0202ecbfbe4f0f [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"
34#include "test/testsupport/fileutils.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
103 virtual ~AudioDecoderTest() {}
104
105 virtual void SetUp() {
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
112 virtual void TearDown() {
113 delete decoder_;
114 decoder_ = NULL;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000115 }
116
117 virtual void InitEncoder() { }
118
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
ossu10a029e2016-03-01 00:41:31 -0800139 encoded_info = audio_encoder_->Encode(
kwiberg288886b2015-11-06 01:21:35 -0800140 0, rtc::ArrayView<const int16_t>(interleaved_input.get(),
141 audio_encoder_->NumChannels() *
142 audio_encoder_->SampleRateHz() /
143 100),
ossu10a029e2016-03-01 00:41:31 -0800144 output);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000145 }
ossu10a029e2016-03-01 00:41:31 -0800146 EXPECT_EQ(payload_type_, encoded_info.payload_type);
147 return static_cast<int>(encoded_info.encoded_bytes);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000148 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000149
150 // Encodes and decodes audio. The absolute difference between the input and
151 // output is compared vs |tolerance|, and the mean-squared error is compared
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000152 // with |mse|. The encoded stream should contain |expected_bytes|. For stereo
153 // audio, the absolute difference between the two channels is compared vs
154 // |channel_diff_tolerance|.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000155 void EncodeDecodeTest(size_t expected_bytes, int tolerance, double mse,
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000156 int delay = 0, int channel_diff_tolerance = 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000157 ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0";
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000158 ASSERT_GE(channel_diff_tolerance, 0) <<
159 "Test must define a channel_diff_tolerance >= 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000160 size_t processed_samples = 0u;
ossu10a029e2016-03-01 00:41:31 -0800161 rtc::Buffer encoded;
162 size_t encoded_bytes = 0u;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000163 InitEncoder();
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000164 std::vector<int16_t> input;
165 std::vector<int16_t> decoded;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000166 while (processed_samples + frame_size_ <= data_length_) {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000167 // Extend input vector with |frame_size_|.
168 input.resize(input.size() + frame_size_, 0);
169 // Read from input file.
170 ASSERT_GE(input.size() - processed_samples, frame_size_);
171 ASSERT_TRUE(input_audio_.Read(
172 frame_size_, codec_input_rate_hz_, &input[processed_samples]));
173 size_t enc_len = EncodeFrame(
ossu10a029e2016-03-01 00:41:31 -0800174 &input[processed_samples], frame_size_, &encoded);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000175 // Make sure that frame_size_ * channels_ samples are allocated and free.
176 decoded.resize((processed_samples + frame_size_) * channels_, 0);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000177 AudioDecoder::SpeechType speech_type;
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000178 size_t dec_len = decoder_->Decode(
ossu10a029e2016-03-01 00:41:31 -0800179 &encoded.data()[encoded_bytes], enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000180 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000181 &decoded[processed_samples * channels_], &speech_type);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000182 EXPECT_EQ(frame_size_ * channels_, dec_len);
ossu10a029e2016-03-01 00:41:31 -0800183 encoded_bytes += enc_len;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000184 processed_samples += frame_size_;
185 }
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000186 // For some codecs it doesn't make sense to check expected number of bytes,
187 // since the number can vary for different platforms. Opus and iSAC are
188 // such codecs. In this case expected_bytes is set to 0.
189 if (expected_bytes) {
ossu10a029e2016-03-01 00:41:31 -0800190 EXPECT_EQ(expected_bytes, encoded_bytes);
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000191 }
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000192 CompareInputOutput(
193 input, decoded, processed_samples, channels_, tolerance, delay);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000194 if (channels_ == 2)
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000195 CompareTwoChannels(
196 decoded, processed_samples, channels_, channel_diff_tolerance);
197 EXPECT_LE(
198 MseInputOutput(input, decoded, processed_samples, channels_, delay),
199 mse);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000200 }
201
202 // Encodes a payload and decodes it twice with decoder re-init before each
203 // decode. Verifies that the decoded result is the same.
204 void ReInitTest() {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000205 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800206 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000207 ASSERT_TRUE(
208 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800209 rtc::Buffer encoded;
210 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000211 size_t dec_len;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000212 AudioDecoder::SpeechType speech_type1, speech_type2;
Karl Wiberg43766482015-08-27 15:22:11 +0200213 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800214 std::unique_ptr<int16_t[]> output1(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800215 dec_len = decoder_->Decode(encoded.data(), enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000216 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000217 output1.get(), &speech_type1);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000218 ASSERT_LE(dec_len, frame_size_ * channels_);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000219 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000220 // Re-init decoder and decode again.
Karl Wiberg43766482015-08-27 15:22:11 +0200221 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800222 std::unique_ptr<int16_t[]> output2(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800223 dec_len = decoder_->Decode(encoded.data(), enc_len, codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000224 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000225 output2.get(), &speech_type2);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000226 ASSERT_LE(dec_len, frame_size_ * channels_);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000227 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000228 for (unsigned int n = 0; n < frame_size_; ++n) {
229 ASSERT_EQ(output1[n], output2[n]) << "Exit test on first diff; n = " << n;
230 }
231 EXPECT_EQ(speech_type1, speech_type2);
232 }
233
234 // Call DecodePlc and verify that the correct number of samples is produced.
235 void DecodePlcTest() {
236 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800237 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000238 ASSERT_TRUE(
239 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800240 rtc::Buffer encoded;
241 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000242 AudioDecoder::SpeechType speech_type;
Karl Wiberg43766482015-08-27 15:22:11 +0200243 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800244 std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800245 size_t dec_len = decoder_->Decode(encoded.data(), enc_len,
246 codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000247 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000248 output.get(), &speech_type);
turaj@webrtc.org6ad6a072013-09-30 20:07:39 +0000249 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000250 // Call DecodePlc and verify that we get one frame of data.
251 // (Overwrite the output from the above Decode call, but that does not
252 // matter.)
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000253 dec_len = decoder_->DecodePlc(1, output.get());
turaj@webrtc.org6ad6a072013-09-30 20:07:39 +0000254 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000255 }
256
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000257 test::ResampleInputAudioFile input_audio_;
258 int codec_input_rate_hz_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000259 size_t frame_size_;
260 size_t data_length_;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000261 size_t channels_;
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000262 const int payload_type_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000263 AudioDecoder* decoder_;
kwiberg2d0c3322016-02-14 09:28:33 -0800264 std::unique_ptr<AudioEncoder> audio_encoder_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000265};
266
267class AudioDecoderPcmUTest : public AudioDecoderTest {
268 protected:
269 AudioDecoderPcmUTest() : AudioDecoderTest() {
270 frame_size_ = 160;
271 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700272 decoder_ = new AudioDecoderPcmU(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000273 AudioEncoderPcmU::Config config;
274 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000275 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000276 audio_encoder_.reset(new AudioEncoderPcmU(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000277 }
278};
279
280class AudioDecoderPcmATest : public AudioDecoderTest {
281 protected:
282 AudioDecoderPcmATest() : AudioDecoderTest() {
283 frame_size_ = 160;
284 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700285 decoder_ = new AudioDecoderPcmA(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000286 AudioEncoderPcmA::Config config;
287 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000288 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000289 audio_encoder_.reset(new AudioEncoderPcmA(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000290 }
291};
292
293class AudioDecoderPcm16BTest : public AudioDecoderTest {
294 protected:
295 AudioDecoderPcm16BTest() : AudioDecoderTest() {
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000296 codec_input_rate_hz_ = 16000;
297 frame_size_ = 20 * codec_input_rate_hz_ / 1000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000298 data_length_ = 10 * frame_size_;
kwiberg6c2eab32016-05-31 02:46:20 -0700299 decoder_ = new AudioDecoderPcm16B(codec_input_rate_hz_, 1);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000300 assert(decoder_);
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000301 AudioEncoderPcm16B::Config config;
302 config.sample_rate_hz = codec_input_rate_hz_;
303 config.frame_size_ms =
304 static_cast<int>(frame_size_ / (config.sample_rate_hz / 1000));
305 config.payload_type = payload_type_;
306 audio_encoder_.reset(new AudioEncoderPcm16B(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000307 }
308};
309
310class AudioDecoderIlbcTest : public AudioDecoderTest {
311 protected:
312 AudioDecoderIlbcTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000313 codec_input_rate_hz_ = 8000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000314 frame_size_ = 240;
315 data_length_ = 10 * frame_size_;
solenbergdb3c9b02017-06-28 02:05:04 -0700316 decoder_ = new AudioDecoderIlbcImpl;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000317 assert(decoder_);
solenbergdb3c9b02017-06-28 02:05:04 -0700318 AudioEncoderIlbcConfig config;
kwiberg@webrtc.orgcb858ba2014-12-08 17:11:44 +0000319 config.frame_size_ms = 30;
solenbergdb3c9b02017-06-28 02:05:04 -0700320 audio_encoder_.reset(new AudioEncoderIlbcImpl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000321 }
322
323 // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does
324 // not return any data. It simply resets a few states and returns 0.
325 void DecodePlcTest() {
326 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800327 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000328 ASSERT_TRUE(
329 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800330 rtc::Buffer encoded;
331 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000332 AudioDecoder::SpeechType speech_type;
Karl Wiberg43766482015-08-27 15:22:11 +0200333 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800334 std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
ossu10a029e2016-03-01 00:41:31 -0800335 size_t dec_len = decoder_->Decode(encoded.data(), enc_len,
336 codec_input_rate_hz_,
minyue@webrtc.org7f7d7e32015-03-16 12:30:37 +0000337 frame_size_ * channels_ * sizeof(int16_t),
henrik.lundin@webrtc.org1eda4e32015-02-25 10:02:29 +0000338 output.get(), &speech_type);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000339 EXPECT_EQ(frame_size_, dec_len);
340 // Simply call DecodePlc and verify that we get 0 as return value.
Peter Kastingdce40cf2015-08-24 14:52:23 -0700341 EXPECT_EQ(0U, decoder_->DecodePlc(1, output.get()));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000342 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000343};
344
345class AudioDecoderIsacFloatTest : public AudioDecoderTest {
346 protected:
347 AudioDecoderIsacFloatTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000348 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000349 frame_size_ = 480;
350 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700351 AudioEncoderIsacFloatImpl::Config config;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000352 config.payload_type = payload_type_;
353 config.sample_rate_hz = codec_input_rate_hz_;
Karl Wibergd3e8eda2015-04-23 14:07:06 +0200354 config.adaptive_mode = false;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000355 config.frame_size_ms =
356 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700357 audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
358 decoder_ = new AudioDecoderIsacFloatImpl(codec_input_rate_hz_);
turaj@webrtc.org1431e4d2014-11-11 01:44:13 +0000359 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000360};
361
362class AudioDecoderIsacSwbTest : public AudioDecoderTest {
363 protected:
364 AudioDecoderIsacSwbTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000365 codec_input_rate_hz_ = 32000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000366 frame_size_ = 960;
367 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700368 AudioEncoderIsacFloatImpl::Config config;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000369 config.payload_type = payload_type_;
370 config.sample_rate_hz = codec_input_rate_hz_;
Karl Wibergd3e8eda2015-04-23 14:07:06 +0200371 config.adaptive_mode = false;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000372 config.frame_size_ms =
373 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700374 audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
375 decoder_ = new AudioDecoderIsacFloatImpl(codec_input_rate_hz_);
turaj@webrtc.org1431e4d2014-11-11 01:44:13 +0000376 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000377};
378
379class AudioDecoderIsacFixTest : public AudioDecoderTest {
380 protected:
381 AudioDecoderIsacFixTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000382 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000383 frame_size_ = 480;
384 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700385 AudioEncoderIsacFixImpl::Config config;
kwiberg@webrtc.org88bdec82014-12-16 12:49:37 +0000386 config.payload_type = payload_type_;
387 config.sample_rate_hz = codec_input_rate_hz_;
Karl Wibergd3e8eda2015-04-23 14:07:06 +0200388 config.adaptive_mode = false;
kwiberg@webrtc.org88bdec82014-12-16 12:49:37 +0000389 config.frame_size_ms =
390 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700391 audio_encoder_.reset(new AudioEncoderIsacFixImpl(config));
392 decoder_ = new AudioDecoderIsacFixImpl(codec_input_rate_hz_);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000393 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000394};
395
396class AudioDecoderG722Test : public AudioDecoderTest {
397 protected:
398 AudioDecoderG722Test() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000399 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000400 frame_size_ = 160;
401 data_length_ = 10 * frame_size_;
kwibergb1ed7f02017-06-17 17:30:09 -0700402 decoder_ = new AudioDecoderG722Impl;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000403 assert(decoder_);
kwibergb8727ae2017-06-17 17:41:59 -0700404 AudioEncoderG722Config config;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000405 config.frame_size_ms = 10;
406 config.num_channels = 1;
kwibergb8727ae2017-06-17 17:41:59 -0700407 audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000408 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000409};
410
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000411class AudioDecoderG722StereoTest : public AudioDecoderTest {
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000412 protected:
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000413 AudioDecoderG722StereoTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000414 channels_ = 2;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000415 codec_input_rate_hz_ = 16000;
416 frame_size_ = 160;
417 data_length_ = 10 * frame_size_;
kwiberg1b97e262017-06-26 04:19:43 -0700418 decoder_ = new AudioDecoderG722StereoImpl;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000419 assert(decoder_);
kwibergb8727ae2017-06-17 17:41:59 -0700420 AudioEncoderG722Config config;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000421 config.frame_size_ms = 10;
422 config.num_channels = 2;
kwibergb8727ae2017-06-17 17:41:59 -0700423 audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000424 }
425};
426
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000427class AudioDecoderOpusTest : public AudioDecoderTest {
428 protected:
429 AudioDecoderOpusTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000430 codec_input_rate_hz_ = 48000;
minyue@webrtc.orgf563e852014-07-18 21:11:27 +0000431 frame_size_ = 480;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000432 data_length_ = 10 * frame_size_;
kwiberg96d74bb2017-06-30 05:24:56 -0700433 decoder_ = new AudioDecoderOpusImpl(1);
kwiberg96da0112017-06-30 04:23:22 -0700434 AudioEncoderOpusConfig config;
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000435 config.frame_size_ms = static_cast<int>(frame_size_) / 48;
kwiberg96da0112017-06-30 04:23:22 -0700436 config.application = AudioEncoderOpusConfig::ApplicationMode::kVoip;
437 audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000438 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000439};
440
minyue@webrtc.orgf563e852014-07-18 21:11:27 +0000441class AudioDecoderOpusStereoTest : public AudioDecoderOpusTest {
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000442 protected:
minyue@webrtc.orgf563e852014-07-18 21:11:27 +0000443 AudioDecoderOpusStereoTest() : AudioDecoderOpusTest() {
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000444 channels_ = 2;
minyue@webrtc.orgf563e852014-07-18 21:11:27 +0000445 delete decoder_;
kwiberg96d74bb2017-06-30 05:24:56 -0700446 decoder_ = new AudioDecoderOpusImpl(2);
kwiberg96da0112017-06-30 04:23:22 -0700447 AudioEncoderOpusConfig config;
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000448 config.frame_size_ms = static_cast<int>(frame_size_) / 48;
449 config.num_channels = 2;
kwiberg96da0112017-06-30 04:23:22 -0700450 config.application = AudioEncoderOpusConfig::ApplicationMode::kAudio;
451 audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000452 }
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000453};
454
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000455TEST_F(AudioDecoderPcmUTest, EncodeDecode) {
456 int tolerance = 251;
457 double mse = 1734.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000458 EncodeDecodeTest(data_length_, tolerance, mse);
459 ReInitTest();
460 EXPECT_FALSE(decoder_->HasDecodePlc());
461}
462
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200463namespace {
464int SetAndGetTargetBitrate(AudioEncoder* audio_encoder, int rate) {
Oskar Sundbom12ab00b2017-11-16 15:31:38 +0100465 audio_encoder->OnReceivedUplinkBandwidth(rate, rtc::nullopt);
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200466 return audio_encoder->GetTargetBitrate();
467}
468void TestSetAndGetTargetBitratesWithFixedCodec(AudioEncoder* audio_encoder,
469 int fixed_rate) {
470 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, 32000));
471 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate - 1));
472 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate));
473 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate + 1));
474}
475} // namespace
476
477TEST_F(AudioDecoderPcmUTest, SetTargetBitrate) {
478 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
479}
480
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000481TEST_F(AudioDecoderPcmATest, EncodeDecode) {
482 int tolerance = 308;
483 double mse = 1931.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000484 EncodeDecodeTest(data_length_, tolerance, mse);
485 ReInitTest();
486 EXPECT_FALSE(decoder_->HasDecodePlc());
487}
488
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200489TEST_F(AudioDecoderPcmATest, SetTargetBitrate) {
490 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
491}
492
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000493TEST_F(AudioDecoderPcm16BTest, EncodeDecode) {
494 int tolerance = 0;
495 double mse = 0.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000496 EncodeDecodeTest(2 * data_length_, tolerance, mse);
497 ReInitTest();
498 EXPECT_FALSE(decoder_->HasDecodePlc());
499}
500
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200501TEST_F(AudioDecoderPcm16BTest, SetTargetBitrate) {
502 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(),
503 codec_input_rate_hz_ * 16);
504}
505
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000506TEST_F(AudioDecoderIlbcTest, EncodeDecode) {
507 int tolerance = 6808;
508 double mse = 2.13e6;
509 int delay = 80; // Delay from input to output.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000510 EncodeDecodeTest(500, tolerance, mse, delay);
511 ReInitTest();
512 EXPECT_TRUE(decoder_->HasDecodePlc());
513 DecodePlcTest();
514}
515
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200516TEST_F(AudioDecoderIlbcTest, SetTargetBitrate) {
517 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 13333);
518}
519
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000520TEST_F(AudioDecoderIsacFloatTest, EncodeDecode) {
521 int tolerance = 3399;
522 double mse = 434951.0;
523 int delay = 48; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000524 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000525 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000526 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000527}
528
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200529TEST_F(AudioDecoderIsacFloatTest, SetTargetBitrate) {
530 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
531}
532
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000533TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) {
534 int tolerance = 19757;
535 double mse = 8.18e6;
536 int delay = 160; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000537 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000538 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000539 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000540}
541
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200542TEST_F(AudioDecoderIsacSwbTest, SetTargetBitrate) {
543 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
544}
545
kwiberg5b659c02015-12-11 07:33:59 -0800546TEST_F(AudioDecoderIsacFixTest, EncodeDecode) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000547 int tolerance = 11034;
548 double mse = 3.46e6;
549 int delay = 54; // Delay from input to output.
kwiberg5b659c02015-12-11 07:33:59 -0800550#if defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM)
kwiberg@webrtc.orge102e812014-12-17 07:30:23 +0000551 static const int kEncodedBytes = 685;
kwiberg5b659c02015-12-11 07:33:59 -0800552#elif defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM64)
553 static const int kEncodedBytes = 673;
kwiberg@webrtc.orge102e812014-12-17 07:30:23 +0000554#else
555 static const int kEncodedBytes = 671;
556#endif
557 EncodeDecodeTest(kEncodedBytes, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000558 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000559 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000560}
561
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200562TEST_F(AudioDecoderIsacFixTest, SetTargetBitrate) {
563 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
564}
565
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000566TEST_F(AudioDecoderG722Test, EncodeDecode) {
567 int tolerance = 6176;
568 double mse = 238630.0;
569 int delay = 22; // Delay from input to output.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000570 EncodeDecodeTest(data_length_ / 2, tolerance, mse, delay);
571 ReInitTest();
572 EXPECT_FALSE(decoder_->HasDecodePlc());
573}
574
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200575TEST_F(AudioDecoderG722Test, SetTargetBitrate) {
576 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
577}
578
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000579TEST_F(AudioDecoderG722StereoTest, EncodeDecode) {
580 int tolerance = 6176;
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000581 int channel_diff_tolerance = 0;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000582 double mse = 238630.0;
583 int delay = 22; // Delay from input to output.
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000584 EncodeDecodeTest(data_length_, tolerance, mse, delay, channel_diff_tolerance);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000585 ReInitTest();
586 EXPECT_FALSE(decoder_->HasDecodePlc());
587}
588
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200589TEST_F(AudioDecoderG722StereoTest, SetTargetBitrate) {
590 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 128000);
591}
592
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000593TEST_F(AudioDecoderOpusTest, EncodeDecode) {
594 int tolerance = 6176;
595 double mse = 238630.0;
596 int delay = 22; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000597 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000598 ReInitTest();
599 EXPECT_FALSE(decoder_->HasDecodePlc());
600}
601
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200602namespace {
603void TestOpusSetTargetBitrates(AudioEncoder* audio_encoder) {
michaelt54340d82017-01-31 09:06:53 -0800604 EXPECT_EQ(6000, SetAndGetTargetBitrate(audio_encoder, 5999));
605 EXPECT_EQ(6000, SetAndGetTargetBitrate(audio_encoder, 6000));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200606 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder, 32000));
ossua1a040a2017-04-06 10:03:21 -0700607 EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder, 510000));
608 EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder, 511000));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200609}
610} // namespace
611
612TEST_F(AudioDecoderOpusTest, SetTargetBitrate) {
613 TestOpusSetTargetBitrates(audio_encoder_.get());
614}
615
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000616TEST_F(AudioDecoderOpusStereoTest, EncodeDecode) {
617 int tolerance = 6176;
618 int channel_diff_tolerance = 0;
619 double mse = 238630.0;
620 int delay = 22; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000621 EncodeDecodeTest(0, tolerance, mse, delay, channel_diff_tolerance);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000622 ReInitTest();
623 EXPECT_FALSE(decoder_->HasDecodePlc());
624}
625
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200626TEST_F(AudioDecoderOpusStereoTest, SetTargetBitrate) {
627 TestOpusSetTargetBitrates(audio_encoder_.get());
628}
629
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000630} // namespace webrtc