blob: bb5c6d167be3fd8000e6fd89d9f31ae8208fa1a4 [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"
Artem Titovee966752021-08-06 14:18:10 +020033#include "rtc_base/system/arch.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020034#include "test/gtest.h"
Steve Anton10542f22019-01-11 09:11:00 -080035#include "test/testsupport/file_utils.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000036
37namespace webrtc {
38
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000039namespace {
Jakob Ivarsson36274f92020-10-22 13:01:07 +020040
41constexpr int kOverheadBytesPerPacket = 50;
42
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000043// The absolute difference between the input and output (the first channel) is
Artem Titovd00ce742021-07-28 20:00:17 +020044// compared vs `tolerance`. The parameter `delay` is used to correct for codec
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000045// delays.
46void CompareInputOutput(const std::vector<int16_t>& input,
47 const std::vector<int16_t>& output,
48 size_t num_samples,
49 size_t channels,
50 int tolerance,
51 int delay) {
52 ASSERT_LE(num_samples, input.size());
53 ASSERT_LE(num_samples * channels, output.size());
54 for (unsigned int n = 0; n < num_samples - delay; ++n) {
55 ASSERT_NEAR(input[n], output[channels * n + delay], tolerance)
56 << "Exit test on first diff; n = " << n;
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000057 }
58}
59
Artem Titovd00ce742021-07-28 20:00:17 +020060// The absolute difference between the first two channels in `output` is
61// compared vs `tolerance`.
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000062void CompareTwoChannels(const std::vector<int16_t>& output,
63 size_t samples_per_channel,
64 size_t channels,
65 int tolerance) {
66 ASSERT_GE(channels, 2u);
67 ASSERT_LE(samples_per_channel * channels, output.size());
68 for (unsigned int n = 0; n < samples_per_channel; ++n)
69 ASSERT_NEAR(output[channels * n], output[channels * n + 1], tolerance)
70 << "Stereo samples differ.";
71}
72
73// Calculates mean-squared error between input and output (the first channel).
Artem Titovd00ce742021-07-28 20:00:17 +020074// The parameter `delay` is used to correct for codec delays.
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000075double MseInputOutput(const std::vector<int16_t>& input,
76 const std::vector<int16_t>& output,
77 size_t num_samples,
78 size_t channels,
79 int delay) {
Mirko Bonadei25ab3222021-07-08 20:08:20 +020080 RTC_DCHECK_LT(delay, static_cast<int>(num_samples));
81 RTC_DCHECK_LE(num_samples, input.size());
82 RTC_DCHECK_LE(num_samples * channels, output.size());
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +000083 if (num_samples == 0)
84 return 0.0;
85 double squared_sum = 0.0;
86 for (unsigned int n = 0; n < num_samples - delay; ++n) {
87 squared_sum += (input[n] - output[channels * n + delay]) *
88 (input[n] - output[channels * n + delay]);
89 }
90 return squared_sum / (num_samples - delay);
91}
92} // namespace
93
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000094class AudioDecoderTest : public ::testing::Test {
95 protected:
96 AudioDecoderTest()
kjellander02060002016-02-16 22:06:12 -080097 : input_audio_(
98 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
99 32000),
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000100 codec_input_rate_hz_(32000), // Legacy default value.
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000101 frame_size_(0),
102 data_length_(0),
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000103 channels_(1),
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000104 payload_type_(17),
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000105 decoder_(NULL) {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000106
Mirko Bonadei682aac52018-07-20 13:59:20 +0200107 ~AudioDecoderTest() override {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000108
Mirko Bonadei682aac52018-07-20 13:59:20 +0200109 void SetUp() override {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000110 if (audio_encoder_)
kwiberg@webrtc.org05211272015-02-18 12:00:32 +0000111 codec_input_rate_hz_ = audio_encoder_->SampleRateHz();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000112 // Create arrays.
113 ASSERT_GT(data_length_, 0u) << "The test must set data_length_ > 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000114 }
115
Mirko Bonadei682aac52018-07-20 13:59:20 +0200116 void TearDown() override {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000117 delete decoder_;
118 decoder_ = NULL;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000119 }
120
Yves Gerey665174f2018-06-19 15:03:05 +0200121 virtual void InitEncoder() {}
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000122
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000123 // TODO(henrik.lundin) Change return type to size_t once most/all overriding
124 // implementations are gone.
125 virtual int EncodeFrame(const int16_t* input,
126 size_t input_len_samples,
ossu10a029e2016-03-01 00:41:31 -0800127 rtc::Buffer* output) {
128 AudioEncoder::EncodedInfo encoded_info;
kwiberg@webrtc.org05211272015-02-18 12:00:32 +0000129 const size_t samples_per_10ms = audio_encoder_->SampleRateHz() / 100;
henrikg91d6ede2015-09-17 00:24:34 -0700130 RTC_CHECK_EQ(samples_per_10ms * audio_encoder_->Num10MsFramesInNextPacket(),
131 input_len_samples);
kwiberg2d0c3322016-02-14 09:28:33 -0800132 std::unique_ptr<int16_t[]> interleaved_input(
henrik.lundin@webrtc.org130fef82014-12-08 21:07:59 +0000133 new int16_t[channels_ * samples_per_10ms]);
Peter Kastingdce40cf2015-08-24 14:52:23 -0700134 for (size_t i = 0; i < audio_encoder_->Num10MsFramesInNextPacket(); ++i) {
ossu10a029e2016-03-01 00:41:31 -0800135 EXPECT_EQ(0u, encoded_info.encoded_bytes);
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000136
137 // Duplicate the mono input signal to however many channels the test
138 // wants.
henrik.lundin@webrtc.org130fef82014-12-08 21:07:59 +0000139 test::InputAudioFile::DuplicateInterleaved(input + i * samples_per_10ms,
140 samples_per_10ms, channels_,
141 interleaved_input.get());
kwiberg@webrtc.org663fdd02014-10-29 07:28:36 +0000142
Yves Gerey665174f2018-06-19 15:03:05 +0200143 encoded_info =
144 audio_encoder_->Encode(0,
145 rtc::ArrayView<const int16_t>(
146 interleaved_input.get(),
147 audio_encoder_->NumChannels() *
148 audio_encoder_->SampleRateHz() / 100),
149 output);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000150 }
ossu10a029e2016-03-01 00:41:31 -0800151 EXPECT_EQ(payload_type_, encoded_info.payload_type);
152 return static_cast<int>(encoded_info.encoded_bytes);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000153 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000154
155 // Encodes and decodes audio. The absolute difference between the input and
Artem Titovd00ce742021-07-28 20:00:17 +0200156 // output is compared vs `tolerance`, and the mean-squared error is compared
157 // with `mse`. The encoded stream should contain `expected_bytes`. For stereo
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000158 // audio, the absolute difference between the two channels is compared vs
Artem Titovd00ce742021-07-28 20:00:17 +0200159 // `channel_diff_tolerance`.
Yves Gerey665174f2018-06-19 15:03:05 +0200160 void EncodeDecodeTest(size_t expected_bytes,
161 int tolerance,
162 double mse,
163 int delay = 0,
164 int channel_diff_tolerance = 0) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000165 ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0";
Yves Gerey665174f2018-06-19 15:03:05 +0200166 ASSERT_GE(channel_diff_tolerance, 0)
167 << "Test must define a channel_diff_tolerance >= 0";
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000168 size_t processed_samples = 0u;
ossu10a029e2016-03-01 00:41:31 -0800169 size_t encoded_bytes = 0u;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000170 InitEncoder();
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000171 std::vector<int16_t> input;
172 std::vector<int16_t> decoded;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000173 while (processed_samples + frame_size_ <= data_length_) {
Artem Titovd00ce742021-07-28 20:00:17 +0200174 // Extend input vector with `frame_size_`.
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000175 input.resize(input.size() + frame_size_, 0);
176 // Read from input file.
177 ASSERT_GE(input.size() - processed_samples, frame_size_);
Yves Gerey665174f2018-06-19 15:03:05 +0200178 ASSERT_TRUE(input_audio_.Read(frame_size_, codec_input_rate_hz_,
179 &input[processed_samples]));
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100180 rtc::Buffer encoded;
Yves Gerey665174f2018-06-19 15:03:05 +0200181 size_t enc_len =
182 EncodeFrame(&input[processed_samples], frame_size_, &encoded);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000183 // Make sure that frame_size_ * channels_ samples are allocated and free.
184 decoded.resize((processed_samples + frame_size_) * channels_, 0);
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100185
186 const std::vector<AudioDecoder::ParseResult> parse_result =
187 decoder_->ParsePayload(std::move(encoded), /*timestamp=*/0);
188 RTC_CHECK_EQ(parse_result.size(), size_t{1});
189 auto decode_result = parse_result[0].frame->Decode(
190 rtc::ArrayView<int16_t>(&decoded[processed_samples * channels_],
191 frame_size_ * channels_ * sizeof(int16_t)));
192 RTC_CHECK(decode_result.has_value());
193 EXPECT_EQ(frame_size_ * channels_, decode_result->num_decoded_samples);
ossu10a029e2016-03-01 00:41:31 -0800194 encoded_bytes += enc_len;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000195 processed_samples += frame_size_;
196 }
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000197 // For some codecs it doesn't make sense to check expected number of bytes,
198 // since the number can vary for different platforms. Opus and iSAC are
199 // such codecs. In this case expected_bytes is set to 0.
200 if (expected_bytes) {
ossu10a029e2016-03-01 00:41:31 -0800201 EXPECT_EQ(expected_bytes, encoded_bytes);
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000202 }
Yves Gerey665174f2018-06-19 15:03:05 +0200203 CompareInputOutput(input, decoded, processed_samples, channels_, tolerance,
204 delay);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000205 if (channels_ == 2)
Yves Gerey665174f2018-06-19 15:03:05 +0200206 CompareTwoChannels(decoded, processed_samples, channels_,
207 channel_diff_tolerance);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000208 EXPECT_LE(
209 MseInputOutput(input, decoded, processed_samples, channels_, delay),
210 mse);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000211 }
212
213 // Encodes a payload and decodes it twice with decoder re-init before each
214 // decode. Verifies that the decoded result is the same.
215 void ReInitTest() {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000216 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800217 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000218 ASSERT_TRUE(
219 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100220 std::array<rtc::Buffer, 2> encoded;
221 EncodeFrame(input.get(), frame_size_, &encoded[0]);
222 // Make a copy.
223 encoded[1].SetData(encoded[0].data(), encoded[0].size());
224
225 std::array<std::vector<int16_t>, 2> outputs;
226 for (size_t i = 0; i < outputs.size(); ++i) {
227 outputs[i].resize(frame_size_ * channels_);
228 decoder_->Reset();
229 const std::vector<AudioDecoder::ParseResult> parse_result =
230 decoder_->ParsePayload(std::move(encoded[i]), /*timestamp=*/0);
231 RTC_CHECK_EQ(parse_result.size(), size_t{1});
232 auto decode_result = parse_result[0].frame->Decode(outputs[i]);
233 RTC_CHECK(decode_result.has_value());
234 EXPECT_EQ(frame_size_ * channels_, decode_result->num_decoded_samples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000235 }
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100236 EXPECT_EQ(outputs[0], outputs[1]);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000237 }
238
239 // Call DecodePlc and verify that the correct number of samples is produced.
240 void DecodePlcTest() {
241 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800242 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000243 ASSERT_TRUE(
244 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800245 rtc::Buffer encoded;
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100246 EncodeFrame(input.get(), frame_size_, &encoded);
Karl Wiberg43766482015-08-27 15:22:11 +0200247 decoder_->Reset();
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100248 std::vector<int16_t> output(frame_size_ * channels_);
249 const std::vector<AudioDecoder::ParseResult> parse_result =
250 decoder_->ParsePayload(std::move(encoded), /*timestamp=*/0);
251 RTC_CHECK_EQ(parse_result.size(), size_t{1});
252 auto decode_result = parse_result[0].frame->Decode(output);
253 RTC_CHECK(decode_result.has_value());
254 EXPECT_EQ(frame_size_ * channels_, decode_result->num_decoded_samples);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000255 // Call DecodePlc and verify that we get one frame of data.
256 // (Overwrite the output from the above Decode call, but that does not
257 // matter.)
Alessio Bazzicab28e57e2020-02-13 09:18:24 +0100258 size_t dec_len =
259 decoder_->DecodePlc(/*num_frames=*/1, /*decoded=*/output.data());
turaj@webrtc.org6ad6a072013-09-30 20:07:39 +0000260 EXPECT_EQ(frame_size_ * channels_, dec_len);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000261 }
262
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000263 test::ResampleInputAudioFile input_audio_;
264 int codec_input_rate_hz_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000265 size_t frame_size_;
266 size_t data_length_;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000267 size_t channels_;
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000268 const int payload_type_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000269 AudioDecoder* decoder_;
kwiberg2d0c3322016-02-14 09:28:33 -0800270 std::unique_ptr<AudioEncoder> audio_encoder_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000271};
272
273class AudioDecoderPcmUTest : public AudioDecoderTest {
274 protected:
275 AudioDecoderPcmUTest() : AudioDecoderTest() {
276 frame_size_ = 160;
277 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700278 decoder_ = new AudioDecoderPcmU(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000279 AudioEncoderPcmU::Config config;
280 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000281 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000282 audio_encoder_.reset(new AudioEncoderPcmU(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000283 }
284};
285
286class AudioDecoderPcmATest : public AudioDecoderTest {
287 protected:
288 AudioDecoderPcmATest() : AudioDecoderTest() {
289 frame_size_ = 160;
290 data_length_ = 10 * frame_size_;
kwiberg89671832015-09-22 14:06:29 -0700291 decoder_ = new AudioDecoderPcmA(1);
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000292 AudioEncoderPcmA::Config config;
293 config.frame_size_ms = static_cast<int>(frame_size_ / 8);
henrik.lundin@webrtc.org7f1dfa52014-12-02 12:08:39 +0000294 config.payload_type = payload_type_;
henrik.lundin@webrtc.orgdef1e972014-10-21 12:48:29 +0000295 audio_encoder_.reset(new AudioEncoderPcmA(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000296 }
297};
298
299class AudioDecoderPcm16BTest : public AudioDecoderTest {
300 protected:
301 AudioDecoderPcm16BTest() : AudioDecoderTest() {
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000302 codec_input_rate_hz_ = 16000;
303 frame_size_ = 20 * codec_input_rate_hz_ / 1000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000304 data_length_ = 10 * frame_size_;
kwiberg6c2eab32016-05-31 02:46:20 -0700305 decoder_ = new AudioDecoderPcm16B(codec_input_rate_hz_, 1);
Mirko Bonadei25ab3222021-07-08 20:08:20 +0200306 RTC_DCHECK(decoder_);
henrik.lundin@webrtc.org817e50d2014-12-11 10:47:19 +0000307 AudioEncoderPcm16B::Config config;
308 config.sample_rate_hz = codec_input_rate_hz_;
309 config.frame_size_ms =
310 static_cast<int>(frame_size_ / (config.sample_rate_hz / 1000));
311 config.payload_type = payload_type_;
312 audio_encoder_.reset(new AudioEncoderPcm16B(config));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000313 }
314};
315
316class AudioDecoderIlbcTest : public AudioDecoderTest {
317 protected:
318 AudioDecoderIlbcTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000319 codec_input_rate_hz_ = 8000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000320 frame_size_ = 240;
321 data_length_ = 10 * frame_size_;
solenbergdb3c9b02017-06-28 02:05:04 -0700322 decoder_ = new AudioDecoderIlbcImpl;
Mirko Bonadei25ab3222021-07-08 20:08:20 +0200323 RTC_DCHECK(decoder_);
solenbergdb3c9b02017-06-28 02:05:04 -0700324 AudioEncoderIlbcConfig config;
kwiberg@webrtc.orgcb858ba2014-12-08 17:11:44 +0000325 config.frame_size_ms = 30;
solenbergdb3c9b02017-06-28 02:05:04 -0700326 audio_encoder_.reset(new AudioEncoderIlbcImpl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000327 }
328
329 // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does
330 // not return any data. It simply resets a few states and returns 0.
331 void DecodePlcTest() {
332 InitEncoder();
kwiberg2d0c3322016-02-14 09:28:33 -0800333 std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000334 ASSERT_TRUE(
335 input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
ossu10a029e2016-03-01 00:41:31 -0800336 rtc::Buffer encoded;
337 size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000338 AudioDecoder::SpeechType speech_type;
Karl Wiberg43766482015-08-27 15:22:11 +0200339 decoder_->Reset();
kwiberg2d0c3322016-02-14 09:28:33 -0800340 std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
Yves Gerey665174f2018-06-19 15:03:05 +0200341 size_t dec_len = decoder_->Decode(
342 encoded.data(), enc_len, codec_input_rate_hz_,
343 frame_size_ * channels_ * sizeof(int16_t), output.get(), &speech_type);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000344 EXPECT_EQ(frame_size_, dec_len);
345 // Simply call DecodePlc and verify that we get 0 as return value.
Peter Kastingdce40cf2015-08-24 14:52:23 -0700346 EXPECT_EQ(0U, decoder_->DecodePlc(1, output.get()));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000347 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000348};
349
350class AudioDecoderIsacFloatTest : public AudioDecoderTest {
351 protected:
352 AudioDecoderIsacFloatTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000353 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000354 frame_size_ = 480;
355 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700356 AudioEncoderIsacFloatImpl::Config config;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000357 config.payload_type = payload_type_;
358 config.sample_rate_hz = codec_input_rate_hz_;
359 config.frame_size_ms =
360 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700361 audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200362 audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
Jiawei Ou608e6ba2019-07-25 11:14:35 -0700363
364 AudioDecoderIsacFloatImpl::Config decoder_config;
365 decoder_config.sample_rate_hz = codec_input_rate_hz_;
366 decoder_ = new AudioDecoderIsacFloatImpl(decoder_config);
turaj@webrtc.org1431e4d2014-11-11 01:44:13 +0000367 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000368};
369
370class AudioDecoderIsacSwbTest : public AudioDecoderTest {
371 protected:
372 AudioDecoderIsacSwbTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000373 codec_input_rate_hz_ = 32000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000374 frame_size_ = 960;
375 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700376 AudioEncoderIsacFloatImpl::Config config;
kwiberg@webrtc.orgb3ad8cf2014-12-11 10:08:19 +0000377 config.payload_type = payload_type_;
378 config.sample_rate_hz = codec_input_rate_hz_;
379 config.frame_size_ms =
380 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700381 audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200382 audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
Jiawei Ou608e6ba2019-07-25 11:14:35 -0700383
384 AudioDecoderIsacFloatImpl::Config decoder_config;
385 decoder_config.sample_rate_hz = codec_input_rate_hz_;
386 decoder_ = new AudioDecoderIsacFloatImpl(decoder_config);
turaj@webrtc.org1431e4d2014-11-11 01:44:13 +0000387 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000388};
389
390class AudioDecoderIsacFixTest : public AudioDecoderTest {
391 protected:
392 AudioDecoderIsacFixTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000393 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000394 frame_size_ = 480;
395 data_length_ = 10 * frame_size_;
kwiberg6ff045f2017-08-17 05:31:02 -0700396 AudioEncoderIsacFixImpl::Config config;
kwiberg@webrtc.org88bdec82014-12-16 12:49:37 +0000397 config.payload_type = payload_type_;
398 config.sample_rate_hz = codec_input_rate_hz_;
399 config.frame_size_ms =
400 1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
kwiberg6ff045f2017-08-17 05:31:02 -0700401 audio_encoder_.reset(new AudioEncoderIsacFixImpl(config));
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200402 audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
Jiawei Ou608e6ba2019-07-25 11:14:35 -0700403
404 AudioDecoderIsacFixImpl::Config decoder_config;
405 decoder_config.sample_rate_hz = codec_input_rate_hz_;
406 decoder_ = new AudioDecoderIsacFixImpl(decoder_config);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000407 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000408};
409
410class AudioDecoderG722Test : public AudioDecoderTest {
411 protected:
412 AudioDecoderG722Test() : AudioDecoderTest() {
henrik.lundin@webrtc.orga37f1dd2014-10-27 12:58:18 +0000413 codec_input_rate_hz_ = 16000;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000414 frame_size_ = 160;
415 data_length_ = 10 * frame_size_;
kwibergb1ed7f02017-06-17 17:30:09 -0700416 decoder_ = new AudioDecoderG722Impl;
Mirko Bonadei25ab3222021-07-08 20:08:20 +0200417 RTC_DCHECK(decoder_);
kwibergb8727ae2017-06-17 17:41:59 -0700418 AudioEncoderG722Config config;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000419 config.frame_size_ms = 10;
420 config.num_channels = 1;
kwibergb8727ae2017-06-17 17:41:59 -0700421 audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000422 }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000423};
424
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000425class AudioDecoderG722StereoTest : public AudioDecoderTest {
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000426 protected:
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000427 AudioDecoderG722StereoTest() : AudioDecoderTest() {
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000428 channels_ = 2;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000429 codec_input_rate_hz_ = 16000;
430 frame_size_ = 160;
431 data_length_ = 10 * frame_size_;
kwiberg1b97e262017-06-26 04:19:43 -0700432 decoder_ = new AudioDecoderG722StereoImpl;
Mirko Bonadei25ab3222021-07-08 20:08:20 +0200433 RTC_DCHECK(decoder_);
kwibergb8727ae2017-06-17 17:41:59 -0700434 AudioEncoderG722Config config;
kwiberg@webrtc.org0cd55582014-12-02 11:45:51 +0000435 config.frame_size_ms = 10;
436 config.num_channels = 2;
kwibergb8727ae2017-06-17 17:41:59 -0700437 audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000438 }
439};
440
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200441class AudioDecoderOpusTest
442 : public AudioDecoderTest,
443 public testing::WithParamInterface<std::tuple<int, int>> {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000444 protected:
445 AudioDecoderOpusTest() : AudioDecoderTest() {
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200446 channels_ = opus_num_channels_;
447 codec_input_rate_hz_ = opus_sample_rate_hz_;
448 frame_size_ = rtc::CheckedDivExact(opus_sample_rate_hz_, 100);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000449 data_length_ = 10 * frame_size_;
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200450 decoder_ =
451 new AudioDecoderOpusImpl(opus_num_channels_, opus_sample_rate_hz_);
kwiberg96da0112017-06-30 04:23:22 -0700452 AudioEncoderOpusConfig config;
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200453 config.frame_size_ms = 10;
454 config.sample_rate_hz = opus_sample_rate_hz_;
455 config.num_channels = opus_num_channels_;
456 config.application = opus_num_channels_ == 1
457 ? AudioEncoderOpusConfig::ApplicationMode::kVoip
458 : AudioEncoderOpusConfig::ApplicationMode::kAudio;
kwiberg96da0112017-06-30 04:23:22 -0700459 audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200460 audio_encoder_->OnReceivedOverhead(kOverheadBytesPerPacket);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000461 }
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200462 const int opus_sample_rate_hz_{std::get<0>(GetParam())};
463 const int opus_num_channels_{std::get<1>(GetParam())};
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000464};
465
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200466INSTANTIATE_TEST_SUITE_P(Param,
467 AudioDecoderOpusTest,
468 testing::Combine(testing::Values(16000, 48000),
469 testing::Values(1, 2)));
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000470
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000471TEST_F(AudioDecoderPcmUTest, EncodeDecode) {
472 int tolerance = 251;
473 double mse = 1734.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000474 EncodeDecodeTest(data_length_, tolerance, mse);
475 ReInitTest();
476 EXPECT_FALSE(decoder_->HasDecodePlc());
477}
478
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200479namespace {
480int SetAndGetTargetBitrate(AudioEncoder* audio_encoder, int rate) {
Danil Chapovalovb6021232018-06-19 13:26:36 +0200481 audio_encoder->OnReceivedUplinkBandwidth(rate, absl::nullopt);
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200482 return audio_encoder->GetTargetBitrate();
483}
484void TestSetAndGetTargetBitratesWithFixedCodec(AudioEncoder* audio_encoder,
485 int fixed_rate) {
486 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, 32000));
487 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate - 1));
488 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate));
489 EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate + 1));
490}
491} // namespace
492
493TEST_F(AudioDecoderPcmUTest, SetTargetBitrate) {
494 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
495}
496
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000497TEST_F(AudioDecoderPcmATest, EncodeDecode) {
498 int tolerance = 308;
499 double mse = 1931.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000500 EncodeDecodeTest(data_length_, tolerance, mse);
501 ReInitTest();
502 EXPECT_FALSE(decoder_->HasDecodePlc());
503}
504
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200505TEST_F(AudioDecoderPcmATest, SetTargetBitrate) {
506 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
507}
508
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000509TEST_F(AudioDecoderPcm16BTest, EncodeDecode) {
510 int tolerance = 0;
511 double mse = 0.0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000512 EncodeDecodeTest(2 * data_length_, tolerance, mse);
513 ReInitTest();
514 EXPECT_FALSE(decoder_->HasDecodePlc());
515}
516
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200517TEST_F(AudioDecoderPcm16BTest, SetTargetBitrate) {
518 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(),
519 codec_input_rate_hz_ * 16);
520}
521
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000522TEST_F(AudioDecoderIlbcTest, EncodeDecode) {
523 int tolerance = 6808;
524 double mse = 2.13e6;
525 int delay = 80; // Delay from input to output.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000526 EncodeDecodeTest(500, tolerance, mse, delay);
527 ReInitTest();
528 EXPECT_TRUE(decoder_->HasDecodePlc());
529 DecodePlcTest();
530}
531
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200532TEST_F(AudioDecoderIlbcTest, SetTargetBitrate) {
533 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 13333);
534}
535
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000536TEST_F(AudioDecoderIsacFloatTest, EncodeDecode) {
537 int tolerance = 3399;
538 double mse = 434951.0;
539 int delay = 48; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000540 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000541 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000542 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000543}
544
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200545TEST_F(AudioDecoderIsacFloatTest, SetTargetBitrate) {
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200546 const int overhead_rate =
547 8 * kOverheadBytesPerPacket * codec_input_rate_hz_ / frame_size_;
548 EXPECT_EQ(10000,
549 SetAndGetTargetBitrate(audio_encoder_.get(), 9999 + overhead_rate));
550 EXPECT_EQ(10000, SetAndGetTargetBitrate(audio_encoder_.get(),
551 10000 + overhead_rate));
552 EXPECT_EQ(23456, SetAndGetTargetBitrate(audio_encoder_.get(),
553 23456 + overhead_rate));
554 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
555 32000 + overhead_rate));
556 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
557 32001 + overhead_rate));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200558}
559
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000560TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) {
561 int tolerance = 19757;
562 double mse = 8.18e6;
563 int delay = 160; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000564 EncodeDecodeTest(0, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000565 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000566 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000567}
568
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200569TEST_F(AudioDecoderIsacSwbTest, SetTargetBitrate) {
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200570 const int overhead_rate =
571 8 * kOverheadBytesPerPacket * codec_input_rate_hz_ / frame_size_;
572 EXPECT_EQ(10000,
573 SetAndGetTargetBitrate(audio_encoder_.get(), 9999 + overhead_rate));
574 EXPECT_EQ(10000, SetAndGetTargetBitrate(audio_encoder_.get(),
575 10000 + overhead_rate));
576 EXPECT_EQ(23456, SetAndGetTargetBitrate(audio_encoder_.get(),
577 23456 + overhead_rate));
578 EXPECT_EQ(56000, SetAndGetTargetBitrate(audio_encoder_.get(),
579 56000 + overhead_rate));
580 EXPECT_EQ(56000, SetAndGetTargetBitrate(audio_encoder_.get(),
581 56001 + overhead_rate));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200582}
583
Artem Titovee966752021-08-06 14:18:10 +0200584// Run bit exactness test only for release builds.
585#if defined(NDEBUG)
kwiberg5b659c02015-12-11 07:33:59 -0800586TEST_F(AudioDecoderIsacFixTest, EncodeDecode) {
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000587 int tolerance = 11034;
588 double mse = 3.46e6;
589 int delay = 54; // Delay from input to output.
kwiberg5b659c02015-12-11 07:33:59 -0800590#if defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM)
kwiberg@webrtc.orge102e812014-12-17 07:30:23 +0000591 static const int kEncodedBytes = 685;
Christoffer Jansson46d002c2021-06-24 10:00:17 +0200592#elif defined(WEBRTC_MAC) && defined(WEBRTC_ARCH_ARM64) // M1 Mac
landreyd14f98f2021-09-16 19:17:08 +0000593 static const int kEncodedBytes = 673;
landrey3abd1082021-08-10 12:32:54 +0000594#elif defined(WEBRTC_ARCH_ARM64)
595 static const int kEncodedBytes = 673;
Artem Titovee966752021-08-06 14:18:10 +0200596#elif defined(WEBRTC_WIN) && defined(_MSC_VER) && !defined(__clang__)
Artem Titovd937f502021-08-06 11:07:13 +0000597 static const int kEncodedBytes = 671;
Artem Titovee966752021-08-06 14:18:10 +0200598#elif defined(WEBRTC_IOS) && defined(WEBRTC_ARCH_X86_64)
599 static const int kEncodedBytes = 671;
600#else
landreye742d8c2021-09-15 17:27:02 +0000601 static const int kEncodedBytes = 671;
kwiberg@webrtc.orge102e812014-12-17 07:30:23 +0000602#endif
603 EncodeDecodeTest(kEncodedBytes, tolerance, mse, delay);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000604 ReInitTest();
henrik.lundin@webrtc.org09b6ff92015-03-23 12:23:51 +0000605 EXPECT_FALSE(decoder_->HasDecodePlc());
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000606}
Artem Titovee966752021-08-06 14:18:10 +0200607#endif
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000608
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200609TEST_F(AudioDecoderIsacFixTest, SetTargetBitrate) {
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200610 const int overhead_rate =
611 8 * kOverheadBytesPerPacket * codec_input_rate_hz_ / frame_size_;
612 EXPECT_EQ(10000,
613 SetAndGetTargetBitrate(audio_encoder_.get(), 9999 + overhead_rate));
614 EXPECT_EQ(10000, SetAndGetTargetBitrate(audio_encoder_.get(),
615 10000 + overhead_rate));
616 EXPECT_EQ(23456, SetAndGetTargetBitrate(audio_encoder_.get(),
617 23456 + overhead_rate));
618 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
619 32000 + overhead_rate));
620 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
621 32001 + overhead_rate));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200622}
623
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000624TEST_F(AudioDecoderG722Test, EncodeDecode) {
625 int tolerance = 6176;
626 double mse = 238630.0;
627 int delay = 22; // Delay from input to output.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000628 EncodeDecodeTest(data_length_ / 2, tolerance, mse, delay);
629 ReInitTest();
630 EXPECT_FALSE(decoder_->HasDecodePlc());
631}
632
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200633TEST_F(AudioDecoderG722Test, SetTargetBitrate) {
634 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
635}
636
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000637TEST_F(AudioDecoderG722StereoTest, EncodeDecode) {
638 int tolerance = 6176;
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000639 int channel_diff_tolerance = 0;
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000640 double mse = 238630.0;
641 int delay = 22; // Delay from input to output.
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000642 EncodeDecodeTest(data_length_, tolerance, mse, delay, channel_diff_tolerance);
henrik.lundin@webrtc.orgaaad6132013-02-01 11:49:28 +0000643 ReInitTest();
644 EXPECT_FALSE(decoder_->HasDecodePlc());
645}
646
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200647TEST_F(AudioDecoderG722StereoTest, SetTargetBitrate) {
648 TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 128000);
649}
650
Jakob Ivarsson213dc2c2021-03-10 12:38:34 +0100651// TODO(http://bugs.webrtc.org/12518): Enable the test after Opus has been
652// updated.
653TEST_P(AudioDecoderOpusTest, DISABLED_EncodeDecode) {
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200654 constexpr int tolerance = 6176;
Ivo Creusen16ddae92020-03-04 17:16:59 +0100655 constexpr int channel_diff_tolerance = 6;
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200656 constexpr double mse = 238630.0;
657 constexpr int delay = 22; // Delay from input to output.
tina.legrand@webrtc.org8418e962013-11-29 09:30:43 +0000658 EncodeDecodeTest(0, tolerance, mse, delay, channel_diff_tolerance);
minyue@webrtc.orgecbe0aa2013-08-12 06:48:09 +0000659 ReInitTest();
660 EXPECT_FALSE(decoder_->HasDecodePlc());
661}
662
Karl Wiberg7eb0a5e2019-05-29 13:46:09 +0200663TEST_P(AudioDecoderOpusTest, SetTargetBitrate) {
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200664 const int overhead_rate =
665 8 * kOverheadBytesPerPacket * codec_input_rate_hz_ / frame_size_;
666 EXPECT_EQ(6000,
667 SetAndGetTargetBitrate(audio_encoder_.get(), 5999 + overhead_rate));
668 EXPECT_EQ(6000,
669 SetAndGetTargetBitrate(audio_encoder_.get(), 6000 + overhead_rate));
670 EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder_.get(),
671 32000 + overhead_rate));
672 EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder_.get(),
673 510000 + overhead_rate));
674 EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder_.get(),
675 511000 + overhead_rate));
Henrik Lundin3e89dbf2015-06-18 14:58:34 +0200676}
677
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000678} // namespace webrtc