xref: /aosp_15_r20/external/webrtc/modules/audio_coding/test/TestVADDTX.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "modules/audio_coding/test/TestVADDTX.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <string>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/match.h"
16*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
17*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_decoder_factory_template.h"
18*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_encoder_factory_template.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/ilbc/audio_decoder_ilbc.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/ilbc/audio_encoder_ilbc.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/opus/audio_decoder_opus.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/opus/audio_encoder_opus.h"
23*d9f75844SAndroid Build Coastguard Worker #include "modules/audio_coding/codecs/cng/audio_encoder_cng.h"
24*d9f75844SAndroid Build Coastguard Worker #include "modules/audio_coding/test/PCMFile.h"
25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/strings/string_builder.h"
26*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
27*d9f75844SAndroid Build Coastguard Worker #include "test/testsupport/file_utils.h"
28*d9f75844SAndroid Build Coastguard Worker 
29*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
30*d9f75844SAndroid Build Coastguard Worker 
MonitoringAudioPacketizationCallback(AudioPacketizationCallback * next)31*d9f75844SAndroid Build Coastguard Worker MonitoringAudioPacketizationCallback::MonitoringAudioPacketizationCallback(
32*d9f75844SAndroid Build Coastguard Worker     AudioPacketizationCallback* next)
33*d9f75844SAndroid Build Coastguard Worker     : next_(next) {
34*d9f75844SAndroid Build Coastguard Worker   ResetStatistics();
35*d9f75844SAndroid Build Coastguard Worker }
36*d9f75844SAndroid Build Coastguard Worker 
SendData(AudioFrameType frame_type,uint8_t payload_type,uint32_t timestamp,const uint8_t * payload_data,size_t payload_len_bytes,int64_t absolute_capture_timestamp_ms)37*d9f75844SAndroid Build Coastguard Worker int32_t MonitoringAudioPacketizationCallback::SendData(
38*d9f75844SAndroid Build Coastguard Worker     AudioFrameType frame_type,
39*d9f75844SAndroid Build Coastguard Worker     uint8_t payload_type,
40*d9f75844SAndroid Build Coastguard Worker     uint32_t timestamp,
41*d9f75844SAndroid Build Coastguard Worker     const uint8_t* payload_data,
42*d9f75844SAndroid Build Coastguard Worker     size_t payload_len_bytes,
43*d9f75844SAndroid Build Coastguard Worker     int64_t absolute_capture_timestamp_ms) {
44*d9f75844SAndroid Build Coastguard Worker   counter_[static_cast<int>(frame_type)]++;
45*d9f75844SAndroid Build Coastguard Worker   return next_->SendData(frame_type, payload_type, timestamp, payload_data,
46*d9f75844SAndroid Build Coastguard Worker                          payload_len_bytes, absolute_capture_timestamp_ms);
47*d9f75844SAndroid Build Coastguard Worker }
48*d9f75844SAndroid Build Coastguard Worker 
PrintStatistics()49*d9f75844SAndroid Build Coastguard Worker void MonitoringAudioPacketizationCallback::PrintStatistics() {
50*d9f75844SAndroid Build Coastguard Worker   printf("\n");
51*d9f75844SAndroid Build Coastguard Worker   printf("kEmptyFrame       %u\n",
52*d9f75844SAndroid Build Coastguard Worker          counter_[static_cast<int>(AudioFrameType::kEmptyFrame)]);
53*d9f75844SAndroid Build Coastguard Worker   printf("kAudioFrameSpeech %u\n",
54*d9f75844SAndroid Build Coastguard Worker          counter_[static_cast<int>(AudioFrameType::kAudioFrameSpeech)]);
55*d9f75844SAndroid Build Coastguard Worker   printf("kAudioFrameCN     %u\n",
56*d9f75844SAndroid Build Coastguard Worker          counter_[static_cast<int>(AudioFrameType::kAudioFrameCN)]);
57*d9f75844SAndroid Build Coastguard Worker   printf("\n\n");
58*d9f75844SAndroid Build Coastguard Worker }
59*d9f75844SAndroid Build Coastguard Worker 
ResetStatistics()60*d9f75844SAndroid Build Coastguard Worker void MonitoringAudioPacketizationCallback::ResetStatistics() {
61*d9f75844SAndroid Build Coastguard Worker   memset(counter_, 0, sizeof(counter_));
62*d9f75844SAndroid Build Coastguard Worker }
63*d9f75844SAndroid Build Coastguard Worker 
GetStatistics(uint32_t * counter)64*d9f75844SAndroid Build Coastguard Worker void MonitoringAudioPacketizationCallback::GetStatistics(uint32_t* counter) {
65*d9f75844SAndroid Build Coastguard Worker   memcpy(counter, counter_, sizeof(counter_));
66*d9f75844SAndroid Build Coastguard Worker }
67*d9f75844SAndroid Build Coastguard Worker 
TestVadDtx()68*d9f75844SAndroid Build Coastguard Worker TestVadDtx::TestVadDtx()
69*d9f75844SAndroid Build Coastguard Worker     : encoder_factory_(
70*d9f75844SAndroid Build Coastguard Worker           CreateAudioEncoderFactory<AudioEncoderIlbc, AudioEncoderOpus>()),
71*d9f75844SAndroid Build Coastguard Worker       decoder_factory_(
72*d9f75844SAndroid Build Coastguard Worker           CreateAudioDecoderFactory<AudioDecoderIlbc, AudioDecoderOpus>()),
73*d9f75844SAndroid Build Coastguard Worker       acm_send_(AudioCodingModule::Create(
74*d9f75844SAndroid Build Coastguard Worker           AudioCodingModule::Config(decoder_factory_))),
75*d9f75844SAndroid Build Coastguard Worker       acm_receive_(AudioCodingModule::Create(
76*d9f75844SAndroid Build Coastguard Worker           AudioCodingModule::Config(decoder_factory_))),
77*d9f75844SAndroid Build Coastguard Worker       channel_(std::make_unique<Channel>()),
78*d9f75844SAndroid Build Coastguard Worker       packetization_callback_(
79*d9f75844SAndroid Build Coastguard Worker           std::make_unique<MonitoringAudioPacketizationCallback>(
80*d9f75844SAndroid Build Coastguard Worker               channel_.get())) {
81*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(
82*d9f75844SAndroid Build Coastguard Worker       0, acm_send_->RegisterTransportCallback(packetization_callback_.get()));
83*d9f75844SAndroid Build Coastguard Worker   channel_->RegisterReceiverACM(acm_receive_.get());
84*d9f75844SAndroid Build Coastguard Worker }
85*d9f75844SAndroid Build Coastguard Worker 
RegisterCodec(const SdpAudioFormat & codec_format,absl::optional<Vad::Aggressiveness> vad_mode)86*d9f75844SAndroid Build Coastguard Worker bool TestVadDtx::RegisterCodec(const SdpAudioFormat& codec_format,
87*d9f75844SAndroid Build Coastguard Worker                                absl::optional<Vad::Aggressiveness> vad_mode) {
88*d9f75844SAndroid Build Coastguard Worker   constexpr int payload_type = 17, cn_payload_type = 117;
89*d9f75844SAndroid Build Coastguard Worker   bool added_comfort_noise = false;
90*d9f75844SAndroid Build Coastguard Worker 
91*d9f75844SAndroid Build Coastguard Worker   auto encoder = encoder_factory_->MakeAudioEncoder(payload_type, codec_format,
92*d9f75844SAndroid Build Coastguard Worker                                                     absl::nullopt);
93*d9f75844SAndroid Build Coastguard Worker   if (vad_mode.has_value() &&
94*d9f75844SAndroid Build Coastguard Worker       !absl::EqualsIgnoreCase(codec_format.name, "opus")) {
95*d9f75844SAndroid Build Coastguard Worker     AudioEncoderCngConfig config;
96*d9f75844SAndroid Build Coastguard Worker     config.speech_encoder = std::move(encoder);
97*d9f75844SAndroid Build Coastguard Worker     config.num_channels = 1;
98*d9f75844SAndroid Build Coastguard Worker     config.payload_type = cn_payload_type;
99*d9f75844SAndroid Build Coastguard Worker     config.vad_mode = vad_mode.value();
100*d9f75844SAndroid Build Coastguard Worker     encoder = CreateComfortNoiseEncoder(std::move(config));
101*d9f75844SAndroid Build Coastguard Worker     added_comfort_noise = true;
102*d9f75844SAndroid Build Coastguard Worker   }
103*d9f75844SAndroid Build Coastguard Worker   channel_->SetIsStereo(encoder->NumChannels() > 1);
104*d9f75844SAndroid Build Coastguard Worker   acm_send_->SetEncoder(std::move(encoder));
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker   std::map<int, SdpAudioFormat> receive_codecs = {{payload_type, codec_format}};
107*d9f75844SAndroid Build Coastguard Worker   acm_receive_->SetReceiveCodecs(receive_codecs);
108*d9f75844SAndroid Build Coastguard Worker 
109*d9f75844SAndroid Build Coastguard Worker   return added_comfort_noise;
110*d9f75844SAndroid Build Coastguard Worker }
111*d9f75844SAndroid Build Coastguard Worker 
112*d9f75844SAndroid Build Coastguard Worker // Encoding a file and see if the numbers that various packets occur follow
113*d9f75844SAndroid Build Coastguard Worker // the expectation.
Run(absl::string_view in_filename,int frequency,int channels,absl::string_view out_filename,bool append,const int * expects)114*d9f75844SAndroid Build Coastguard Worker void TestVadDtx::Run(absl::string_view in_filename,
115*d9f75844SAndroid Build Coastguard Worker                      int frequency,
116*d9f75844SAndroid Build Coastguard Worker                      int channels,
117*d9f75844SAndroid Build Coastguard Worker                      absl::string_view out_filename,
118*d9f75844SAndroid Build Coastguard Worker                      bool append,
119*d9f75844SAndroid Build Coastguard Worker                      const int* expects) {
120*d9f75844SAndroid Build Coastguard Worker   packetization_callback_->ResetStatistics();
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker   PCMFile in_file;
123*d9f75844SAndroid Build Coastguard Worker   in_file.Open(in_filename, frequency, "rb");
124*d9f75844SAndroid Build Coastguard Worker   in_file.ReadStereo(channels > 1);
125*d9f75844SAndroid Build Coastguard Worker   // Set test length to 1000 ms (100 blocks of 10 ms each).
126*d9f75844SAndroid Build Coastguard Worker   in_file.SetNum10MsBlocksToRead(100);
127*d9f75844SAndroid Build Coastguard Worker   // Fast-forward both files 500 ms (50 blocks). The first second of the file is
128*d9f75844SAndroid Build Coastguard Worker   // silence, but we want to keep half of that to test silence periods.
129*d9f75844SAndroid Build Coastguard Worker   in_file.FastForward(50);
130*d9f75844SAndroid Build Coastguard Worker 
131*d9f75844SAndroid Build Coastguard Worker   PCMFile out_file;
132*d9f75844SAndroid Build Coastguard Worker   if (append) {
133*d9f75844SAndroid Build Coastguard Worker     out_file.Open(out_filename, kOutputFreqHz, "ab");
134*d9f75844SAndroid Build Coastguard Worker   } else {
135*d9f75844SAndroid Build Coastguard Worker     out_file.Open(out_filename, kOutputFreqHz, "wb");
136*d9f75844SAndroid Build Coastguard Worker   }
137*d9f75844SAndroid Build Coastguard Worker 
138*d9f75844SAndroid Build Coastguard Worker   uint16_t frame_size_samples = in_file.PayloadLength10Ms();
139*d9f75844SAndroid Build Coastguard Worker   AudioFrame audio_frame;
140*d9f75844SAndroid Build Coastguard Worker   while (!in_file.EndOfFile()) {
141*d9f75844SAndroid Build Coastguard Worker     in_file.Read10MsData(audio_frame);
142*d9f75844SAndroid Build Coastguard Worker     audio_frame.timestamp_ = time_stamp_;
143*d9f75844SAndroid Build Coastguard Worker     time_stamp_ += frame_size_samples;
144*d9f75844SAndroid Build Coastguard Worker     EXPECT_GE(acm_send_->Add10MsData(audio_frame), 0);
145*d9f75844SAndroid Build Coastguard Worker     bool muted;
146*d9f75844SAndroid Build Coastguard Worker     acm_receive_->PlayoutData10Ms(kOutputFreqHz, &audio_frame, &muted);
147*d9f75844SAndroid Build Coastguard Worker     ASSERT_FALSE(muted);
148*d9f75844SAndroid Build Coastguard Worker     out_file.Write10MsData(audio_frame);
149*d9f75844SAndroid Build Coastguard Worker   }
150*d9f75844SAndroid Build Coastguard Worker 
151*d9f75844SAndroid Build Coastguard Worker   in_file.Close();
152*d9f75844SAndroid Build Coastguard Worker   out_file.Close();
153*d9f75844SAndroid Build Coastguard Worker 
154*d9f75844SAndroid Build Coastguard Worker #ifdef PRINT_STAT
155*d9f75844SAndroid Build Coastguard Worker   packetization_callback_->PrintStatistics();
156*d9f75844SAndroid Build Coastguard Worker #endif
157*d9f75844SAndroid Build Coastguard Worker 
158*d9f75844SAndroid Build Coastguard Worker   uint32_t stats[3];
159*d9f75844SAndroid Build Coastguard Worker   packetization_callback_->GetStatistics(stats);
160*d9f75844SAndroid Build Coastguard Worker   packetization_callback_->ResetStatistics();
161*d9f75844SAndroid Build Coastguard Worker 
162*d9f75844SAndroid Build Coastguard Worker   for (const auto& st : stats) {
163*d9f75844SAndroid Build Coastguard Worker     int i = &st - stats;  // Calculate the current position in stats.
164*d9f75844SAndroid Build Coastguard Worker     switch (expects[i]) {
165*d9f75844SAndroid Build Coastguard Worker       case 0: {
166*d9f75844SAndroid Build Coastguard Worker         EXPECT_EQ(0u, st) << "stats[" << i << "] error.";
167*d9f75844SAndroid Build Coastguard Worker         break;
168*d9f75844SAndroid Build Coastguard Worker       }
169*d9f75844SAndroid Build Coastguard Worker       case 1: {
170*d9f75844SAndroid Build Coastguard Worker         EXPECT_GT(st, 0u) << "stats[" << i << "] error.";
171*d9f75844SAndroid Build Coastguard Worker         break;
172*d9f75844SAndroid Build Coastguard Worker       }
173*d9f75844SAndroid Build Coastguard Worker     }
174*d9f75844SAndroid Build Coastguard Worker   }
175*d9f75844SAndroid Build Coastguard Worker }
176*d9f75844SAndroid Build Coastguard Worker 
177*d9f75844SAndroid Build Coastguard Worker // Following is the implementation of TestWebRtcVadDtx.
TestWebRtcVadDtx()178*d9f75844SAndroid Build Coastguard Worker TestWebRtcVadDtx::TestWebRtcVadDtx() : output_file_num_(0) {}
179*d9f75844SAndroid Build Coastguard Worker 
Perform()180*d9f75844SAndroid Build Coastguard Worker void TestWebRtcVadDtx::Perform() {
181*d9f75844SAndroid Build Coastguard Worker   RunTestCases({"ILBC", 8000, 1});
182*d9f75844SAndroid Build Coastguard Worker   RunTestCases({"opus", 48000, 2});
183*d9f75844SAndroid Build Coastguard Worker }
184*d9f75844SAndroid Build Coastguard Worker 
185*d9f75844SAndroid Build Coastguard Worker // Test various configurations on VAD/DTX.
RunTestCases(const SdpAudioFormat & codec_format)186*d9f75844SAndroid Build Coastguard Worker void TestWebRtcVadDtx::RunTestCases(const SdpAudioFormat& codec_format) {
187*d9f75844SAndroid Build Coastguard Worker   Test(/*new_outfile=*/true,
188*d9f75844SAndroid Build Coastguard Worker        /*expect_dtx_enabled=*/RegisterCodec(codec_format, absl::nullopt));
189*d9f75844SAndroid Build Coastguard Worker 
190*d9f75844SAndroid Build Coastguard Worker   Test(/*new_outfile=*/false,
191*d9f75844SAndroid Build Coastguard Worker        /*expect_dtx_enabled=*/RegisterCodec(codec_format, Vad::kVadAggressive));
192*d9f75844SAndroid Build Coastguard Worker 
193*d9f75844SAndroid Build Coastguard Worker   Test(/*new_outfile=*/false,
194*d9f75844SAndroid Build Coastguard Worker        /*expect_dtx_enabled=*/RegisterCodec(codec_format, Vad::kVadLowBitrate));
195*d9f75844SAndroid Build Coastguard Worker 
196*d9f75844SAndroid Build Coastguard Worker   Test(/*new_outfile=*/false, /*expect_dtx_enabled=*/RegisterCodec(
197*d9f75844SAndroid Build Coastguard Worker            codec_format, Vad::kVadVeryAggressive));
198*d9f75844SAndroid Build Coastguard Worker 
199*d9f75844SAndroid Build Coastguard Worker   Test(/*new_outfile=*/false,
200*d9f75844SAndroid Build Coastguard Worker        /*expect_dtx_enabled=*/RegisterCodec(codec_format, Vad::kVadNormal));
201*d9f75844SAndroid Build Coastguard Worker }
202*d9f75844SAndroid Build Coastguard Worker 
203*d9f75844SAndroid Build Coastguard Worker // Set the expectation and run the test.
Test(bool new_outfile,bool expect_dtx_enabled)204*d9f75844SAndroid Build Coastguard Worker void TestWebRtcVadDtx::Test(bool new_outfile, bool expect_dtx_enabled) {
205*d9f75844SAndroid Build Coastguard Worker   int expects[] = {-1, 1, expect_dtx_enabled, 0, 0};
206*d9f75844SAndroid Build Coastguard Worker   if (new_outfile) {
207*d9f75844SAndroid Build Coastguard Worker     output_file_num_++;
208*d9f75844SAndroid Build Coastguard Worker   }
209*d9f75844SAndroid Build Coastguard Worker   rtc::StringBuilder out_filename;
210*d9f75844SAndroid Build Coastguard Worker   out_filename << webrtc::test::OutputPath() << "testWebRtcVadDtx_outFile_"
211*d9f75844SAndroid Build Coastguard Worker                << output_file_num_ << ".pcm";
212*d9f75844SAndroid Build Coastguard Worker   Run(webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"), 32000, 1,
213*d9f75844SAndroid Build Coastguard Worker       out_filename.str(), !new_outfile, expects);
214*d9f75844SAndroid Build Coastguard Worker }
215*d9f75844SAndroid Build Coastguard Worker 
216*d9f75844SAndroid Build Coastguard Worker // Following is the implementation of TestOpusDtx.
Perform()217*d9f75844SAndroid Build Coastguard Worker void TestOpusDtx::Perform() {
218*d9f75844SAndroid Build Coastguard Worker   int expects[] = {0, 1, 0, 0, 0};
219*d9f75844SAndroid Build Coastguard Worker 
220*d9f75844SAndroid Build Coastguard Worker   // Register Opus as send codec
221*d9f75844SAndroid Build Coastguard Worker   std::string out_filename =
222*d9f75844SAndroid Build Coastguard Worker       webrtc::test::OutputPath() + "testOpusDtx_outFile_mono.pcm";
223*d9f75844SAndroid Build Coastguard Worker   RegisterCodec({"opus", 48000, 2}, absl::nullopt);
224*d9f75844SAndroid Build Coastguard Worker   acm_send_->ModifyEncoder([](std::unique_ptr<AudioEncoder>* encoder_ptr) {
225*d9f75844SAndroid Build Coastguard Worker     (*encoder_ptr)->SetDtx(false);
226*d9f75844SAndroid Build Coastguard Worker   });
227*d9f75844SAndroid Build Coastguard Worker 
228*d9f75844SAndroid Build Coastguard Worker   Run(webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"), 32000, 1,
229*d9f75844SAndroid Build Coastguard Worker       out_filename, false, expects);
230*d9f75844SAndroid Build Coastguard Worker 
231*d9f75844SAndroid Build Coastguard Worker   acm_send_->ModifyEncoder([](std::unique_ptr<AudioEncoder>* encoder_ptr) {
232*d9f75844SAndroid Build Coastguard Worker     (*encoder_ptr)->SetDtx(true);
233*d9f75844SAndroid Build Coastguard Worker   });
234*d9f75844SAndroid Build Coastguard Worker   expects[static_cast<int>(AudioFrameType::kEmptyFrame)] = 1;
235*d9f75844SAndroid Build Coastguard Worker   expects[static_cast<int>(AudioFrameType::kAudioFrameCN)] = 1;
236*d9f75844SAndroid Build Coastguard Worker   Run(webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"), 32000, 1,
237*d9f75844SAndroid Build Coastguard Worker       out_filename, true, expects);
238*d9f75844SAndroid Build Coastguard Worker 
239*d9f75844SAndroid Build Coastguard Worker   // Register stereo Opus as send codec
240*d9f75844SAndroid Build Coastguard Worker   out_filename = webrtc::test::OutputPath() + "testOpusDtx_outFile_stereo.pcm";
241*d9f75844SAndroid Build Coastguard Worker   RegisterCodec({"opus", 48000, 2, {{"stereo", "1"}}}, absl::nullopt);
242*d9f75844SAndroid Build Coastguard Worker   acm_send_->ModifyEncoder([](std::unique_ptr<AudioEncoder>* encoder_ptr) {
243*d9f75844SAndroid Build Coastguard Worker     (*encoder_ptr)->SetDtx(false);
244*d9f75844SAndroid Build Coastguard Worker   });
245*d9f75844SAndroid Build Coastguard Worker   expects[static_cast<int>(AudioFrameType::kEmptyFrame)] = 0;
246*d9f75844SAndroid Build Coastguard Worker   expects[static_cast<int>(AudioFrameType::kAudioFrameCN)] = 0;
247*d9f75844SAndroid Build Coastguard Worker   Run(webrtc::test::ResourcePath("audio_coding/teststereo32kHz", "pcm"), 32000,
248*d9f75844SAndroid Build Coastguard Worker       2, out_filename, false, expects);
249*d9f75844SAndroid Build Coastguard Worker 
250*d9f75844SAndroid Build Coastguard Worker   acm_send_->ModifyEncoder([](std::unique_ptr<AudioEncoder>* encoder_ptr) {
251*d9f75844SAndroid Build Coastguard Worker     (*encoder_ptr)->SetDtx(true);
252*d9f75844SAndroid Build Coastguard Worker     // The default bitrate will not generate frames recognized as CN on desktop
253*d9f75844SAndroid Build Coastguard Worker     // since the frames will be encoded as CELT. Set a low target bitrate to get
254*d9f75844SAndroid Build Coastguard Worker     // consistent behaviour across platforms.
255*d9f75844SAndroid Build Coastguard Worker     (*encoder_ptr)->OnReceivedTargetAudioBitrate(24000);
256*d9f75844SAndroid Build Coastguard Worker   });
257*d9f75844SAndroid Build Coastguard Worker 
258*d9f75844SAndroid Build Coastguard Worker   expects[static_cast<int>(AudioFrameType::kEmptyFrame)] = 1;
259*d9f75844SAndroid Build Coastguard Worker   expects[static_cast<int>(AudioFrameType::kAudioFrameCN)] = 1;
260*d9f75844SAndroid Build Coastguard Worker   Run(webrtc::test::ResourcePath("audio_coding/teststereo32kHz", "pcm"), 32000,
261*d9f75844SAndroid Build Coastguard Worker       2, out_filename, true, expects);
262*d9f75844SAndroid Build Coastguard Worker }
263*d9f75844SAndroid Build Coastguard Worker 
264*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
265