blob: b13fe44f87996f7617ab4ad15fc3441e8fcb4538 [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 <stdlib.h>
12
Alessio Bazzicab28e57e2020-02-13 09:18:24 +010013#include <array>
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 {
Jakob Ivarsson36274f92020-10-22 13:01:07 +020039
40constexpr int kOverheadBytesPerPacket = 50;
41
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000042// The absolute difference between the input and output (the first channel) is
43// compared vs |tolerance|. The parameter |delay| is used to correct for codec
44// delays.
45void CompareInputOutput(const std::vector<int16_t>& input,
46 const std::vector<int16_t>& output,
47 size_t num_samples,
48 size_t channels,
49 int tolerance,
50 int delay) {
51 ASSERT_LE(num_samples, input.size());
52 ASSERT_LE(num_samples * channels, output.size());
53 for (unsigned int n = 0; n < num_samples - delay; ++n) {
54 ASSERT_NEAR(input[n], output[channels * n + delay], tolerance)
55 << "Exit test on first diff; n = " << n;
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000056 }
57}
58
59// The absolute difference between the first two channels in |output| is
60// compared vs |tolerance|.
61void CompareTwoChannels(const std::vector<int16_t>& output,
62 size_t samples_per_channel,
63 size_t channels,
64 int tolerance) {
65 ASSERT_GE(channels, 2u);
66 ASSERT_LE(samples_per_channel * channels, output.size());
67 for (unsigned int n = 0; n < samples_per_channel; ++n)
68 ASSERT_NEAR(output[channels * n], output[channels * n + 1], tolerance)
69 << "Stereo samples differ.";
70}
71
72// Calculates mean-squared error between input and output (the first channel).
73// The parameter |delay| is used to correct for codec delays.
74double MseInputOutput(const std::vector<int16_t>& input,
75 const std::vector<int16_t>& output,
76 size_t num_samples,
77 size_t channels,
78 int delay) {
Mirko Bonadei25ab3222021-07-08 20:08:20 +020079 RTC_DCHECK_LT(delay, static_cast<int>(num_samples));
80 RTC_DCHECK_LE(num_samples, input.size());
81 RTC_DCHECK_LE(num_samples * channels, output.size());
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000082 if (num_samples == 0)
83 return 0.0;
84 double squared_sum = 0.0;
85 for (unsigned int n = 0; n < num_samples - delay; ++n) {
86 squared_sum += (input[n] - output[channels * n + delay]) *
87 (input[n] - output[channels * n + delay]);
88 }
89 return squared_sum / (num_samples - delay);
90}
91} // namespace
92
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000093class AudioDecoderTest : public ::testing::Test {
94 protected:
95 AudioDecoderTest()
kjellander02060002016-02-16 22:06:12 -080096 : input_audio_(
97 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
98 32000),
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000099 codec_input_rate_hz_(32000), // Legacy default value.
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000100 frame_size_(0),
101 data_length_(0),
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000102 channels_(1),
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000103 payload_type_(17),
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000104 decoder_(NULL) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000105
Mirko Bonadei682aac52018-07-20 13:59:20 +0200106 ~AudioDecoderTest() override {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000107
Mirko Bonadei682aac52018-07-20 13:59:20 +0200108 void SetUp() override {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000109 if (audio_encoder_)
kwiberg@webrtc.org05211272015-02-18 12:00:32 +0000110 codec_input_rate_hz_ = audio_encoder_->SampleRateHz();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000111 // Create arrays.
112 ASSERT_GT(data_length_, 0u) << "The test must set data_length_ > 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000113 }
114
Mirko Bonadei682aac52018-07-20 13:59:20 +0200115 void TearDown() override {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000116 delete decoder_;
117 decoder_ = NULL;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000118 }
119
Yves Gerey665174f2018-06-19 15:03:05 +0200120 virtual void InitEncoder() {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000121
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000122 // TODO(henrik.lundin) Change return type to size_t once most/all overriding
123 // implementations are gone.
124 virtual int EncodeFrame(const int16_t* input,
125 size_t input_len_samples,
ossu10a029e2016-03-01 00:41:31 -0800126 rtc::Buffer* output) {
127 AudioEncoder::EncodedInfo encoded_info;
kwiberg@webrtc.org05211272015-02-18 12:00:32 +0000128 const size_t samples_per_10ms = audio_encoder_->SampleRateHz() / 100;
henrikg91d6ede2015-09-17 00:24:34 -0700129 RTC_CHECK_EQ(samples_per_10ms * audio_encoder_->Num10MsFramesInNextPacket(),
130 input_len_samples);
kwiberg2d0c3322016-02-14 09:28:33 -0800131 std::unique_ptr<int16_t[]> interleaved_input(
henrik.lundin@webrtc.org130fef82014-12-08 21:07:59 +0000132 new int16_t[channels_ * samples_per_10ms]);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700133 for (size_t i = 0; i < audio_encoder_->Num10MsFramesInNextPacket(); ++i) {
ossu10a029e2016-03-01 00:41:31 -0800134 EXPECT_EQ(0u, encoded_info.encoded_bytes);
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000135
136 // Duplicate the mono input signal to however many channels the test
137 // wants.
henrik.lundin@webrtc.org130fef82014-12-08 21:07:59 +0000138 test::InputAudioFile::DuplicateInterleaved(input + i * samples_per_10ms,
139 samples_per_10ms, channels_,
140 interleaved_input.get());
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000141
Yves Gerey665174f2018-06-19 15:03:05 +0200142 encoded_info =
143 audio_encoder_->Encode(0,
144 rtc::ArrayView<const int16_t>(
145 interleaved_input.get(),
146 audio_encoder_->NumChannels() *
147 audio_encoder_->SampleRateHz() / 100),
148 output);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000149 }
ossu10a029e2016-03-01 00:41:31 -0800150 EXPECT_EQ(payload_type_, encoded_info.payload_type);
151 return static_cast<int>(encoded_info.encoded_bytes);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000152 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000153
154 // Encodes and decodes audio. The absolute difference between the input and
155 // output is compared vs |tolerance|, and the mean-squared error is compared
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000156 // with |mse|. The encoded stream should contain |expected_bytes|. For stereo
157 // audio, the absolute difference between the two channels is compared vs
158 // |channel_diff_tolerance|.
Yves Gerey665174f2018-06-19 15:03:05 +0200159 void EncodeDecodeTest(size_t expected_bytes,
160 int tolerance,
161 double mse,
162 int delay = 0,
163 int channel_diff_tolerance = 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000164 ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0";
Yves Gerey665174f2018-06-19 15:03:05 +0200165 ASSERT_GE(channel_diff_tolerance, 0)
166 << "Test must define a channel_diff_tolerance >= 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000167 size_t processed_samples = 0u;
ossu10a029e2016-03-01 00:41:31 -0800168 size_t encoded_bytes = 0u;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000169 InitEncoder();
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000170 std::vector<int16_t> input;
171 std::vector<int16_t> decoded;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000172 while (processed_samples + frame_size_ <= data_length_) {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000173 // Extend input vector with |frame_size_|.
174 input.resize(input.size() + frame_size_, 0);
175 // Read from input file.
176 ASSERT_GE(input.size() - processed_samples, frame_size_);
Yves Gerey665174f2018-06-19 15:03:05 +0200177 ASSERT_TRUE(input_audio_.Read(frame_size_, codec_input_rate_hz_,
178 &input[processed_samples]));
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100179 rtc::Buffer encoded;
Yves Gerey665174f2018-06-19 15:03:05 +0200180 size_t enc_len =
181 EncodeFrame(&input[processed_samples], frame_size_, &encoded);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000182 // Make sure that frame_size_ * channels_ samples are allocated and free.
183 decoded.resize((processed_samples + frame_size_) * channels_, 0);
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100184
185 const std::vector<AudioDecoder::ParseResult> parse_result =
186 decoder_->ParsePayload(std::move(encoded), /*timestamp=*/0);
187 RTC_CHECK_EQ(parse_result.size(), size_t{1});
188 auto decode_result = parse_result[0].frame->Decode(
189 rtc::ArrayView<int16_t>(&decoded[processed_samples * channels_],
190 frame_size_ * channels_ * sizeof(int16_t)));
191 RTC_CHECK(decode_result.has_value());
192 EXPECT_EQ(frame_size_ * channels_, decode_result->num_decoded_samples);
ossu10a029e2016-03-01 00:41:31 -0800193 encoded_bytes += enc_len;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000194 processed_samples += frame_size_;
195 }
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000196 // For some codecs it doesn't make sense to check expected number of bytes,
197 // since the number can vary for different platforms. Opus and iSAC are
198 // such codecs. In this case expected_bytes is set to 0.
199 if (expected_bytes) {
ossu10a029e2016-03-01 00:41:31 -0800200 EXPECT_EQ(expected_bytes, encoded_bytes);
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000201 }
Yves Gerey665174f2018-06-19 15:03:05 +0200202 CompareInputOutput(input, decoded, processed_samples, channels_, tolerance,
203 delay);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000204 if (channels_ == 2)
Yves Gerey665174f2018-06-19 15:03:05 +0200205 CompareTwoChannels(decoded, processed_samples, channels_,
206 channel_diff_tolerance);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000207 EXPECT_LE(
208 MseInputOutput(input, decoded, processed_samples, channels_, delay),
209 mse);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000210 }
211
212 // Encodes a payload and decodes it twice with decoder re-init before each
213 // decode. Verifies that the decoded result is the same.
214 void ReInitTest() {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000215 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800216 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000217 ASSERT_TRUE(
218 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100219 std::array<rtc::Buffer, 2> encoded;
220 EncodeFrame(input.get(), frame_size_, &encoded[0]);
221 // Make a copy.
222 encoded[1].SetData(encoded[0].data(), encoded[0].size());
223
224 std::array<std::vector<int16_t>, 2> outputs;
225 for (size_t i = 0; i < outputs.size(); ++i) {
226 outputs[i].resize(frame_size_ * channels_);
227 decoder_->Reset();
228 const std::vector<AudioDecoder::ParseResult> parse_result =
229 decoder_->ParsePayload(std::move(encoded[i]), /*timestamp=*/0);
230 RTC_CHECK_EQ(parse_result.size(), size_t{1});
231 auto decode_result = parse_result[0].frame->Decode(outputs[i]);
232 RTC_CHECK(decode_result.has_value());
233 EXPECT_EQ(frame_size_ * channels_, decode_result->num_decoded_samples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000234 }
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100235 EXPECT_EQ(outputs[0], outputs[1]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000236 }
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;
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100245 EncodeFrame(input.get(), frame_size_, &encoded);
Karl Wiberg43766482015-08-27 15:22:11 +0200246 decoder_->Reset();
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100247 std::vector<int16_t> output(frame_size_ * channels_);
248 const std::vector<AudioDecoder::ParseResult> parse_result =
249 decoder_->ParsePayload(std::move(encoded), /*timestamp=*/0);
250 RTC_CHECK_EQ(parse_result.size(), size_t{1});
251 auto decode_result = parse_result[0].frame->Decode(output);
252 RTC_CHECK(decode_result.has_value());
253 EXPECT_EQ(frame_size_ * channels_, decode_result->num_decoded_samples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000254 // Call DecodePlc and verify that we get one frame of data.
255 // (Overwrite the output from the above Decode call, but that does not
256 // matter.)
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100257 size_t dec_len =
258 decoder_->DecodePlc(/*num_frames=*/1, /*decoded=*/output.data());
turaj@webrtc.org6ad6a072013-09-30 20:07:39 +0000259 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000260 }
261
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000262 test::ResampleInputAudioFile input_audio_;
263 int codec_input_rate_hz_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000264 size_t frame_size_;
265 size_t data_length_;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000266 size_t channels_;
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000267 const int payload_type_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000268 AudioDecoder* decoder_;
kwiberg2d0c3322016-02-14 09:28:33 -0800269 std::unique_ptr<AudioEncoder> audio_encoder_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000270};
271
272class AudioDecoderPcmUTest : public AudioDecoderTest {
273 protected:
274 AudioDecoderPcmUTest() : AudioDecoderTest() {
275 frame_size_ = 160;
276 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700277 decoder_ = new AudioDecoderPcmU(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000278 AudioEncoderPcmU::Config config;
279 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000280 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000281 audio_encoder_.reset(new AudioEncoderPcmU(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000282 }
283};
284
285class AudioDecoderPcmATest : public AudioDecoderTest {
286 protected:
287 AudioDecoderPcmATest() : AudioDecoderTest() {
288 frame_size_ = 160;
289 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700290 decoder_ = new AudioDecoderPcmA(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000291 AudioEncoderPcmA::Config config;
292 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000293 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000294 audio_encoder_.reset(new AudioEncoderPcmA(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000295 }
296};
297
298class AudioDecoderPcm16BTest : public AudioDecoderTest {
299 protected:
300 AudioDecoderPcm16BTest() : AudioDecoderTest() {
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000301 codec_input_rate_hz_ = 16000;
302 frame_size_ = 20 * codec_input_rate_hz_ / 1000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000303 data_length_ = 10 * frame_size_;
kwiberg6c2eab32016-05-31 02:46:20 -0700304 decoder_ = new AudioDecoderPcm16B(codec_input_rate_hz_, 1);
Mirko Bonadei25ab3222021-07-08 20:08:20 +0200305 RTC_DCHECK(decoder_);
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000306 AudioEncoderPcm16B::Config config;
307 config.sample_rate_hz = codec_input_rate_hz_;
308 config.frame_size_ms =
309 static_cast<int>(frame_size_ / (config.sample_rate_hz / 1000));
310 config.payload_type = payload_type_;
311 audio_encoder_.reset(new AudioEncoderPcm16B(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000312 }
313};
314
315class AudioDecoderIlbcTest : public AudioDecoderTest {
316 protected:
317 AudioDecoderIlbcTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000318 codec_input_rate_hz_ = 8000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000319 frame_size_ = 240;
320 data_length_ = 10 * frame_size_;
solenbergdb3c9b02017-06-28 02:05:04 -0700321 decoder_ = new AudioDecoderIlbcImpl;
Mirko Bonadei25ab3222021-07-08 20:08:20 +0200322 RTC_DCHECK(decoder_);
solenbergdb3c9b02017-06-28 02:05:04 -0700323 AudioEncoderIlbcConfig config;
kwiberg@webrtc.orgcb858ba2014-12-08 17:11:44 +0000324 config.frame_size_ms = 30;
solenbergdb3c9b02017-06-28 02:05:04 -0700325 audio_encoder_.reset(new AudioEncoderIlbcImpl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000326 }
327
328 // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does
329 // not return any data. It simply resets a few states and returns 0.
330 void DecodePlcTest() {
331 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800332 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000333 ASSERT_TRUE(
334 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800335 rtc::Buffer encoded;
336 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000337 AudioDecoder::SpeechType speech_type;
Karl Wiberg43766482015-08-27 15:22:11 +0200338 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800339 std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
Yves Gerey665174f2018-06-19 15:03:05 +0200340 size_t dec_len = decoder_->Decode(
341 encoded.data(), enc_len, codec_input_rate_hz_,
342 frame_size_ * channels_ * sizeof(int16_t), output.get(), &speech_type);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000343 EXPECT_EQ(frame_size_, dec_len);
344 // Simply call DecodePlc and verify that we get 0 as return value.
Peter Kastingdce40cf2015-08-24 14:52:23 -0700345 EXPECT_EQ(0U, decoder_->DecodePlc(1, output.get()));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000346 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000347};
348
349class AudioDecoderIsacFloatTest : public AudioDecoderTest {
350 protected:
351 AudioDecoderIsacFloatTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000352 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000353 frame_size_ = 480;
354 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700355 AudioEncoderIsacFloatImpl::Config config;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000356 config.payload_type = payload_type_;
357 config.sample_rate_hz = codec_input_rate_hz_;
358 config.frame_size_ms =
359 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700360 audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200361 audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
Jiawei Ou608e6ba2019-07-25 11:14:35 -0700362
363 AudioDecoderIsacFloatImpl::Config decoder_config;
364 decoder_config.sample_rate_hz = codec_input_rate_hz_;
365 decoder_ = new AudioDecoderIsacFloatImpl(decoder_config);
turaj@webrtc.org1431e4d2014-11-11 01:44:13 +0000366 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000367};
368
369class AudioDecoderIsacSwbTest : public AudioDecoderTest {
370 protected:
371 AudioDecoderIsacSwbTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000372 codec_input_rate_hz_ = 32000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000373 frame_size_ = 960;
374 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700375 AudioEncoderIsacFloatImpl::Config config;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000376 config.payload_type = payload_type_;
377 config.sample_rate_hz = codec_input_rate_hz_;
378 config.frame_size_ms =
379 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700380 audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200381 audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
Jiawei Ou608e6ba2019-07-25 11:14:35 -0700382
383 AudioDecoderIsacFloatImpl::Config decoder_config;
384 decoder_config.sample_rate_hz = codec_input_rate_hz_;
385 decoder_ = new AudioDecoderIsacFloatImpl(decoder_config);
turaj@webrtc.org1431e4d2014-11-11 01:44:13 +0000386 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000387};
388
389class AudioDecoderIsacFixTest : public AudioDecoderTest {
390 protected:
391 AudioDecoderIsacFixTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000392 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000393 frame_size_ = 480;
394 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700395 AudioEncoderIsacFixImpl::Config config;
kwiberg@webrtc.org88bdec82014-12-16 12:49:37 +0000396 config.payload_type = payload_type_;
397 config.sample_rate_hz = codec_input_rate_hz_;
398 config.frame_size_ms =
399 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700400 audio_encoder_.reset(new AudioEncoderIsacFixImpl(config));
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200401 audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
Jiawei Ou608e6ba2019-07-25 11:14:35 -0700402
403 AudioDecoderIsacFixImpl::Config decoder_config;
404 decoder_config.sample_rate_hz = codec_input_rate_hz_;
405 decoder_ = new AudioDecoderIsacFixImpl(decoder_config);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000406 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000407};
408
409class AudioDecoderG722Test : public AudioDecoderTest {
410 protected:
411 AudioDecoderG722Test() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000412 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000413 frame_size_ = 160;
414 data_length_ = 10 * frame_size_;
kwibergb1ed7f02017-06-17 17:30:09 -0700415 decoder_ = new AudioDecoderG722Impl;
Mirko Bonadei25ab3222021-07-08 20:08:20 +0200416 RTC_DCHECK(decoder_);
kwibergb8727ae2017-06-17 17:41:59 -0700417 AudioEncoderG722Config config;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000418 config.frame_size_ms = 10;
419 config.num_channels = 1;
kwibergb8727ae2017-06-17 17:41:59 -0700420 audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000421 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000422};
423
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000424class AudioDecoderG722StereoTest : public AudioDecoderTest {
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000425 protected:
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000426 AudioDecoderG722StereoTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000427 channels_ = 2;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000428 codec_input_rate_hz_ = 16000;
429 frame_size_ = 160;
430 data_length_ = 10 * frame_size_;
kwiberg1b97e262017-06-26 04:19:43 -0700431 decoder_ = new AudioDecoderG722StereoImpl;
Mirko Bonadei25ab3222021-07-08 20:08:20 +0200432 RTC_DCHECK(decoder_);
kwibergb8727ae2017-06-17 17:41:59 -0700433 AudioEncoderG722Config config;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000434 config.frame_size_ms = 10;
435 config.num_channels = 2;
kwibergb8727ae2017-06-17 17:41:59 -0700436 audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000437 }
438};
439
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200440class AudioDecoderOpusTest
441 : public AudioDecoderTest,
442 public testing::WithParamInterface<std::tuple<int, int>> {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000443 protected:
444 AudioDecoderOpusTest() : AudioDecoderTest() {
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200445 channels_ = opus_num_channels_;
446 codec_input_rate_hz_ = opus_sample_rate_hz_;
447 frame_size_ = rtc::CheckedDivExact(opus_sample_rate_hz_, 100);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000448 data_length_ = 10 * frame_size_;
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200449 decoder_ =
450 new AudioDecoderOpusImpl(opus_num_channels_, opus_sample_rate_hz_);
kwiberg96da0112017-06-30 04:23:22 -0700451 AudioEncoderOpusConfig config;
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200452 config.frame_size_ms = 10;
453 config.sample_rate_hz = opus_sample_rate_hz_;
454 config.num_channels = opus_num_channels_;
455 config.application = opus_num_channels_ == 1
456 ? AudioEncoderOpusConfig::ApplicationMode::kVoip
457 : AudioEncoderOpusConfig::ApplicationMode::kAudio;
kwiberg96da0112017-06-30 04:23:22 -0700458 audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200459 audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000460 }
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200461 const int opus_sample_rate_hz_{std::get<0>(GetParam())};
462 const int opus_num_channels_{std::get<1>(GetParam())};
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000463};
464
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200465INSTANTIATE_TEST_SUITE_P(Param,
466 AudioDecoderOpusTest,
467 testing::Combine(testing::Values(16000, 48000),
468 testing::Values(1, 2)));
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000469
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000470TEST_F(AudioDecoderPcmUTest, EncodeDecode) {
471 int tolerance = 251;
472 double mse = 1734.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000473 EncodeDecodeTest(data_length_, tolerance, mse);
474 ReInitTest();
475 EXPECT_FALSE(decoder_->HasDecodePlc());
476}
477
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200478namespace {
479int SetAndGetTargetBitrate(AudioEncoder* audio_encoder, int rate) {
Danil Chapovalovb6021232018-06-19 13:26:36 +0200480 audio_encoder->OnReceivedUplinkBandwidth(rate, absl::nullopt);
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200481 return audio_encoder->GetTargetBitrate();
482}
483void TestSetAndGetTargetBitratesWithFixedCodec(AudioEncoder* audio_encoder,
484 int fixed_rate) {
485 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, 32000));
486 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate - 1));
487 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate));
488 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate + 1));
489}
490} // namespace
491
492TEST_F(AudioDecoderPcmUTest, SetTargetBitrate) {
493 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
494}
495
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000496TEST_F(AudioDecoderPcmATest, EncodeDecode) {
497 int tolerance = 308;
498 double mse = 1931.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000499 EncodeDecodeTest(data_length_, tolerance, mse);
500 ReInitTest();
501 EXPECT_FALSE(decoder_->HasDecodePlc());
502}
503
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200504TEST_F(AudioDecoderPcmATest, SetTargetBitrate) {
505 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
506}
507
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000508TEST_F(AudioDecoderPcm16BTest, EncodeDecode) {
509 int tolerance = 0;
510 double mse = 0.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000511 EncodeDecodeTest(2 * data_length_, tolerance, mse);
512 ReInitTest();
513 EXPECT_FALSE(decoder_->HasDecodePlc());
514}
515
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200516TEST_F(AudioDecoderPcm16BTest, SetTargetBitrate) {
517 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(),
518 codec_input_rate_hz_ * 16);
519}
520
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000521TEST_F(AudioDecoderIlbcTest, EncodeDecode) {
522 int tolerance = 6808;
523 double mse = 2.13e6;
524 int delay = 80; // Delay from input to output.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000525 EncodeDecodeTest(500, tolerance, mse, delay);
526 ReInitTest();
527 EXPECT_TRUE(decoder_->HasDecodePlc());
528 DecodePlcTest();
529}
530
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200531TEST_F(AudioDecoderIlbcTest, SetTargetBitrate) {
532 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 13333);
533}
534
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000535TEST_F(AudioDecoderIsacFloatTest, EncodeDecode) {
536 int tolerance = 3399;
537 double mse = 434951.0;
538 int delay = 48; // 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(AudioDecoderIsacFloatTest, SetTargetBitrate) {
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200545 const int overhead_rate =
546 8 * kOverheadBytesPerPacket * codec_input_rate_hz_ / frame_size_;
547 EXPECT_EQ(10000,
548 SetAndGetTargetBitrate(audio_encoder_.get(), 9999 + overhead_rate));
549 EXPECT_EQ(10000, SetAndGetTargetBitrate(audio_encoder_.get(),
550 10000 + overhead_rate));
551 EXPECT_EQ(23456, SetAndGetTargetBitrate(audio_encoder_.get(),
552 23456 + overhead_rate));
553 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
554 32000 + overhead_rate));
555 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
556 32001 + overhead_rate));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200557}
558
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000559TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) {
560 int tolerance = 19757;
561 double mse = 8.18e6;
562 int delay = 160; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000563 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000564 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000565 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000566}
567
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200568TEST_F(AudioDecoderIsacSwbTest, SetTargetBitrate) {
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200569 const int overhead_rate =
570 8 * kOverheadBytesPerPacket * codec_input_rate_hz_ / frame_size_;
571 EXPECT_EQ(10000,
572 SetAndGetTargetBitrate(audio_encoder_.get(), 9999 + overhead_rate));
573 EXPECT_EQ(10000, SetAndGetTargetBitrate(audio_encoder_.get(),
574 10000 + overhead_rate));
575 EXPECT_EQ(23456, SetAndGetTargetBitrate(audio_encoder_.get(),
576 23456 + overhead_rate));
577 EXPECT_EQ(56000, SetAndGetTargetBitrate(audio_encoder_.get(),
578 56000 + overhead_rate));
579 EXPECT_EQ(56000, SetAndGetTargetBitrate(audio_encoder_.get(),
580 56001 + overhead_rate));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200581}
582
kwiberg5b659c02015-12-11 07:33:59 -0800583TEST_F(AudioDecoderIsacFixTest, EncodeDecode) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000584 int tolerance = 11034;
585 double mse = 3.46e6;
586 int delay = 54; // Delay from input to output.
kwiberg5b659c02015-12-11 07:33:59 -0800587#if defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM)
kwiberg@webrtc.orge102e812014-12-17 07:30:23 +0000588 static const int kEncodedBytes = 685;
Christoffer Jansson72084572021-06-28 11:04:45 +0200589#elif defined(WEBRTC_ARCH_ARM64)
kwiberg5b659c02015-12-11 07:33:59 -0800590 static const int kEncodedBytes = 673;
Christoffer Jansson46d002c2021-06-24 10:00:17 +0200591#elif defined(WEBRTC_MAC) && defined(WEBRTC_ARCH_ARM64) // M1 Mac
592 static const int kEncodedBytes = 673;
kwiberg@webrtc.orge102e812014-12-17 07:30:23 +0000593#else
594 static const int kEncodedBytes = 671;
595#endif
596 EncodeDecodeTest(kEncodedBytes, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000597 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000598 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000599}
600
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200601TEST_F(AudioDecoderIsacFixTest, SetTargetBitrate) {
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200602 const int overhead_rate =
603 8 * kOverheadBytesPerPacket * codec_input_rate_hz_ / frame_size_;
604 EXPECT_EQ(10000,
605 SetAndGetTargetBitrate(audio_encoder_.get(), 9999 + overhead_rate));
606 EXPECT_EQ(10000, SetAndGetTargetBitrate(audio_encoder_.get(),
607 10000 + overhead_rate));
608 EXPECT_EQ(23456, SetAndGetTargetBitrate(audio_encoder_.get(),
609 23456 + overhead_rate));
610 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
611 32000 + overhead_rate));
612 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
613 32001 + overhead_rate));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200614}
615
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000616TEST_F(AudioDecoderG722Test, EncodeDecode) {
617 int tolerance = 6176;
618 double mse = 238630.0;
619 int delay = 22; // Delay from input to output.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000620 EncodeDecodeTest(data_length_ / 2, tolerance, mse, delay);
621 ReInitTest();
622 EXPECT_FALSE(decoder_->HasDecodePlc());
623}
624
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200625TEST_F(AudioDecoderG722Test, SetTargetBitrate) {
626 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
627}
628
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000629TEST_F(AudioDecoderG722StereoTest, EncodeDecode) {
630 int tolerance = 6176;
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000631 int channel_diff_tolerance = 0;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000632 double mse = 238630.0;
633 int delay = 22; // Delay from input to output.
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000634 EncodeDecodeTest(data_length_, tolerance, mse, delay, channel_diff_tolerance);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000635 ReInitTest();
636 EXPECT_FALSE(decoder_->HasDecodePlc());
637}
638
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200639TEST_F(AudioDecoderG722StereoTest, SetTargetBitrate) {
640 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 128000);
641}
642
Jakob Ivarsson213dc2c2021-03-10 12:38:34 +0100643// TODO(http://bugs.webrtc.org/12518): Enable the test after Opus has been
644// updated.
645TEST_P(AudioDecoderOpusTest, DISABLED_EncodeDecode) {
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200646 constexpr int tolerance = 6176;
Ivo Creusen16ddae92020-03-04 17:16:59 +0100647 constexpr int channel_diff_tolerance = 6;
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200648 constexpr double mse = 238630.0;
649 constexpr int delay = 22; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000650 EncodeDecodeTest(0, tolerance, mse, delay, channel_diff_tolerance);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000651 ReInitTest();
652 EXPECT_FALSE(decoder_->HasDecodePlc());
653}
654
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200655TEST_P(AudioDecoderOpusTest, SetTargetBitrate) {
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200656 const int overhead_rate =
657 8 * kOverheadBytesPerPacket * codec_input_rate_hz_ / frame_size_;
658 EXPECT_EQ(6000,
659 SetAndGetTargetBitrate(audio_encoder_.get(), 5999 + overhead_rate));
660 EXPECT_EQ(6000,
661 SetAndGetTargetBitrate(audio_encoder_.get(), 6000 + overhead_rate));
662 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
663 32000 + overhead_rate));
664 EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder_.get(),
665 510000 + overhead_rate));
666 EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder_.get(),
667 511000 + overhead_rate));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200668}
669
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000670} // namespace webrtc