1 /*
2 * Copyright (c) 2008 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
11 #include "media/engine/webrtc_voice_engine.h"
12
13 #include <memory>
14 #include <utility>
15
16 #include "absl/memory/memory.h"
17 #include "absl/strings/match.h"
18 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
19 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
20 #include "api/rtc_event_log/rtc_event_log.h"
21 #include "api/rtp_parameters.h"
22 #include "api/scoped_refptr.h"
23 #include "api/task_queue/default_task_queue_factory.h"
24 #include "api/transport/field_trial_based_config.h"
25 #include "call/call.h"
26 #include "media/base/fake_media_engine.h"
27 #include "media/base/fake_network_interface.h"
28 #include "media/base/fake_rtp.h"
29 #include "media/base/media_constants.h"
30 #include "media/engine/fake_webrtc_call.h"
31 #include "modules/audio_device/include/mock_audio_device.h"
32 #include "modules/audio_mixer/audio_mixer_impl.h"
33 #include "modules/audio_processing/include/mock_audio_processing.h"
34 #include "rtc_base/arraysize.h"
35 #include "rtc_base/byte_order.h"
36 #include "rtc_base/numerics/safe_conversions.h"
37 #include "test/gtest.h"
38 #include "test/mock_audio_decoder_factory.h"
39 #include "test/mock_audio_encoder_factory.h"
40 #include "test/scoped_key_value_config.h"
41
42 using ::testing::_;
43 using ::testing::ContainerEq;
44 using ::testing::Contains;
45 using ::testing::Field;
46 using ::testing::Return;
47 using ::testing::ReturnPointee;
48 using ::testing::SaveArg;
49 using ::testing::StrictMock;
50
51 namespace {
52 using webrtc::BitrateConstraints;
53
54 constexpr uint32_t kMaxUnsignaledRecvStreams = 4;
55
56 const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
57 const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 32000, 2);
58 const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
59 const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
60 const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
61 const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
62 const cricket::AudioCodec kRed48000Codec(112, "RED", 48000, 32000, 2);
63 const cricket::AudioCodec kTelephoneEventCodec1(106,
64 "telephone-event",
65 8000,
66 0,
67 1);
68 const cricket::AudioCodec kTelephoneEventCodec2(107,
69 "telephone-event",
70 32000,
71 0,
72 1);
73
74 const uint32_t kSsrc0 = 0;
75 const uint32_t kSsrc1 = 1;
76 const uint32_t kSsrcX = 0x99;
77 const uint32_t kSsrcY = 0x17;
78 const uint32_t kSsrcZ = 0x42;
79 const uint32_t kSsrcW = 0x02;
80 const uint32_t kSsrcs4[] = {11, 200, 30, 44};
81
82 constexpr int kRtpHistoryMs = 5000;
83
84 constexpr webrtc::AudioProcessing::Config::GainController1::Mode
85 kDefaultAgcMode =
86 #if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
87 webrtc::AudioProcessing::Config::GainController1::kFixedDigital;
88 #else
89 webrtc::AudioProcessing::Config::GainController1::kAdaptiveAnalog;
90 #endif
91
92 constexpr webrtc::AudioProcessing::Config::NoiseSuppression::Level
93 kDefaultNsLevel =
94 webrtc::AudioProcessing::Config::NoiseSuppression::Level::kHigh;
95
AdmSetupExpectations(webrtc::test::MockAudioDeviceModule * adm)96 void AdmSetupExpectations(webrtc::test::MockAudioDeviceModule* adm) {
97 RTC_DCHECK(adm);
98
99 // Setup.
100 EXPECT_CALL(*adm, Init()).WillOnce(Return(0));
101 EXPECT_CALL(*adm, RegisterAudioCallback(_)).WillOnce(Return(0));
102 #if defined(WEBRTC_WIN)
103 EXPECT_CALL(
104 *adm,
105 SetPlayoutDevice(
106 ::testing::Matcher<webrtc::AudioDeviceModule::WindowsDeviceType>(
107 webrtc::AudioDeviceModule::kDefaultCommunicationDevice)))
108 .WillOnce(Return(0));
109 #else
110 EXPECT_CALL(*adm, SetPlayoutDevice(0)).WillOnce(Return(0));
111 #endif // #if defined(WEBRTC_WIN)
112 EXPECT_CALL(*adm, InitSpeaker()).WillOnce(Return(0));
113 EXPECT_CALL(*adm, StereoPlayoutIsAvailable(::testing::_)).WillOnce(Return(0));
114 EXPECT_CALL(*adm, SetStereoPlayout(false)).WillOnce(Return(0));
115 #if defined(WEBRTC_WIN)
116 EXPECT_CALL(
117 *adm,
118 SetRecordingDevice(
119 ::testing::Matcher<webrtc::AudioDeviceModule::WindowsDeviceType>(
120 webrtc::AudioDeviceModule::kDefaultCommunicationDevice)))
121 .WillOnce(Return(0));
122 #else
123 EXPECT_CALL(*adm, SetRecordingDevice(0)).WillOnce(Return(0));
124 #endif // #if defined(WEBRTC_WIN)
125 EXPECT_CALL(*adm, InitMicrophone()).WillOnce(Return(0));
126 EXPECT_CALL(*adm, StereoRecordingIsAvailable(::testing::_))
127 .WillOnce(Return(0));
128 EXPECT_CALL(*adm, SetStereoRecording(false)).WillOnce(Return(0));
129 EXPECT_CALL(*adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
130 EXPECT_CALL(*adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
131 EXPECT_CALL(*adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
132
133 // Teardown.
134 EXPECT_CALL(*adm, StopPlayout()).WillOnce(Return(0));
135 EXPECT_CALL(*adm, StopRecording()).WillOnce(Return(0));
136 EXPECT_CALL(*adm, RegisterAudioCallback(nullptr)).WillOnce(Return(0));
137 EXPECT_CALL(*adm, Terminate()).WillOnce(Return(0));
138 }
139 } // namespace
140
141 // Tests that our stub library "works".
TEST(WebRtcVoiceEngineTestStubLibrary,StartupShutdown)142 TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
143 for (bool use_null_apm : {false, true}) {
144 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
145 webrtc::CreateDefaultTaskQueueFactory();
146 rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
147 webrtc::test::MockAudioDeviceModule::CreateStrict();
148 AdmSetupExpectations(adm.get());
149 rtc::scoped_refptr<StrictMock<webrtc::test::MockAudioProcessing>> apm =
150 use_null_apm ? nullptr
151 : rtc::make_ref_counted<
152 StrictMock<webrtc::test::MockAudioProcessing>>();
153
154 webrtc::AudioProcessing::Config apm_config;
155 if (!use_null_apm) {
156 EXPECT_CALL(*apm, GetConfig()).WillRepeatedly(ReturnPointee(&apm_config));
157 EXPECT_CALL(*apm, ApplyConfig(_)).WillRepeatedly(SaveArg<0>(&apm_config));
158 EXPECT_CALL(*apm, DetachAecDump());
159 }
160 {
161 webrtc::FieldTrialBasedConfig trials;
162 cricket::WebRtcVoiceEngine engine(
163 task_queue_factory.get(), adm.get(),
164 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
165 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
166 nullptr, trials);
167 engine.Init();
168 }
169 }
170 }
171
172 class FakeAudioSink : public webrtc::AudioSinkInterface {
173 public:
OnData(const Data & audio)174 void OnData(const Data& audio) override {}
175 };
176
177 class FakeAudioSource : public cricket::AudioSource {
SetSink(Sink * sink)178 void SetSink(Sink* sink) override {}
179 };
180
181 class WebRtcVoiceEngineTestFake : public ::testing::TestWithParam<bool> {
182 public:
WebRtcVoiceEngineTestFake()183 WebRtcVoiceEngineTestFake()
184 : use_null_apm_(GetParam()),
185 task_queue_factory_(webrtc::CreateDefaultTaskQueueFactory()),
186 adm_(webrtc::test::MockAudioDeviceModule::CreateStrict()),
187 apm_(use_null_apm_
188 ? nullptr
189 : rtc::make_ref_counted<
190 StrictMock<webrtc::test::MockAudioProcessing>>()),
191 call_(&field_trials_) {
192 // AudioDeviceModule.
193 AdmSetupExpectations(adm_.get());
194
195 if (!use_null_apm_) {
196 // AudioProcessing.
197 EXPECT_CALL(*apm_, GetConfig())
198 .WillRepeatedly(ReturnPointee(&apm_config_));
199 EXPECT_CALL(*apm_, ApplyConfig(_))
200 .WillRepeatedly(SaveArg<0>(&apm_config_));
201 EXPECT_CALL(*apm_, DetachAecDump());
202 }
203
204 // Default Options.
205 // TODO(kwiberg): We should use mock factories here, but a bunch of
206 // the tests here probe the specific set of codecs provided by the builtin
207 // factories. Those tests should probably be moved elsewhere.
208 auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory();
209 auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory();
210 engine_.reset(new cricket::WebRtcVoiceEngine(
211 task_queue_factory_.get(), adm_.get(), encoder_factory, decoder_factory,
212 nullptr, apm_, nullptr, field_trials_));
213 engine_->Init();
214 send_parameters_.codecs.push_back(kPcmuCodec);
215 recv_parameters_.codecs.push_back(kPcmuCodec);
216
217 if (!use_null_apm_) {
218 // Default Options.
219 VerifyEchoCancellationSettings(/*enabled=*/true);
220 EXPECT_TRUE(IsHighPassFilterEnabled());
221 EXPECT_TRUE(apm_config_.noise_suppression.enabled);
222 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
223 VerifyGainControlEnabledCorrectly();
224 VerifyGainControlDefaultSettings();
225 }
226 }
227
SetupChannel()228 bool SetupChannel() {
229 channel_ = engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
230 cricket::AudioOptions(),
231 webrtc::CryptoOptions());
232 return (channel_ != nullptr);
233 }
234
SetupRecvStream()235 bool SetupRecvStream() {
236 if (!SetupChannel()) {
237 return false;
238 }
239 return AddRecvStream(kSsrcX);
240 }
241
SetupSendStream()242 bool SetupSendStream() {
243 return SetupSendStream(cricket::StreamParams::CreateLegacy(kSsrcX));
244 }
245
SetupSendStream(const cricket::StreamParams & sp)246 bool SetupSendStream(const cricket::StreamParams& sp) {
247 if (!SetupChannel()) {
248 return false;
249 }
250 if (!channel_->AddSendStream(sp)) {
251 return false;
252 }
253 if (!use_null_apm_) {
254 EXPECT_CALL(*apm_, set_output_will_be_muted(false));
255 }
256 return channel_->SetAudioSend(kSsrcX, true, nullptr, &fake_source_);
257 }
258
AddRecvStream(uint32_t ssrc)259 bool AddRecvStream(uint32_t ssrc) {
260 EXPECT_TRUE(channel_);
261 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
262 }
263
SetupForMultiSendStream()264 void SetupForMultiSendStream() {
265 EXPECT_TRUE(SetupSendStream());
266 // Remove stream added in Setup.
267 EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
268 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcX));
269 // Verify the channel does not exist.
270 EXPECT_FALSE(call_.GetAudioSendStream(kSsrcX));
271 }
272
DeliverPacket(const void * data,int len)273 void DeliverPacket(const void* data, int len) {
274 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
275 channel_->OnPacketReceived(packet, /* packet_time_us */ -1);
276 rtc::Thread::Current()->ProcessMessages(0);
277 }
278
TearDown()279 void TearDown() override { delete channel_; }
280
GetSendStream(uint32_t ssrc)281 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
282 const auto* send_stream = call_.GetAudioSendStream(ssrc);
283 EXPECT_TRUE(send_stream);
284 return *send_stream;
285 }
286
GetRecvStream(uint32_t ssrc)287 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
288 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
289 EXPECT_TRUE(recv_stream);
290 return *recv_stream;
291 }
292
GetSendStreamConfig(uint32_t ssrc)293 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
294 return GetSendStream(ssrc).GetConfig();
295 }
296
GetRecvStreamConfig(uint32_t ssrc)297 const webrtc::AudioReceiveStreamInterface::Config& GetRecvStreamConfig(
298 uint32_t ssrc) {
299 return GetRecvStream(ssrc).GetConfig();
300 }
301
SetSend(bool enable)302 void SetSend(bool enable) {
303 ASSERT_TRUE(channel_);
304 if (enable) {
305 EXPECT_CALL(*adm_, RecordingIsInitialized())
306 .Times(::testing::AtMost(1))
307 .WillOnce(Return(false));
308 EXPECT_CALL(*adm_, Recording())
309 .Times(::testing::AtMost(1))
310 .WillOnce(Return(false));
311 EXPECT_CALL(*adm_, InitRecording())
312 .Times(::testing::AtMost(1))
313 .WillOnce(Return(0));
314 }
315 channel_->SetSend(enable);
316 }
317
SetSendParameters(const cricket::AudioSendParameters & params)318 void SetSendParameters(const cricket::AudioSendParameters& params) {
319 ASSERT_TRUE(channel_);
320 EXPECT_TRUE(channel_->SetSendParameters(params));
321 }
322
SetAudioSend(uint32_t ssrc,bool enable,cricket::AudioSource * source,const cricket::AudioOptions * options=nullptr)323 void SetAudioSend(uint32_t ssrc,
324 bool enable,
325 cricket::AudioSource* source,
326 const cricket::AudioOptions* options = nullptr) {
327 ASSERT_TRUE(channel_);
328 if (!use_null_apm_) {
329 EXPECT_CALL(*apm_, set_output_will_be_muted(!enable));
330 }
331 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source));
332 }
333
TestInsertDtmf(uint32_t ssrc,bool caller,const cricket::AudioCodec & codec)334 void TestInsertDtmf(uint32_t ssrc,
335 bool caller,
336 const cricket::AudioCodec& codec) {
337 EXPECT_TRUE(SetupChannel());
338 if (caller) {
339 // If this is a caller, local description will be applied and add the
340 // send stream.
341 EXPECT_TRUE(
342 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
343 }
344
345 // Test we can only InsertDtmf when the other side supports telephone-event.
346 SetSendParameters(send_parameters_);
347 SetSend(true);
348 EXPECT_FALSE(channel_->CanInsertDtmf());
349 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
350 send_parameters_.codecs.push_back(codec);
351 SetSendParameters(send_parameters_);
352 EXPECT_TRUE(channel_->CanInsertDtmf());
353
354 if (!caller) {
355 // If this is callee, there's no active send channel yet.
356 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
357 EXPECT_TRUE(
358 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
359 }
360
361 // Check we fail if the ssrc is invalid.
362 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
363
364 // Test send.
365 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
366 GetSendStream(kSsrcX).GetLatestTelephoneEvent();
367 EXPECT_EQ(-1, telephone_event.payload_type);
368 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
369 telephone_event = GetSendStream(kSsrcX).GetLatestTelephoneEvent();
370 EXPECT_EQ(codec.id, telephone_event.payload_type);
371 EXPECT_EQ(codec.clockrate, telephone_event.payload_frequency);
372 EXPECT_EQ(2, telephone_event.event_code);
373 EXPECT_EQ(123, telephone_event.duration_ms);
374 }
375
TestExtmapAllowMixedCaller(bool extmap_allow_mixed)376 void TestExtmapAllowMixedCaller(bool extmap_allow_mixed) {
377 // For a caller, the answer will be applied in set remote description
378 // where SetSendParameters() is called.
379 EXPECT_TRUE(SetupChannel());
380 EXPECT_TRUE(
381 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
382 send_parameters_.extmap_allow_mixed = extmap_allow_mixed;
383 SetSendParameters(send_parameters_);
384 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
385 EXPECT_EQ(extmap_allow_mixed, config.rtp.extmap_allow_mixed);
386 }
387
TestExtmapAllowMixedCallee(bool extmap_allow_mixed)388 void TestExtmapAllowMixedCallee(bool extmap_allow_mixed) {
389 // For a callee, the answer will be applied in set local description
390 // where SetExtmapAllowMixed() and AddSendStream() are called.
391 EXPECT_TRUE(SetupChannel());
392 channel_->SetExtmapAllowMixed(extmap_allow_mixed);
393 EXPECT_TRUE(
394 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
395
396 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
397 EXPECT_EQ(extmap_allow_mixed, config.rtp.extmap_allow_mixed);
398 }
399
400 // Test that send bandwidth is set correctly.
401 // `codec` is the codec under test.
402 // `max_bitrate` is a parameter to set to SetMaxSendBandwidth().
403 // `expected_result` is the expected result from SetMaxSendBandwidth().
404 // `expected_bitrate` is the expected audio bitrate afterward.
TestMaxSendBandwidth(const cricket::AudioCodec & codec,int max_bitrate,bool expected_result,int expected_bitrate)405 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
406 int max_bitrate,
407 bool expected_result,
408 int expected_bitrate) {
409 cricket::AudioSendParameters parameters;
410 parameters.codecs.push_back(codec);
411 parameters.max_bandwidth_bps = max_bitrate;
412 if (expected_result) {
413 SetSendParameters(parameters);
414 } else {
415 EXPECT_FALSE(channel_->SetSendParameters(parameters));
416 }
417 EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrcX));
418 }
419
420 // Sets the per-stream maximum bitrate limit for the specified SSRC.
SetMaxBitrateForStream(int32_t ssrc,int bitrate)421 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
422 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
423 EXPECT_EQ(1UL, parameters.encodings.size());
424
425 parameters.encodings[0].max_bitrate_bps = bitrate;
426 return channel_->SetRtpSendParameters(ssrc, parameters).ok();
427 }
428
SetGlobalMaxBitrate(const cricket::AudioCodec & codec,int bitrate)429 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
430 cricket::AudioSendParameters send_parameters;
431 send_parameters.codecs.push_back(codec);
432 send_parameters.max_bandwidth_bps = bitrate;
433 SetSendParameters(send_parameters);
434 }
435
CheckSendCodecBitrate(int32_t ssrc,const char expected_name[],int expected_bitrate)436 void CheckSendCodecBitrate(int32_t ssrc,
437 const char expected_name[],
438 int expected_bitrate) {
439 const auto& spec = GetSendStreamConfig(ssrc).send_codec_spec;
440 EXPECT_EQ(expected_name, spec->format.name);
441 EXPECT_EQ(expected_bitrate, spec->target_bitrate_bps);
442 }
443
GetCodecBitrate(int32_t ssrc)444 absl::optional<int> GetCodecBitrate(int32_t ssrc) {
445 return GetSendStreamConfig(ssrc).send_codec_spec->target_bitrate_bps;
446 }
447
GetMaxBitrate(int32_t ssrc)448 int GetMaxBitrate(int32_t ssrc) {
449 return GetSendStreamConfig(ssrc).max_bitrate_bps;
450 }
451
GetAudioNetworkAdaptorConfig(int32_t ssrc)452 const absl::optional<std::string>& GetAudioNetworkAdaptorConfig(
453 int32_t ssrc) {
454 return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
455 }
456
SetAndExpectMaxBitrate(const cricket::AudioCodec & codec,int global_max,int stream_max,bool expected_result,int expected_codec_bitrate)457 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
458 int global_max,
459 int stream_max,
460 bool expected_result,
461 int expected_codec_bitrate) {
462 // Clear the bitrate limit from the previous test case.
463 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcX, -1));
464
465 // Attempt to set the requested bitrate limits.
466 SetGlobalMaxBitrate(codec, global_max);
467 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrcX, stream_max));
468
469 // Verify that reading back the parameters gives results
470 // consistent with the Set() result.
471 webrtc::RtpParameters resulting_parameters =
472 channel_->GetRtpSendParameters(kSsrcX);
473 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
474 EXPECT_EQ(expected_result ? stream_max : -1,
475 resulting_parameters.encodings[0].max_bitrate_bps);
476
477 // Verify that the codec settings have the expected bitrate.
478 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrcX));
479 EXPECT_EQ(expected_codec_bitrate, GetMaxBitrate(kSsrcX));
480 }
481
SetSendCodecsShouldWorkForBitrates(const char * min_bitrate_kbps,int expected_min_bitrate_bps,const char * start_bitrate_kbps,int expected_start_bitrate_bps,const char * max_bitrate_kbps,int expected_max_bitrate_bps)482 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
483 int expected_min_bitrate_bps,
484 const char* start_bitrate_kbps,
485 int expected_start_bitrate_bps,
486 const char* max_bitrate_kbps,
487 int expected_max_bitrate_bps) {
488 EXPECT_TRUE(SetupSendStream());
489 auto& codecs = send_parameters_.codecs;
490 codecs.clear();
491 codecs.push_back(kOpusCodec);
492 codecs[0].params[cricket::kCodecParamMinBitrate] = min_bitrate_kbps;
493 codecs[0].params[cricket::kCodecParamStartBitrate] = start_bitrate_kbps;
494 codecs[0].params[cricket::kCodecParamMaxBitrate] = max_bitrate_kbps;
495 EXPECT_CALL(*call_.GetMockTransportControllerSend(),
496 SetSdpBitrateParameters(
497 AllOf(Field(&BitrateConstraints::min_bitrate_bps,
498 expected_min_bitrate_bps),
499 Field(&BitrateConstraints::start_bitrate_bps,
500 expected_start_bitrate_bps),
501 Field(&BitrateConstraints::max_bitrate_bps,
502 expected_max_bitrate_bps))));
503
504 SetSendParameters(send_parameters_);
505 }
506
TestSetSendRtpHeaderExtensions(const std::string & ext)507 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
508 EXPECT_TRUE(SetupSendStream());
509
510 // Ensure extensions are off by default.
511 EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
512
513 // Ensure unknown extensions won't cause an error.
514 send_parameters_.extensions.push_back(
515 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
516 SetSendParameters(send_parameters_);
517 EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
518
519 // Ensure extensions stay off with an empty list of headers.
520 send_parameters_.extensions.clear();
521 SetSendParameters(send_parameters_);
522 EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
523
524 // Ensure extension is set properly.
525 const int id = 1;
526 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
527 SetSendParameters(send_parameters_);
528 EXPECT_EQ(1u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
529 EXPECT_EQ(ext, GetSendStreamConfig(kSsrcX).rtp.extensions[0].uri);
530 EXPECT_EQ(id, GetSendStreamConfig(kSsrcX).rtp.extensions[0].id);
531
532 // Ensure extension is set properly on new stream.
533 EXPECT_TRUE(
534 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcY)));
535 EXPECT_NE(call_.GetAudioSendStream(kSsrcX),
536 call_.GetAudioSendStream(kSsrcY));
537 EXPECT_EQ(1u, GetSendStreamConfig(kSsrcY).rtp.extensions.size());
538 EXPECT_EQ(ext, GetSendStreamConfig(kSsrcY).rtp.extensions[0].uri);
539 EXPECT_EQ(id, GetSendStreamConfig(kSsrcY).rtp.extensions[0].id);
540
541 // Ensure all extensions go back off with an empty list.
542 send_parameters_.codecs.push_back(kPcmuCodec);
543 send_parameters_.extensions.clear();
544 SetSendParameters(send_parameters_);
545 EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
546 EXPECT_EQ(0u, GetSendStreamConfig(kSsrcY).rtp.extensions.size());
547 }
548
TestSetRecvRtpHeaderExtensions(const std::string & ext)549 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
550 EXPECT_TRUE(SetupRecvStream());
551
552 // Ensure extensions are off by default.
553 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
554
555 // Ensure unknown extensions won't cause an error.
556 recv_parameters_.extensions.push_back(
557 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
558 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
559 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
560
561 // Ensure extensions stay off with an empty list of headers.
562 recv_parameters_.extensions.clear();
563 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
564 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
565
566 // Ensure extension is set properly.
567 const int id = 2;
568 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
569 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
570 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
571 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrcX).rtp.extensions[0].uri);
572 EXPECT_EQ(id, GetRecvStreamConfig(kSsrcX).rtp.extensions[0].id);
573
574 // Ensure extension is set properly on new stream.
575 EXPECT_TRUE(AddRecvStream(kSsrcY));
576 EXPECT_NE(call_.GetAudioReceiveStream(kSsrcX),
577 call_.GetAudioReceiveStream(kSsrcY));
578 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrcY).rtp.extensions.size());
579 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrcY).rtp.extensions[0].uri);
580 EXPECT_EQ(id, GetRecvStreamConfig(kSsrcY).rtp.extensions[0].id);
581
582 // Ensure all extensions go back off with an empty list.
583 recv_parameters_.extensions.clear();
584 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
585 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
586 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcY).rtp.extensions.size());
587 }
588
GetAudioSendStreamStats() const589 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
590 webrtc::AudioSendStream::Stats stats;
591 stats.local_ssrc = 12;
592 stats.payload_bytes_sent = 345;
593 stats.header_and_padding_bytes_sent = 56;
594 stats.packets_sent = 678;
595 stats.packets_lost = 9012;
596 stats.fraction_lost = 34.56f;
597 stats.codec_name = "codec_name_send";
598 stats.codec_payload_type = 42;
599 stats.jitter_ms = 12;
600 stats.rtt_ms = 345;
601 stats.audio_level = 678;
602 stats.apm_statistics.delay_median_ms = 234;
603 stats.apm_statistics.delay_standard_deviation_ms = 567;
604 stats.apm_statistics.echo_return_loss = 890;
605 stats.apm_statistics.echo_return_loss_enhancement = 1234;
606 stats.apm_statistics.residual_echo_likelihood = 0.432f;
607 stats.apm_statistics.residual_echo_likelihood_recent_max = 0.6f;
608 stats.ana_statistics.bitrate_action_counter = 321;
609 stats.ana_statistics.channel_action_counter = 432;
610 stats.ana_statistics.dtx_action_counter = 543;
611 stats.ana_statistics.fec_action_counter = 654;
612 stats.ana_statistics.frame_length_increase_counter = 765;
613 stats.ana_statistics.frame_length_decrease_counter = 876;
614 stats.ana_statistics.uplink_packet_loss_fraction = 987.0;
615 return stats;
616 }
SetAudioSendStreamStats()617 void SetAudioSendStreamStats() {
618 for (auto* s : call_.GetAudioSendStreams()) {
619 s->SetStats(GetAudioSendStreamStats());
620 }
621 }
VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo & info,bool is_sending)622 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
623 bool is_sending) {
624 const auto stats = GetAudioSendStreamStats();
625 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
626 EXPECT_EQ(info.payload_bytes_sent, stats.payload_bytes_sent);
627 EXPECT_EQ(info.header_and_padding_bytes_sent,
628 stats.header_and_padding_bytes_sent);
629 EXPECT_EQ(info.packets_sent, stats.packets_sent);
630 EXPECT_EQ(info.packets_lost, stats.packets_lost);
631 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
632 EXPECT_EQ(info.codec_name, stats.codec_name);
633 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
634 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
635 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
636 EXPECT_EQ(info.audio_level, stats.audio_level);
637 EXPECT_EQ(info.apm_statistics.delay_median_ms,
638 stats.apm_statistics.delay_median_ms);
639 EXPECT_EQ(info.apm_statistics.delay_standard_deviation_ms,
640 stats.apm_statistics.delay_standard_deviation_ms);
641 EXPECT_EQ(info.apm_statistics.echo_return_loss,
642 stats.apm_statistics.echo_return_loss);
643 EXPECT_EQ(info.apm_statistics.echo_return_loss_enhancement,
644 stats.apm_statistics.echo_return_loss_enhancement);
645 EXPECT_EQ(info.apm_statistics.residual_echo_likelihood,
646 stats.apm_statistics.residual_echo_likelihood);
647 EXPECT_EQ(info.apm_statistics.residual_echo_likelihood_recent_max,
648 stats.apm_statistics.residual_echo_likelihood_recent_max);
649 EXPECT_EQ(info.ana_statistics.bitrate_action_counter,
650 stats.ana_statistics.bitrate_action_counter);
651 EXPECT_EQ(info.ana_statistics.channel_action_counter,
652 stats.ana_statistics.channel_action_counter);
653 EXPECT_EQ(info.ana_statistics.dtx_action_counter,
654 stats.ana_statistics.dtx_action_counter);
655 EXPECT_EQ(info.ana_statistics.fec_action_counter,
656 stats.ana_statistics.fec_action_counter);
657 EXPECT_EQ(info.ana_statistics.frame_length_increase_counter,
658 stats.ana_statistics.frame_length_increase_counter);
659 EXPECT_EQ(info.ana_statistics.frame_length_decrease_counter,
660 stats.ana_statistics.frame_length_decrease_counter);
661 EXPECT_EQ(info.ana_statistics.uplink_packet_loss_fraction,
662 stats.ana_statistics.uplink_packet_loss_fraction);
663 }
664
GetAudioReceiveStreamStats() const665 webrtc::AudioReceiveStreamInterface::Stats GetAudioReceiveStreamStats()
666 const {
667 webrtc::AudioReceiveStreamInterface::Stats stats;
668 stats.remote_ssrc = 123;
669 stats.payload_bytes_rcvd = 456;
670 stats.header_and_padding_bytes_rcvd = 67;
671 stats.packets_rcvd = 768;
672 stats.packets_lost = 101;
673 stats.codec_name = "codec_name_recv";
674 stats.codec_payload_type = 42;
675 stats.jitter_ms = 901;
676 stats.jitter_buffer_ms = 234;
677 stats.jitter_buffer_preferred_ms = 567;
678 stats.delay_estimate_ms = 890;
679 stats.audio_level = 1234;
680 stats.total_samples_received = 5678901;
681 stats.concealed_samples = 234;
682 stats.concealment_events = 12;
683 stats.jitter_buffer_delay_seconds = 34;
684 stats.jitter_buffer_emitted_count = 77;
685 stats.expand_rate = 5.67f;
686 stats.speech_expand_rate = 8.90f;
687 stats.secondary_decoded_rate = 1.23f;
688 stats.secondary_discarded_rate = 0.12f;
689 stats.accelerate_rate = 4.56f;
690 stats.preemptive_expand_rate = 7.89f;
691 stats.decoding_calls_to_silence_generator = 12;
692 stats.decoding_calls_to_neteq = 345;
693 stats.decoding_normal = 67890;
694 stats.decoding_plc = 1234;
695 stats.decoding_codec_plc = 1236;
696 stats.decoding_cng = 5678;
697 stats.decoding_plc_cng = 9012;
698 stats.decoding_muted_output = 3456;
699 stats.capture_start_ntp_time_ms = 7890;
700 return stats;
701 }
SetAudioReceiveStreamStats()702 void SetAudioReceiveStreamStats() {
703 for (auto* s : call_.GetAudioReceiveStreams()) {
704 s->SetStats(GetAudioReceiveStreamStats());
705 }
706 }
VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo & info)707 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
708 const auto stats = GetAudioReceiveStreamStats();
709 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
710 EXPECT_EQ(info.payload_bytes_rcvd, stats.payload_bytes_rcvd);
711 EXPECT_EQ(info.header_and_padding_bytes_rcvd,
712 stats.header_and_padding_bytes_rcvd);
713 EXPECT_EQ(rtc::checked_cast<unsigned int>(info.packets_rcvd),
714 stats.packets_rcvd);
715 EXPECT_EQ(info.packets_lost, stats.packets_lost);
716 EXPECT_EQ(info.codec_name, stats.codec_name);
717 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
718 EXPECT_EQ(rtc::checked_cast<unsigned int>(info.jitter_ms), stats.jitter_ms);
719 EXPECT_EQ(rtc::checked_cast<unsigned int>(info.jitter_buffer_ms),
720 stats.jitter_buffer_ms);
721 EXPECT_EQ(rtc::checked_cast<unsigned int>(info.jitter_buffer_preferred_ms),
722 stats.jitter_buffer_preferred_ms);
723 EXPECT_EQ(rtc::checked_cast<unsigned int>(info.delay_estimate_ms),
724 stats.delay_estimate_ms);
725 EXPECT_EQ(info.audio_level, stats.audio_level);
726 EXPECT_EQ(info.total_samples_received, stats.total_samples_received);
727 EXPECT_EQ(info.concealed_samples, stats.concealed_samples);
728 EXPECT_EQ(info.concealment_events, stats.concealment_events);
729 EXPECT_EQ(info.jitter_buffer_delay_seconds,
730 stats.jitter_buffer_delay_seconds);
731 EXPECT_EQ(info.jitter_buffer_emitted_count,
732 stats.jitter_buffer_emitted_count);
733 EXPECT_EQ(info.expand_rate, stats.expand_rate);
734 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
735 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
736 EXPECT_EQ(info.secondary_discarded_rate, stats.secondary_discarded_rate);
737 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
738 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
739 EXPECT_EQ(info.decoding_calls_to_silence_generator,
740 stats.decoding_calls_to_silence_generator);
741 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
742 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
743 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
744 EXPECT_EQ(info.decoding_codec_plc, stats.decoding_codec_plc);
745 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
746 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
747 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
748 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
749 }
VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo & info) const750 void VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo& info) const {
751 EXPECT_EQ(send_parameters_.codecs.size(), info.send_codecs.size());
752 for (const cricket::AudioCodec& codec : send_parameters_.codecs) {
753 ASSERT_EQ(info.send_codecs.count(codec.id), 1U);
754 EXPECT_EQ(info.send_codecs.find(codec.id)->second,
755 codec.ToCodecParameters());
756 }
757 EXPECT_EQ(recv_parameters_.codecs.size(), info.receive_codecs.size());
758 for (const cricket::AudioCodec& codec : recv_parameters_.codecs) {
759 ASSERT_EQ(info.receive_codecs.count(codec.id), 1U);
760 EXPECT_EQ(info.receive_codecs.find(codec.id)->second,
761 codec.ToCodecParameters());
762 }
763 }
764
VerifyGainControlEnabledCorrectly()765 void VerifyGainControlEnabledCorrectly() {
766 EXPECT_TRUE(apm_config_.gain_controller1.enabled);
767 EXPECT_EQ(kDefaultAgcMode, apm_config_.gain_controller1.mode);
768 }
769
VerifyGainControlDefaultSettings()770 void VerifyGainControlDefaultSettings() {
771 EXPECT_EQ(3, apm_config_.gain_controller1.target_level_dbfs);
772 EXPECT_EQ(9, apm_config_.gain_controller1.compression_gain_db);
773 EXPECT_TRUE(apm_config_.gain_controller1.enable_limiter);
774 }
775
VerifyEchoCancellationSettings(bool enabled)776 void VerifyEchoCancellationSettings(bool enabled) {
777 constexpr bool kDefaultUseAecm =
778 #if defined(WEBRTC_ANDROID)
779 true;
780 #else
781 false;
782 #endif
783 EXPECT_EQ(apm_config_.echo_canceller.enabled, enabled);
784 EXPECT_EQ(apm_config_.echo_canceller.mobile_mode, kDefaultUseAecm);
785 }
786
IsHighPassFilterEnabled()787 bool IsHighPassFilterEnabled() {
788 return apm_config_.high_pass_filter.enabled;
789 }
790
791 protected:
792 rtc::AutoThread main_thread_;
793 const bool use_null_apm_;
794 webrtc::test::ScopedKeyValueConfig field_trials_;
795 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
796 rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm_;
797 rtc::scoped_refptr<StrictMock<webrtc::test::MockAudioProcessing>> apm_;
798 cricket::FakeCall call_;
799 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
800 cricket::VoiceMediaChannel* channel_ = nullptr;
801 cricket::AudioSendParameters send_parameters_;
802 cricket::AudioRecvParameters recv_parameters_;
803 FakeAudioSource fake_source_;
804 webrtc::AudioProcessing::Config apm_config_;
805 };
806
807 INSTANTIATE_TEST_SUITE_P(TestBothWithAndWithoutNullApm,
808 WebRtcVoiceEngineTestFake,
809 ::testing::Values(false, true));
810
811 // Tests that we can create and destroy a channel.
TEST_P(WebRtcVoiceEngineTestFake,CreateMediaChannel)812 TEST_P(WebRtcVoiceEngineTestFake, CreateMediaChannel) {
813 EXPECT_TRUE(SetupChannel());
814 }
815
816 // Test that we can add a send stream and that it has the correct defaults.
TEST_P(WebRtcVoiceEngineTestFake,CreateSendStream)817 TEST_P(WebRtcVoiceEngineTestFake, CreateSendStream) {
818 EXPECT_TRUE(SetupChannel());
819 EXPECT_TRUE(
820 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
821 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
822 EXPECT_EQ(kSsrcX, config.rtp.ssrc);
823 EXPECT_EQ("", config.rtp.c_name);
824 EXPECT_EQ(0u, config.rtp.extensions.size());
825 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
826 config.send_transport);
827 }
828
829 // Test that we can add a receive stream and that it has the correct defaults.
TEST_P(WebRtcVoiceEngineTestFake,CreateRecvStream)830 TEST_P(WebRtcVoiceEngineTestFake, CreateRecvStream) {
831 EXPECT_TRUE(SetupChannel());
832 EXPECT_TRUE(AddRecvStream(kSsrcX));
833 const webrtc::AudioReceiveStreamInterface::Config& config =
834 GetRecvStreamConfig(kSsrcX);
835 EXPECT_EQ(kSsrcX, config.rtp.remote_ssrc);
836 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
837 EXPECT_FALSE(config.rtp.transport_cc);
838 EXPECT_EQ(0u, config.rtp.extensions.size());
839 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
840 config.rtcp_send_transport);
841 EXPECT_EQ("", config.sync_group);
842 }
843
TEST_P(WebRtcVoiceEngineTestFake,OpusSupportsTransportCc)844 TEST_P(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
845 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
846 bool opus_found = false;
847 for (const cricket::AudioCodec& codec : codecs) {
848 if (codec.name == "opus") {
849 EXPECT_TRUE(HasTransportCc(codec));
850 opus_found = true;
851 }
852 }
853 EXPECT_TRUE(opus_found);
854 }
855
856 // Test that we set our inbound codecs properly, including changing PT.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecs)857 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
858 EXPECT_TRUE(SetupChannel());
859 cricket::AudioRecvParameters parameters;
860 parameters.codecs.push_back(kOpusCodec);
861 parameters.codecs.push_back(kPcmuCodec);
862 parameters.codecs.push_back(kTelephoneEventCodec1);
863 parameters.codecs.push_back(kTelephoneEventCodec2);
864 parameters.codecs[0].id = 106; // collide with existing CN 32k
865 parameters.codecs[2].id = 126;
866 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
867 EXPECT_TRUE(AddRecvStream(kSsrcX));
868 EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
869 (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
870 {{0, {"PCMU", 8000, 1}},
871 {106, {"OPUS", 48000, 2}},
872 {126, {"telephone-event", 8000, 1}},
873 {107, {"telephone-event", 32000, 1}}})));
874 }
875
876 // Test that we fail to set an unknown inbound codec.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsUnsupportedCodec)877 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
878 EXPECT_TRUE(SetupChannel());
879 cricket::AudioRecvParameters parameters;
880 parameters.codecs.push_back(kOpusCodec);
881 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
882 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
883 }
884
885 // Test that we fail if we have duplicate types in the inbound list.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsDuplicatePayloadType)886 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
887 EXPECT_TRUE(SetupChannel());
888 cricket::AudioRecvParameters parameters;
889 parameters.codecs.push_back(kOpusCodec);
890 parameters.codecs.push_back(kCn16000Codec);
891 parameters.codecs[1].id = kOpusCodec.id;
892 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
893 }
894
895 // Test that we can decode OPUS without stereo parameters.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWithOpusNoStereo)896 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
897 EXPECT_TRUE(SetupChannel());
898 cricket::AudioRecvParameters parameters;
899 parameters.codecs.push_back(kPcmuCodec);
900 parameters.codecs.push_back(kOpusCodec);
901 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
902 EXPECT_TRUE(AddRecvStream(kSsrcX));
903 EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
904 (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
905 {{0, {"PCMU", 8000, 1}}, {111, {"opus", 48000, 2}}})));
906 }
907
908 // Test that we can decode OPUS with stereo = 0.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWithOpus0Stereo)909 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
910 EXPECT_TRUE(SetupChannel());
911 cricket::AudioRecvParameters parameters;
912 parameters.codecs.push_back(kPcmuCodec);
913 parameters.codecs.push_back(kOpusCodec);
914 parameters.codecs[1].params["stereo"] = "0";
915 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
916 EXPECT_TRUE(AddRecvStream(kSsrcX));
917 EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
918 (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
919 {{0, {"PCMU", 8000, 1}},
920 {111, {"opus", 48000, 2, {{"stereo", "0"}}}}})));
921 }
922
923 // Test that we can decode OPUS with stereo = 1.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWithOpus1Stereo)924 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
925 EXPECT_TRUE(SetupChannel());
926 cricket::AudioRecvParameters parameters;
927 parameters.codecs.push_back(kPcmuCodec);
928 parameters.codecs.push_back(kOpusCodec);
929 parameters.codecs[1].params["stereo"] = "1";
930 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
931 EXPECT_TRUE(AddRecvStream(kSsrcX));
932 EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
933 (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
934 {{0, {"PCMU", 8000, 1}},
935 {111, {"opus", 48000, 2, {{"stereo", "1"}}}}})));
936 }
937
938 // Test that changes to recv codecs are applied to all streams.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWithMultipleStreams)939 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
940 EXPECT_TRUE(SetupChannel());
941 cricket::AudioRecvParameters parameters;
942 parameters.codecs.push_back(kOpusCodec);
943 parameters.codecs.push_back(kPcmuCodec);
944 parameters.codecs.push_back(kTelephoneEventCodec1);
945 parameters.codecs.push_back(kTelephoneEventCodec2);
946 parameters.codecs[0].id = 106; // collide with existing CN 32k
947 parameters.codecs[2].id = 126;
948 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
949 for (const auto& ssrc : {kSsrcX, kSsrcY}) {
950 EXPECT_TRUE(AddRecvStream(ssrc));
951 EXPECT_THAT(GetRecvStreamConfig(ssrc).decoder_map,
952 (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
953 {{0, {"PCMU", 8000, 1}},
954 {106, {"OPUS", 48000, 2}},
955 {126, {"telephone-event", 8000, 1}},
956 {107, {"telephone-event", 32000, 1}}})));
957 }
958 }
959
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsAfterAddingStreams)960 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
961 EXPECT_TRUE(SetupRecvStream());
962 cricket::AudioRecvParameters parameters;
963 parameters.codecs.push_back(kOpusCodec);
964 parameters.codecs[0].id = 106; // collide with existing CN 32k
965 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
966
967 const auto& dm = GetRecvStreamConfig(kSsrcX).decoder_map;
968 ASSERT_EQ(1u, dm.count(106));
969 EXPECT_EQ(webrtc::SdpAudioFormat("opus", 48000, 2), dm.at(106));
970 }
971
972 // Test that we can apply the same set of codecs again while playing.
TEST_P(WebRtcVoiceEngineTestFake,SetRecvCodecsWhilePlaying)973 TEST_P(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
974 EXPECT_TRUE(SetupRecvStream());
975 cricket::AudioRecvParameters parameters;
976 parameters.codecs.push_back(kPcmuCodec);
977 parameters.codecs.push_back(kCn16000Codec);
978 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
979 channel_->SetPlayout(true);
980 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
981
982 // Remapping a payload type to a different codec should fail.
983 parameters.codecs[0] = kOpusCodec;
984 parameters.codecs[0].id = kPcmuCodec.id;
985 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
986 EXPECT_TRUE(GetRecvStream(kSsrcX).started());
987 }
988
989 // Test that we can add a codec while playing.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvCodecsWhilePlaying)990 TEST_P(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
991 EXPECT_TRUE(SetupRecvStream());
992 cricket::AudioRecvParameters parameters;
993 parameters.codecs.push_back(kPcmuCodec);
994 parameters.codecs.push_back(kCn16000Codec);
995 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
996 channel_->SetPlayout(true);
997
998 parameters.codecs.push_back(kOpusCodec);
999 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1000 EXPECT_TRUE(GetRecvStream(kSsrcX).started());
1001 }
1002
1003 // Test that we accept adding the same codec with a different payload type.
1004 // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5847
TEST_P(WebRtcVoiceEngineTestFake,ChangeRecvCodecPayloadType)1005 TEST_P(WebRtcVoiceEngineTestFake, ChangeRecvCodecPayloadType) {
1006 EXPECT_TRUE(SetupRecvStream());
1007 cricket::AudioRecvParameters parameters;
1008 parameters.codecs.push_back(kOpusCodec);
1009 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1010
1011 ++parameters.codecs[0].id;
1012 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1013 }
1014
1015 // Test that we do allow setting Opus/Red by default.
TEST_P(WebRtcVoiceEngineTestFake,RecvRedDefault)1016 TEST_P(WebRtcVoiceEngineTestFake, RecvRedDefault) {
1017 EXPECT_TRUE(SetupRecvStream());
1018 cricket::AudioRecvParameters parameters;
1019 parameters.codecs.push_back(kOpusCodec);
1020 parameters.codecs.push_back(kRed48000Codec);
1021 parameters.codecs[1].params[""] = "111/111";
1022 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1023 EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
1024 (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
1025 {{111, {"opus", 48000, 2}},
1026 {112, {"red", 48000, 2, {{"", "111/111"}}}}})));
1027 }
1028
TEST_P(WebRtcVoiceEngineTestFake,SetSendBandwidthAuto)1029 TEST_P(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
1030 EXPECT_TRUE(SetupSendStream());
1031
1032 // Test that when autobw is enabled, bitrate is kept as the default
1033 // value. autobw is enabled for the following tests because the target
1034 // bitrate is <= 0.
1035
1036 // PCMU, default bitrate == 64000.
1037 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
1038
1039 // opus, default bitrate == 32000 in mono.
1040 TestMaxSendBandwidth(kOpusCodec, -1, true, 32000);
1041 }
1042
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthMultiRateAsCaller)1043 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
1044 EXPECT_TRUE(SetupSendStream());
1045
1046 // opus, default bitrate == 64000.
1047 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
1048 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
1049 // Rates above the max (510000) should be capped.
1050 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
1051 }
1052
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthFixedRateAsCaller)1053 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
1054 EXPECT_TRUE(SetupSendStream());
1055
1056 // Test that we can only set a maximum bitrate for a fixed-rate codec
1057 // if it's bigger than the fixed rate.
1058
1059 // PCMU, fixed bitrate == 64000.
1060 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
1061 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
1062 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
1063 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
1064 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
1065 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
1066 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
1067 }
1068
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthMultiRateAsCallee)1069 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
1070 EXPECT_TRUE(SetupChannel());
1071 const int kDesiredBitrate = 128000;
1072 cricket::AudioSendParameters parameters;
1073 parameters.codecs = engine_->send_codecs();
1074 parameters.max_bandwidth_bps = kDesiredBitrate;
1075 SetSendParameters(parameters);
1076
1077 EXPECT_TRUE(
1078 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
1079
1080 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrcX));
1081 }
1082
1083 // Test that bitrate cannot be set for CBR codecs.
1084 // Bitrate is ignored if it is higher than the fixed bitrate.
1085 // Bitrate less then the fixed bitrate is an error.
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthCbr)1086 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
1087 EXPECT_TRUE(SetupSendStream());
1088
1089 // PCMU, default bitrate == 64000.
1090 SetSendParameters(send_parameters_);
1091 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1092
1093 send_parameters_.max_bandwidth_bps = 128000;
1094 SetSendParameters(send_parameters_);
1095 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1096
1097 send_parameters_.max_bandwidth_bps = 128;
1098 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
1099 EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
1100 }
1101
1102 // Test that the per-stream bitrate limit and the global
1103 // bitrate limit both apply.
TEST_P(WebRtcVoiceEngineTestFake,SetMaxBitratePerStream)1104 TEST_P(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
1105 EXPECT_TRUE(SetupSendStream());
1106
1107 // opus, default bitrate == 32000.
1108 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 32000);
1109 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
1110 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
1111 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
1112
1113 // CBR codecs allow both maximums to exceed the bitrate.
1114 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
1115 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
1116 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
1117 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
1118
1119 // CBR codecs don't allow per stream maximums to be too low.
1120 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
1121 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
1122 }
1123
1124 // Test that an attempt to set RtpParameters for a stream that does not exist
1125 // fails.
TEST_P(WebRtcVoiceEngineTestFake,CannotSetMaxBitrateForNonexistentStream)1126 TEST_P(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
1127 EXPECT_TRUE(SetupChannel());
1128 webrtc::RtpParameters nonexistent_parameters =
1129 channel_->GetRtpSendParameters(kSsrcX);
1130 EXPECT_EQ(0u, nonexistent_parameters.encodings.size());
1131
1132 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
1133 EXPECT_FALSE(
1134 channel_->SetRtpSendParameters(kSsrcX, nonexistent_parameters).ok());
1135 }
1136
TEST_P(WebRtcVoiceEngineTestFake,CannotSetRtpSendParametersWithIncorrectNumberOfEncodings)1137 TEST_P(WebRtcVoiceEngineTestFake,
1138 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
1139 // This test verifies that setting RtpParameters succeeds only if
1140 // the structure contains exactly one encoding.
1141 // TODO(skvlad): Update this test when we start supporting setting parameters
1142 // for each encoding individually.
1143
1144 EXPECT_TRUE(SetupSendStream());
1145 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1146 // Two or more encodings should result in failure.
1147 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
1148 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1149 // Zero encodings should also fail.
1150 parameters.encodings.clear();
1151 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1152 }
1153
1154 // Changing the SSRC through RtpParameters is not allowed.
TEST_P(WebRtcVoiceEngineTestFake,CannotSetSsrcInRtpSendParameters)1155 TEST_P(WebRtcVoiceEngineTestFake, CannotSetSsrcInRtpSendParameters) {
1156 EXPECT_TRUE(SetupSendStream());
1157 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1158 parameters.encodings[0].ssrc = 0xdeadbeef;
1159 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1160 }
1161
1162 // Test that a stream will not be sending if its encoding is made
1163 // inactive through SetRtpSendParameters.
TEST_P(WebRtcVoiceEngineTestFake,SetRtpParametersEncodingsActive)1164 TEST_P(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1165 EXPECT_TRUE(SetupSendStream());
1166 SetSend(true);
1167 EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
1168 // Get current parameters and change "active" to false.
1169 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1170 ASSERT_EQ(1u, parameters.encodings.size());
1171 ASSERT_TRUE(parameters.encodings[0].active);
1172 parameters.encodings[0].active = false;
1173 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1174 EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
1175
1176 // Now change it back to active and verify we resume sending.
1177 // This should occur even when other parameters are updated.
1178 parameters.encodings[0].active = true;
1179 parameters.encodings[0].max_bitrate_bps = absl::optional<int>(6000);
1180 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1181 EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
1182 }
1183
TEST_P(WebRtcVoiceEngineTestFake,SetRtpParametersAdaptivePtime)1184 TEST_P(WebRtcVoiceEngineTestFake, SetRtpParametersAdaptivePtime) {
1185 EXPECT_TRUE(SetupSendStream());
1186 // Get current parameters and change "adaptive_ptime" to true.
1187 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1188 ASSERT_EQ(1u, parameters.encodings.size());
1189 ASSERT_FALSE(parameters.encodings[0].adaptive_ptime);
1190 parameters.encodings[0].adaptive_ptime = true;
1191 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1192 EXPECT_TRUE(GetAudioNetworkAdaptorConfig(kSsrcX));
1193 EXPECT_EQ(16000, GetSendStreamConfig(kSsrcX).min_bitrate_bps);
1194
1195 parameters.encodings[0].adaptive_ptime = false;
1196 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1197 EXPECT_FALSE(GetAudioNetworkAdaptorConfig(kSsrcX));
1198 EXPECT_EQ(32000, GetSendStreamConfig(kSsrcX).min_bitrate_bps);
1199 }
1200
TEST_P(WebRtcVoiceEngineTestFake,DisablingAdaptivePtimeDoesNotRemoveAudioNetworkAdaptorFromOptions)1201 TEST_P(WebRtcVoiceEngineTestFake,
1202 DisablingAdaptivePtimeDoesNotRemoveAudioNetworkAdaptorFromOptions) {
1203 EXPECT_TRUE(SetupSendStream());
1204 send_parameters_.options.audio_network_adaptor = true;
1205 send_parameters_.options.audio_network_adaptor_config = {"1234"};
1206 SetSendParameters(send_parameters_);
1207 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
1208 GetAudioNetworkAdaptorConfig(kSsrcX));
1209
1210 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
1211 parameters.encodings[0].adaptive_ptime = false;
1212 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok());
1213 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
1214 GetAudioNetworkAdaptorConfig(kSsrcX));
1215 }
1216
TEST_P(WebRtcVoiceEngineTestFake,AdaptivePtimeFieldTrial)1217 TEST_P(WebRtcVoiceEngineTestFake, AdaptivePtimeFieldTrial) {
1218 webrtc::test::ScopedKeyValueConfig override_field_trials(
1219 field_trials_, "WebRTC-Audio-AdaptivePtime/enabled:true/");
1220 EXPECT_TRUE(SetupSendStream());
1221 EXPECT_TRUE(GetAudioNetworkAdaptorConfig(kSsrcX));
1222 }
1223
1224 // Test that SetRtpSendParameters configures the correct encoding channel for
1225 // each SSRC.
TEST_P(WebRtcVoiceEngineTestFake,RtpParametersArePerStream)1226 TEST_P(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1227 SetupForMultiSendStream();
1228 // Create send streams.
1229 for (uint32_t ssrc : kSsrcs4) {
1230 EXPECT_TRUE(
1231 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1232 }
1233 // Configure one stream to be limited by the stream config, another to be
1234 // limited by the global max, and the third one with no per-stream limit
1235 // (still subject to the global limit).
1236 SetGlobalMaxBitrate(kOpusCodec, 32000);
1237 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 24000));
1238 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 48000));
1239 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1240
1241 EXPECT_EQ(24000, GetCodecBitrate(kSsrcs4[0]));
1242 EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[1]));
1243 EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[2]));
1244
1245 // Remove the global cap; the streams should switch to their respective
1246 // maximums (or remain unchanged if there was no other limit on them.)
1247 SetGlobalMaxBitrate(kOpusCodec, -1);
1248 EXPECT_EQ(24000, GetCodecBitrate(kSsrcs4[0]));
1249 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[1]));
1250 EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[2]));
1251 }
1252
1253 // Test that GetRtpSendParameters returns the currently configured codecs.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpSendParametersCodecs)1254 TEST_P(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
1255 EXPECT_TRUE(SetupSendStream());
1256 cricket::AudioSendParameters parameters;
1257 parameters.codecs.push_back(kOpusCodec);
1258 parameters.codecs.push_back(kPcmuCodec);
1259 SetSendParameters(parameters);
1260
1261 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1262 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1263 EXPECT_EQ(kOpusCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1264 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1265 }
1266
1267 // Test that GetRtpSendParameters returns the currently configured RTCP CNAME.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpSendParametersRtcpCname)1268 TEST_P(WebRtcVoiceEngineTestFake, GetRtpSendParametersRtcpCname) {
1269 cricket::StreamParams params = cricket::StreamParams::CreateLegacy(kSsrcX);
1270 params.cname = "rtcpcname";
1271 EXPECT_TRUE(SetupSendStream(params));
1272
1273 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1274 EXPECT_STREQ("rtcpcname", rtp_parameters.rtcp.cname.c_str());
1275 }
1276
TEST_P(WebRtcVoiceEngineTestFake,DetectRtpSendParameterHeaderExtensionsChange)1277 TEST_P(WebRtcVoiceEngineTestFake,
1278 DetectRtpSendParameterHeaderExtensionsChange) {
1279 EXPECT_TRUE(SetupSendStream());
1280
1281 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1282 rtp_parameters.header_extensions.emplace_back();
1283
1284 EXPECT_NE(0u, rtp_parameters.header_extensions.size());
1285
1286 webrtc::RTCError result =
1287 channel_->SetRtpSendParameters(kSsrcX, rtp_parameters);
1288 EXPECT_EQ(webrtc::RTCErrorType::INVALID_MODIFICATION, result.type());
1289 }
1290
1291 // Test that GetRtpSendParameters returns an SSRC.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpSendParametersSsrc)1292 TEST_P(WebRtcVoiceEngineTestFake, GetRtpSendParametersSsrc) {
1293 EXPECT_TRUE(SetupSendStream());
1294 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1295 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1296 EXPECT_EQ(kSsrcX, rtp_parameters.encodings[0].ssrc);
1297 }
1298
1299 // Test that if we set/get parameters multiple times, we get the same results.
TEST_P(WebRtcVoiceEngineTestFake,SetAndGetRtpSendParameters)1300 TEST_P(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
1301 EXPECT_TRUE(SetupSendStream());
1302 cricket::AudioSendParameters parameters;
1303 parameters.codecs.push_back(kOpusCodec);
1304 parameters.codecs.push_back(kPcmuCodec);
1305 SetSendParameters(parameters);
1306
1307 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrcX);
1308
1309 // We should be able to set the params we just got.
1310 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, initial_params).ok());
1311
1312 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1313 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrcX);
1314 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrcX));
1315 }
1316
1317 // Test that max_bitrate_bps in send stream config gets updated correctly when
1318 // SetRtpSendParameters is called.
TEST_P(WebRtcVoiceEngineTestFake,SetRtpSendParameterUpdatesMaxBitrate)1319 TEST_P(WebRtcVoiceEngineTestFake, SetRtpSendParameterUpdatesMaxBitrate) {
1320 EXPECT_TRUE(SetupSendStream());
1321 cricket::AudioSendParameters send_parameters;
1322 send_parameters.codecs.push_back(kOpusCodec);
1323 SetSendParameters(send_parameters);
1324
1325 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1326 // Expect empty on parameters.encodings[0].max_bitrate_bps;
1327 EXPECT_FALSE(rtp_parameters.encodings[0].max_bitrate_bps);
1328
1329 constexpr int kMaxBitrateBps = 6000;
1330 rtp_parameters.encodings[0].max_bitrate_bps = kMaxBitrateBps;
1331 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
1332
1333 const int max_bitrate = GetSendStreamConfig(kSsrcX).max_bitrate_bps;
1334 EXPECT_EQ(max_bitrate, kMaxBitrateBps);
1335 }
1336
1337 // Tests that when RTCRtpEncodingParameters.bitrate_priority gets set to
1338 // a value <= 0, setting the parameters returns false.
TEST_P(WebRtcVoiceEngineTestFake,SetRtpSendParameterInvalidBitratePriority)1339 TEST_P(WebRtcVoiceEngineTestFake, SetRtpSendParameterInvalidBitratePriority) {
1340 EXPECT_TRUE(SetupSendStream());
1341 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1342 EXPECT_EQ(1UL, rtp_parameters.encodings.size());
1343 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1344 rtp_parameters.encodings[0].bitrate_priority);
1345
1346 rtp_parameters.encodings[0].bitrate_priority = 0;
1347 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
1348 rtp_parameters.encodings[0].bitrate_priority = -1.0;
1349 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
1350 }
1351
1352 // Test that the bitrate_priority in the send stream config gets updated when
1353 // SetRtpSendParameters is set for the VoiceMediaChannel.
TEST_P(WebRtcVoiceEngineTestFake,SetRtpSendParameterUpdatesBitratePriority)1354 TEST_P(WebRtcVoiceEngineTestFake, SetRtpSendParameterUpdatesBitratePriority) {
1355 EXPECT_TRUE(SetupSendStream());
1356 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
1357
1358 EXPECT_EQ(1UL, rtp_parameters.encodings.size());
1359 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1360 rtp_parameters.encodings[0].bitrate_priority);
1361 double new_bitrate_priority = 2.0;
1362 rtp_parameters.encodings[0].bitrate_priority = new_bitrate_priority;
1363 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters).ok());
1364
1365 // The priority should get set for both the audio channel's rtp parameters
1366 // and the audio send stream's audio config.
1367 EXPECT_EQ(
1368 new_bitrate_priority,
1369 channel_->GetRtpSendParameters(kSsrcX).encodings[0].bitrate_priority);
1370 EXPECT_EQ(new_bitrate_priority, GetSendStreamConfig(kSsrcX).bitrate_priority);
1371 }
1372
1373 // Test that GetRtpReceiveParameters returns the currently configured codecs.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpReceiveParametersCodecs)1374 TEST_P(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1375 EXPECT_TRUE(SetupRecvStream());
1376 cricket::AudioRecvParameters parameters;
1377 parameters.codecs.push_back(kOpusCodec);
1378 parameters.codecs.push_back(kPcmuCodec);
1379 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1380
1381 webrtc::RtpParameters rtp_parameters =
1382 channel_->GetRtpReceiveParameters(kSsrcX);
1383 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1384 EXPECT_EQ(kOpusCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1385 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1386 }
1387
1388 // Test that GetRtpReceiveParameters returns an SSRC.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpReceiveParametersSsrc)1389 TEST_P(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersSsrc) {
1390 EXPECT_TRUE(SetupRecvStream());
1391 webrtc::RtpParameters rtp_parameters =
1392 channel_->GetRtpReceiveParameters(kSsrcX);
1393 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1394 EXPECT_EQ(kSsrcX, rtp_parameters.encodings[0].ssrc);
1395 }
1396
1397 // Test that if we set/get parameters multiple times, we get the same results.
TEST_P(WebRtcVoiceEngineTestFake,SetAndGetRtpReceiveParameters)1398 TEST_P(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1399 EXPECT_TRUE(SetupRecvStream());
1400 cricket::AudioRecvParameters parameters;
1401 parameters.codecs.push_back(kOpusCodec);
1402 parameters.codecs.push_back(kPcmuCodec);
1403 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1404
1405 webrtc::RtpParameters initial_params =
1406 channel_->GetRtpReceiveParameters(kSsrcX);
1407
1408 // ... And this shouldn't change the params returned by
1409 // GetRtpReceiveParameters.
1410 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrcX);
1411 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrcX));
1412 }
1413
1414 // Test that GetRtpReceiveParameters returns parameters correctly when SSRCs
1415 // aren't signaled. It should return an empty "RtpEncodingParameters" when
1416 // configured to receive an unsignaled stream and no packets have been received
1417 // yet, and start returning the SSRC once a packet has been received.
TEST_P(WebRtcVoiceEngineTestFake,GetRtpReceiveParametersWithUnsignaledSsrc)1418 TEST_P(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersWithUnsignaledSsrc) {
1419 ASSERT_TRUE(SetupChannel());
1420 // Call necessary methods to configure receiving a default stream as
1421 // soon as it arrives.
1422 cricket::AudioRecvParameters parameters;
1423 parameters.codecs.push_back(kOpusCodec);
1424 parameters.codecs.push_back(kPcmuCodec);
1425 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1426
1427 // Call GetDefaultRtpReceiveParameters before configured to receive an
1428 // unsignaled stream. Should return nothing.
1429 EXPECT_EQ(webrtc::RtpParameters(),
1430 channel_->GetDefaultRtpReceiveParameters());
1431
1432 // Set a sink for an unsignaled stream.
1433 std::unique_ptr<FakeAudioSink> fake_sink(new FakeAudioSink());
1434 channel_->SetDefaultRawAudioSink(std::move(fake_sink));
1435
1436 // Call GetDefaultRtpReceiveParameters before the SSRC is known.
1437 webrtc::RtpParameters rtp_parameters =
1438 channel_->GetDefaultRtpReceiveParameters();
1439 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1440 EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
1441
1442 // Receive PCMU packet (SSRC=1).
1443 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
1444
1445 // The `ssrc` member should still be unset.
1446 rtp_parameters = channel_->GetDefaultRtpReceiveParameters();
1447 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1448 EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
1449 }
1450
1451 // Test that we apply codecs properly.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecs)1452 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecs) {
1453 EXPECT_TRUE(SetupSendStream());
1454 cricket::AudioSendParameters parameters;
1455 parameters.codecs.push_back(kOpusCodec);
1456 parameters.codecs.push_back(kPcmuCodec);
1457 parameters.codecs.push_back(kCn8000Codec);
1458 parameters.codecs[0].id = 96;
1459 parameters.codecs[0].bitrate = 22000;
1460 SetSendParameters(parameters);
1461 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1462 EXPECT_EQ(96, send_codec_spec.payload_type);
1463 EXPECT_EQ(22000, send_codec_spec.target_bitrate_bps);
1464 EXPECT_STRCASEEQ("OPUS", send_codec_spec.format.name.c_str());
1465 EXPECT_NE(send_codec_spec.format.clockrate_hz, 8000);
1466 EXPECT_EQ(absl::nullopt, send_codec_spec.cng_payload_type);
1467 EXPECT_FALSE(channel_->CanInsertDtmf());
1468 }
1469
1470 // Test that we use Opus/Red by default when it is
1471 // listed as the first codec and there is an fmtp line.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRed)1472 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRed) {
1473 EXPECT_TRUE(SetupSendStream());
1474 cricket::AudioSendParameters parameters;
1475 parameters.codecs.push_back(kRed48000Codec);
1476 parameters.codecs[0].params[""] = "111/111";
1477 parameters.codecs.push_back(kOpusCodec);
1478 SetSendParameters(parameters);
1479 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1480 EXPECT_EQ(111, send_codec_spec.payload_type);
1481 EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1482 EXPECT_EQ(112, send_codec_spec.red_payload_type);
1483 }
1484
1485 // Test that we do not use Opus/Red by default when it is
1486 // listed as the first codec but there is no fmtp line.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRedNoFmtp)1487 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedNoFmtp) {
1488 EXPECT_TRUE(SetupSendStream());
1489 cricket::AudioSendParameters parameters;
1490 parameters.codecs.push_back(kRed48000Codec);
1491 parameters.codecs.push_back(kOpusCodec);
1492 SetSendParameters(parameters);
1493 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1494 EXPECT_EQ(111, send_codec_spec.payload_type);
1495 EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1496 EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
1497 }
1498
1499 // Test that we do not use Opus/Red by default.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRedDefault)1500 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedDefault) {
1501 EXPECT_TRUE(SetupSendStream());
1502 cricket::AudioSendParameters parameters;
1503 parameters.codecs.push_back(kOpusCodec);
1504 parameters.codecs.push_back(kRed48000Codec);
1505 parameters.codecs[1].params[""] = "111/111";
1506 SetSendParameters(parameters);
1507 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1508 EXPECT_EQ(111, send_codec_spec.payload_type);
1509 EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1510 EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
1511 }
1512
1513 // Test that the RED fmtp line must match the payload type.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRedFmtpMismatch)1514 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedFmtpMismatch) {
1515 EXPECT_TRUE(SetupSendStream());
1516 cricket::AudioSendParameters parameters;
1517 parameters.codecs.push_back(kRed48000Codec);
1518 parameters.codecs[0].params[""] = "8/8";
1519 parameters.codecs.push_back(kOpusCodec);
1520 SetSendParameters(parameters);
1521 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1522 EXPECT_EQ(111, send_codec_spec.payload_type);
1523 EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1524 EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
1525 }
1526
1527 // Test that the RED fmtp line must show 2..32 payloads.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsRedFmtpAmountOfRedundancy)1528 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsRedFmtpAmountOfRedundancy) {
1529 EXPECT_TRUE(SetupSendStream());
1530 cricket::AudioSendParameters parameters;
1531 parameters.codecs.push_back(kRed48000Codec);
1532 parameters.codecs[0].params[""] = "111";
1533 parameters.codecs.push_back(kOpusCodec);
1534 SetSendParameters(parameters);
1535 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1536 EXPECT_EQ(111, send_codec_spec.payload_type);
1537 EXPECT_STRCASEEQ("opus", send_codec_spec.format.name.c_str());
1538 EXPECT_EQ(absl::nullopt, send_codec_spec.red_payload_type);
1539 for (int i = 1; i < 32; i++) {
1540 parameters.codecs[0].params[""] += "/111";
1541 SetSendParameters(parameters);
1542 const auto& send_codec_spec2 = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1543 EXPECT_EQ(111, send_codec_spec2.payload_type);
1544 EXPECT_STRCASEEQ("opus", send_codec_spec2.format.name.c_str());
1545 EXPECT_EQ(112, send_codec_spec2.red_payload_type);
1546 }
1547 parameters.codecs[0].params[""] += "/111";
1548 SetSendParameters(parameters);
1549 const auto& send_codec_spec3 = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1550 EXPECT_EQ(111, send_codec_spec3.payload_type);
1551 EXPECT_STRCASEEQ("opus", send_codec_spec3.format.name.c_str());
1552 EXPECT_EQ(absl::nullopt, send_codec_spec3.red_payload_type);
1553 }
1554
1555 // Test that WebRtcVoiceEngine reconfigures, rather than recreates its
1556 // AudioSendStream.
TEST_P(WebRtcVoiceEngineTestFake,DontRecreateSendStream)1557 TEST_P(WebRtcVoiceEngineTestFake, DontRecreateSendStream) {
1558 EXPECT_TRUE(SetupSendStream());
1559 cricket::AudioSendParameters parameters;
1560 parameters.codecs.push_back(kOpusCodec);
1561 parameters.codecs.push_back(kPcmuCodec);
1562 parameters.codecs.push_back(kCn8000Codec);
1563 parameters.codecs[0].id = 96;
1564 parameters.codecs[0].bitrate = 48000;
1565 const int initial_num = call_.GetNumCreatedSendStreams();
1566 SetSendParameters(parameters);
1567 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
1568 // Calling SetSendCodec again with same codec which is already set.
1569 // In this case media channel shouldn't send codec to VoE.
1570 SetSendParameters(parameters);
1571 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
1572 }
1573
1574 // TODO(ossu): Revisit if these tests need to be here, now that these kinds of
1575 // tests should be available in AudioEncoderOpusTest.
1576
1577 // Test that if clockrate is not 48000 for opus, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBadClockrate)1578 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
1579 EXPECT_TRUE(SetupSendStream());
1580 cricket::AudioSendParameters parameters;
1581 parameters.codecs.push_back(kOpusCodec);
1582 parameters.codecs[0].bitrate = 0;
1583 parameters.codecs[0].clockrate = 50000;
1584 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1585 }
1586
1587 // Test that if channels=0 for opus, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBad0ChannelsNoStereo)1588 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
1589 EXPECT_TRUE(SetupSendStream());
1590 cricket::AudioSendParameters parameters;
1591 parameters.codecs.push_back(kOpusCodec);
1592 parameters.codecs[0].bitrate = 0;
1593 parameters.codecs[0].channels = 0;
1594 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1595 }
1596
1597 // Test that if channels=0 for opus, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBad0Channels1Stereo)1598 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
1599 EXPECT_TRUE(SetupSendStream());
1600 cricket::AudioSendParameters parameters;
1601 parameters.codecs.push_back(kOpusCodec);
1602 parameters.codecs[0].bitrate = 0;
1603 parameters.codecs[0].channels = 0;
1604 parameters.codecs[0].params["stereo"] = "1";
1605 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1606 }
1607
1608 // Test that if channel is 1 for opus and there's no stereo, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpus1ChannelNoStereo)1609 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
1610 EXPECT_TRUE(SetupSendStream());
1611 cricket::AudioSendParameters parameters;
1612 parameters.codecs.push_back(kOpusCodec);
1613 parameters.codecs[0].bitrate = 0;
1614 parameters.codecs[0].channels = 1;
1615 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1616 }
1617
1618 // Test that if channel is 1 for opus and stereo=0, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBad1Channel0Stereo)1619 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
1620 EXPECT_TRUE(SetupSendStream());
1621 cricket::AudioSendParameters parameters;
1622 parameters.codecs.push_back(kOpusCodec);
1623 parameters.codecs[0].bitrate = 0;
1624 parameters.codecs[0].channels = 1;
1625 parameters.codecs[0].params["stereo"] = "0";
1626 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1627 }
1628
1629 // Test that if channel is 1 for opus and stereo=1, we fail.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusBad1Channel1Stereo)1630 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
1631 EXPECT_TRUE(SetupSendStream());
1632 cricket::AudioSendParameters parameters;
1633 parameters.codecs.push_back(kOpusCodec);
1634 parameters.codecs[0].bitrate = 0;
1635 parameters.codecs[0].channels = 1;
1636 parameters.codecs[0].params["stereo"] = "1";
1637 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1638 }
1639
1640 // Test that with bitrate=0 and no stereo, bitrate is 32000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGood0BitrateNoStereo)1641 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
1642 EXPECT_TRUE(SetupSendStream());
1643 cricket::AudioSendParameters parameters;
1644 parameters.codecs.push_back(kOpusCodec);
1645 parameters.codecs[0].bitrate = 0;
1646 SetSendParameters(parameters);
1647 CheckSendCodecBitrate(kSsrcX, "opus", 32000);
1648 }
1649
1650 // Test that with bitrate=0 and stereo=0, bitrate is 32000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGood0Bitrate0Stereo)1651 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
1652 EXPECT_TRUE(SetupSendStream());
1653 cricket::AudioSendParameters parameters;
1654 parameters.codecs.push_back(kOpusCodec);
1655 parameters.codecs[0].bitrate = 0;
1656 parameters.codecs[0].params["stereo"] = "0";
1657 SetSendParameters(parameters);
1658 CheckSendCodecBitrate(kSsrcX, "opus", 32000);
1659 }
1660
1661 // Test that with bitrate=invalid and stereo=0, bitrate is 32000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodXBitrate0Stereo)1662 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
1663 EXPECT_TRUE(SetupSendStream());
1664 cricket::AudioSendParameters parameters;
1665 parameters.codecs.push_back(kOpusCodec);
1666 parameters.codecs[0].params["stereo"] = "0";
1667 // bitrate that's out of the range between 6000 and 510000 will be clamped.
1668 parameters.codecs[0].bitrate = 5999;
1669 SetSendParameters(parameters);
1670 CheckSendCodecBitrate(kSsrcX, "opus", 6000);
1671
1672 parameters.codecs[0].bitrate = 510001;
1673 SetSendParameters(parameters);
1674 CheckSendCodecBitrate(kSsrcX, "opus", 510000);
1675 }
1676
1677 // Test that with bitrate=0 and stereo=1, bitrate is 64000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGood0Bitrate1Stereo)1678 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
1679 EXPECT_TRUE(SetupSendStream());
1680 cricket::AudioSendParameters parameters;
1681 parameters.codecs.push_back(kOpusCodec);
1682 parameters.codecs[0].bitrate = 0;
1683 parameters.codecs[0].params["stereo"] = "1";
1684 SetSendParameters(parameters);
1685 CheckSendCodecBitrate(kSsrcX, "opus", 64000);
1686 }
1687
1688 // Test that with bitrate=invalid and stereo=1, bitrate is 64000.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodXBitrate1Stereo)1689 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
1690 EXPECT_TRUE(SetupSendStream());
1691 cricket::AudioSendParameters parameters;
1692 parameters.codecs.push_back(kOpusCodec);
1693 parameters.codecs[0].params["stereo"] = "1";
1694 // bitrate that's out of the range between 6000 and 510000 will be clamped.
1695 parameters.codecs[0].bitrate = 5999;
1696 SetSendParameters(parameters);
1697 CheckSendCodecBitrate(kSsrcX, "opus", 6000);
1698
1699 parameters.codecs[0].bitrate = 510001;
1700 SetSendParameters(parameters);
1701 CheckSendCodecBitrate(kSsrcX, "opus", 510000);
1702 }
1703
1704 // Test that with bitrate=N and stereo unset, bitrate is N.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodNBitrateNoStereo)1705 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
1706 EXPECT_TRUE(SetupSendStream());
1707 cricket::AudioSendParameters parameters;
1708 parameters.codecs.push_back(kOpusCodec);
1709 parameters.codecs[0].bitrate = 96000;
1710 SetSendParameters(parameters);
1711 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1712 EXPECT_EQ(111, spec.payload_type);
1713 EXPECT_EQ(96000, spec.target_bitrate_bps);
1714 EXPECT_EQ("opus", spec.format.name);
1715 EXPECT_EQ(2u, spec.format.num_channels);
1716 EXPECT_EQ(48000, spec.format.clockrate_hz);
1717 }
1718
1719 // Test that with bitrate=N and stereo=0, bitrate is N.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodNBitrate0Stereo)1720 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
1721 EXPECT_TRUE(SetupSendStream());
1722 cricket::AudioSendParameters parameters;
1723 parameters.codecs.push_back(kOpusCodec);
1724 parameters.codecs[0].bitrate = 30000;
1725 parameters.codecs[0].params["stereo"] = "0";
1726 SetSendParameters(parameters);
1727 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1728 }
1729
1730 // Test that with bitrate=N and without any parameters, bitrate is N.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodNBitrateNoParameters)1731 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
1732 EXPECT_TRUE(SetupSendStream());
1733 cricket::AudioSendParameters parameters;
1734 parameters.codecs.push_back(kOpusCodec);
1735 parameters.codecs[0].bitrate = 30000;
1736 SetSendParameters(parameters);
1737 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1738 }
1739
1740 // Test that with bitrate=N and stereo=1, bitrate is N.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecOpusGoodNBitrate1Stereo)1741 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
1742 EXPECT_TRUE(SetupSendStream());
1743 cricket::AudioSendParameters parameters;
1744 parameters.codecs.push_back(kOpusCodec);
1745 parameters.codecs[0].bitrate = 30000;
1746 parameters.codecs[0].params["stereo"] = "1";
1747 SetSendParameters(parameters);
1748 CheckSendCodecBitrate(kSsrcX, "opus", 30000);
1749 }
1750
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsWithBitrates)1751 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
1752 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1753 200000);
1754 }
1755
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsWithHighMaxBitrate)1756 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
1757 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1758 }
1759
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsWithoutBitratesUsesCorrectDefaults)1760 TEST_P(WebRtcVoiceEngineTestFake,
1761 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1762 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "", -1);
1763 }
1764
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCapsMinAndStartBitrate)1765 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCapsMinAndStartBitrate) {
1766 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
1767 }
1768
TEST_P(WebRtcVoiceEngineTestFake,SetMaxSendBandwidthForAudioDoesntAffectBwe)1769 TEST_P(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthForAudioDoesntAffectBwe) {
1770 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1771 200000);
1772 send_parameters_.max_bandwidth_bps = 100000;
1773 // Setting max bitrate should keep previous min bitrate
1774 // Setting max bitrate should not reset start bitrate.
1775 EXPECT_CALL(*call_.GetMockTransportControllerSend(),
1776 SetSdpBitrateParameters(
1777 AllOf(Field(&BitrateConstraints::min_bitrate_bps, 100000),
1778 Field(&BitrateConstraints::start_bitrate_bps, -1),
1779 Field(&BitrateConstraints::max_bitrate_bps, 200000))));
1780 SetSendParameters(send_parameters_);
1781 }
1782
1783 // Test that we can enable NACK with opus as callee.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecEnableNackAsCallee)1784 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
1785 EXPECT_TRUE(SetupRecvStream());
1786 cricket::AudioSendParameters parameters;
1787 parameters.codecs.push_back(kOpusCodec);
1788 parameters.codecs[0].AddFeedbackParam(cricket::FeedbackParam(
1789 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
1790 EXPECT_EQ(0, GetRecvStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
1791 SetSendParameters(parameters);
1792 // NACK should be enabled even with no send stream.
1793 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
1794
1795 EXPECT_TRUE(
1796 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
1797 }
1798
1799 // Test that we can enable NACK on receive streams.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecEnableNackRecvStreams)1800 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
1801 EXPECT_TRUE(SetupSendStream());
1802 EXPECT_TRUE(AddRecvStream(kSsrcY));
1803 cricket::AudioSendParameters parameters;
1804 parameters.codecs.push_back(kOpusCodec);
1805 parameters.codecs[0].AddFeedbackParam(cricket::FeedbackParam(
1806 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
1807 EXPECT_EQ(0, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1808 SetSendParameters(parameters);
1809 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1810 }
1811
1812 // Test that we can disable NACK on receive streams.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecDisableNackRecvStreams)1813 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
1814 EXPECT_TRUE(SetupSendStream());
1815 EXPECT_TRUE(AddRecvStream(kSsrcY));
1816 cricket::AudioSendParameters parameters;
1817 parameters.codecs.push_back(kOpusCodec);
1818 parameters.codecs[0].AddFeedbackParam(cricket::FeedbackParam(
1819 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
1820 SetSendParameters(parameters);
1821 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1822
1823 parameters.codecs.clear();
1824 parameters.codecs.push_back(kOpusCodec);
1825 SetSendParameters(parameters);
1826 EXPECT_EQ(0, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1827 }
1828
1829 // Test that NACK is enabled on a new receive stream.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStreamEnableNack)1830 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
1831 EXPECT_TRUE(SetupSendStream());
1832 cricket::AudioSendParameters parameters;
1833 parameters.codecs.push_back(kOpusCodec);
1834 parameters.codecs.push_back(kCn16000Codec);
1835 parameters.codecs[0].AddFeedbackParam(cricket::FeedbackParam(
1836 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty));
1837 SetSendParameters(parameters);
1838
1839 EXPECT_TRUE(AddRecvStream(kSsrcY));
1840 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
1841 EXPECT_TRUE(AddRecvStream(kSsrcZ));
1842 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcZ).rtp.nack.rtp_history_ms);
1843 }
1844
TEST_P(WebRtcVoiceEngineTestFake,TransportCcCanBeEnabledAndDisabled)1845 TEST_P(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1846 EXPECT_TRUE(SetupChannel());
1847 cricket::AudioSendParameters send_parameters;
1848 send_parameters.codecs.push_back(kOpusCodec);
1849 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1850 SetSendParameters(send_parameters);
1851
1852 cricket::AudioRecvParameters recv_parameters;
1853 recv_parameters.codecs.push_back(kOpusCodec);
1854 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1855 EXPECT_TRUE(AddRecvStream(kSsrcX));
1856 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
1857 EXPECT_FALSE(call_.GetAudioReceiveStream(kSsrcX)->transport_cc());
1858
1859 send_parameters.codecs = engine_->send_codecs();
1860 SetSendParameters(send_parameters);
1861 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
1862 EXPECT_TRUE(call_.GetAudioReceiveStream(kSsrcX)->transport_cc());
1863 }
1864
1865 // Test that we can switch back and forth between Opus and PCMU with CN.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsOpusPcmuSwitching)1866 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsOpusPcmuSwitching) {
1867 EXPECT_TRUE(SetupSendStream());
1868
1869 cricket::AudioSendParameters opus_parameters;
1870 opus_parameters.codecs.push_back(kOpusCodec);
1871 SetSendParameters(opus_parameters);
1872 {
1873 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1874 EXPECT_EQ(111, spec.payload_type);
1875 EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
1876 }
1877
1878 cricket::AudioSendParameters pcmu_parameters;
1879 pcmu_parameters.codecs.push_back(kPcmuCodec);
1880 pcmu_parameters.codecs.push_back(kCn16000Codec);
1881 pcmu_parameters.codecs.push_back(kOpusCodec);
1882 SetSendParameters(pcmu_parameters);
1883 {
1884 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1885 EXPECT_EQ(0, spec.payload_type);
1886 EXPECT_STRCASEEQ("PCMU", spec.format.name.c_str());
1887 }
1888
1889 SetSendParameters(opus_parameters);
1890 {
1891 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1892 EXPECT_EQ(111, spec.payload_type);
1893 EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
1894 }
1895 }
1896
1897 // Test that we handle various ways of specifying bitrate.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsBitrate)1898 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
1899 EXPECT_TRUE(SetupSendStream());
1900 cricket::AudioSendParameters parameters;
1901 parameters.codecs.push_back(kPcmuCodec);
1902 SetSendParameters(parameters);
1903 {
1904 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1905 EXPECT_EQ(0, spec.payload_type);
1906 EXPECT_STRCASEEQ("PCMU", spec.format.name.c_str());
1907 EXPECT_EQ(64000, spec.target_bitrate_bps);
1908 }
1909
1910 parameters.codecs[0].bitrate = 0; // bitrate == default
1911 SetSendParameters(parameters);
1912 {
1913 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1914 EXPECT_EQ(0, spec.payload_type);
1915 EXPECT_STREQ("PCMU", spec.format.name.c_str());
1916 EXPECT_EQ(64000, spec.target_bitrate_bps);
1917 }
1918
1919 parameters.codecs[0] = kOpusCodec;
1920 parameters.codecs[0].bitrate = 0; // bitrate == default
1921 SetSendParameters(parameters);
1922 {
1923 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1924 EXPECT_EQ(111, spec.payload_type);
1925 EXPECT_STREQ("opus", spec.format.name.c_str());
1926 EXPECT_EQ(32000, spec.target_bitrate_bps);
1927 }
1928 }
1929
1930 // Test that we fail if no codecs are specified.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsNoCodecs)1931 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
1932 EXPECT_TRUE(SetupSendStream());
1933 cricket::AudioSendParameters parameters;
1934 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1935 }
1936
1937 // Test that we can set send codecs even with telephone-event codec as the first
1938 // one on the list.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsDTMFOnTop)1939 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
1940 EXPECT_TRUE(SetupSendStream());
1941 cricket::AudioSendParameters parameters;
1942 parameters.codecs.push_back(kTelephoneEventCodec1);
1943 parameters.codecs.push_back(kOpusCodec);
1944 parameters.codecs.push_back(kPcmuCodec);
1945 parameters.codecs[0].id = 98; // DTMF
1946 parameters.codecs[1].id = 96;
1947 SetSendParameters(parameters);
1948 const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
1949 EXPECT_EQ(96, spec.payload_type);
1950 EXPECT_STRCASEEQ("OPUS", spec.format.name.c_str());
1951 SetSend(true);
1952 EXPECT_TRUE(channel_->CanInsertDtmf());
1953 }
1954
1955 // Test that CanInsertDtmf() is governed by the send flag
TEST_P(WebRtcVoiceEngineTestFake,DTMFControlledBySendFlag)1956 TEST_P(WebRtcVoiceEngineTestFake, DTMFControlledBySendFlag) {
1957 EXPECT_TRUE(SetupSendStream());
1958 cricket::AudioSendParameters parameters;
1959 parameters.codecs.push_back(kTelephoneEventCodec1);
1960 parameters.codecs.push_back(kPcmuCodec);
1961 parameters.codecs[0].id = 98; // DTMF
1962 parameters.codecs[1].id = 96;
1963 SetSendParameters(parameters);
1964 EXPECT_FALSE(channel_->CanInsertDtmf());
1965 SetSend(true);
1966 EXPECT_TRUE(channel_->CanInsertDtmf());
1967 SetSend(false);
1968 EXPECT_FALSE(channel_->CanInsertDtmf());
1969 }
1970
1971 // Test that payload type range is limited for telephone-event codec.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsDTMFPayloadTypeOutOfRange)1972 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
1973 EXPECT_TRUE(SetupSendStream());
1974 cricket::AudioSendParameters parameters;
1975 parameters.codecs.push_back(kTelephoneEventCodec2);
1976 parameters.codecs.push_back(kOpusCodec);
1977 parameters.codecs[0].id = 0; // DTMF
1978 parameters.codecs[1].id = 96;
1979 SetSendParameters(parameters);
1980 SetSend(true);
1981 EXPECT_TRUE(channel_->CanInsertDtmf());
1982 parameters.codecs[0].id = 128; // DTMF
1983 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1984 EXPECT_FALSE(channel_->CanInsertDtmf());
1985 parameters.codecs[0].id = 127;
1986 SetSendParameters(parameters);
1987 EXPECT_TRUE(channel_->CanInsertDtmf());
1988 parameters.codecs[0].id = -1; // DTMF
1989 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1990 EXPECT_FALSE(channel_->CanInsertDtmf());
1991 }
1992
1993 // Test that we can set send codecs even with CN codec as the first
1994 // one on the list.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCNOnTop)1995 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
1996 EXPECT_TRUE(SetupSendStream());
1997 cricket::AudioSendParameters parameters;
1998 parameters.codecs.push_back(kCn8000Codec);
1999 parameters.codecs.push_back(kPcmuCodec);
2000 parameters.codecs[0].id = 98; // narrowband CN
2001 SetSendParameters(parameters);
2002 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2003 EXPECT_EQ(0, send_codec_spec.payload_type);
2004 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2005 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
2006 }
2007
2008 // Test that we set VAD and DTMF types correctly as caller.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCNandDTMFAsCaller)2009 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
2010 EXPECT_TRUE(SetupSendStream());
2011 cricket::AudioSendParameters parameters;
2012 parameters.codecs.push_back(kPcmuCodec);
2013 parameters.codecs.push_back(kCn16000Codec);
2014 parameters.codecs.push_back(kCn8000Codec);
2015 parameters.codecs.push_back(kTelephoneEventCodec1);
2016 parameters.codecs[0].id = 96;
2017 parameters.codecs[2].id = 97; // narrowband CN
2018 parameters.codecs[3].id = 98; // DTMF
2019 SetSendParameters(parameters);
2020 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2021 EXPECT_EQ(96, send_codec_spec.payload_type);
2022 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2023 EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2024 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2025 SetSend(true);
2026 EXPECT_TRUE(channel_->CanInsertDtmf());
2027 }
2028
2029 // Test that we set VAD and DTMF types correctly as callee.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCNandDTMFAsCallee)2030 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
2031 EXPECT_TRUE(SetupChannel());
2032 cricket::AudioSendParameters parameters;
2033 parameters.codecs.push_back(kPcmuCodec);
2034 parameters.codecs.push_back(kCn16000Codec);
2035 parameters.codecs.push_back(kCn8000Codec);
2036 parameters.codecs.push_back(kTelephoneEventCodec2);
2037 parameters.codecs[0].id = 96;
2038 parameters.codecs[2].id = 97; // narrowband CN
2039 parameters.codecs[3].id = 98; // DTMF
2040 SetSendParameters(parameters);
2041 EXPECT_TRUE(
2042 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
2043
2044 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2045 EXPECT_EQ(96, send_codec_spec.payload_type);
2046 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2047 EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2048 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2049 SetSend(true);
2050 EXPECT_TRUE(channel_->CanInsertDtmf());
2051 }
2052
2053 // Test that we only apply VAD if we have a CN codec that matches the
2054 // send codec clockrate.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCNNoMatch)2055 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
2056 EXPECT_TRUE(SetupSendStream());
2057 cricket::AudioSendParameters parameters;
2058 // Set PCMU(8K) and CN(16K). VAD should not be activated.
2059 parameters.codecs.push_back(kPcmuCodec);
2060 parameters.codecs.push_back(kCn16000Codec);
2061 parameters.codecs[1].id = 97;
2062 SetSendParameters(parameters);
2063 {
2064 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2065 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2066 EXPECT_EQ(absl::nullopt, send_codec_spec.cng_payload_type);
2067 }
2068 // Set PCMU(8K) and CN(8K). VAD should be activated.
2069 parameters.codecs[1] = kCn8000Codec;
2070 SetSendParameters(parameters);
2071 {
2072 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2073 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2074 EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2075 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2076 }
2077 // Set OPUS(48K) and CN(8K). VAD should not be activated.
2078 parameters.codecs[0] = kOpusCodec;
2079 SetSendParameters(parameters);
2080 {
2081 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2082 EXPECT_STRCASEEQ("OPUS", send_codec_spec.format.name.c_str());
2083 EXPECT_EQ(absl::nullopt, send_codec_spec.cng_payload_type);
2084 }
2085 }
2086
2087 // Test that we perform case-insensitive matching of codec names.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsCaseInsensitive)2088 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
2089 EXPECT_TRUE(SetupSendStream());
2090 cricket::AudioSendParameters parameters;
2091 parameters.codecs.push_back(kPcmuCodec);
2092 parameters.codecs.push_back(kCn16000Codec);
2093 parameters.codecs.push_back(kCn8000Codec);
2094 parameters.codecs.push_back(kTelephoneEventCodec1);
2095 parameters.codecs[0].name = "PcMu";
2096 parameters.codecs[0].id = 96;
2097 parameters.codecs[2].id = 97; // narrowband CN
2098 parameters.codecs[3].id = 98; // DTMF
2099 SetSendParameters(parameters);
2100 const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
2101 EXPECT_EQ(96, send_codec_spec.payload_type);
2102 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2103 EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2104 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2105 SetSend(true);
2106 EXPECT_TRUE(channel_->CanInsertDtmf());
2107 }
2108
TEST_P(WebRtcVoiceEngineTestFake,SupportsTransportSequenceNumberHeaderExtension)2109 TEST_P(WebRtcVoiceEngineTestFake,
2110 SupportsTransportSequenceNumberHeaderExtension) {
2111 const std::vector<webrtc::RtpExtension> header_extensions =
2112 GetDefaultEnabledRtpHeaderExtensions(*engine_);
2113 EXPECT_THAT(header_extensions,
2114 Contains(::testing::Field(
2115 "uri", &RtpExtension::uri,
2116 webrtc::RtpExtension::kTransportSequenceNumberUri)));
2117 }
2118
2119 // Test support for audio level header extension.
TEST_P(WebRtcVoiceEngineTestFake,SendAudioLevelHeaderExtensions)2120 TEST_P(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2121 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
2122 }
TEST_P(WebRtcVoiceEngineTestFake,RecvAudioLevelHeaderExtensions)2123 TEST_P(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2124 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
2125 }
2126
2127 // Test support for transport sequence number header extension.
TEST_P(WebRtcVoiceEngineTestFake,SendTransportSequenceNumberHeaderExtensions)2128 TEST_P(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
2129 TestSetSendRtpHeaderExtensions(
2130 webrtc::RtpExtension::kTransportSequenceNumberUri);
2131 }
TEST_P(WebRtcVoiceEngineTestFake,RecvTransportSequenceNumberHeaderExtensions)2132 TEST_P(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
2133 TestSetRecvRtpHeaderExtensions(
2134 webrtc::RtpExtension::kTransportSequenceNumberUri);
2135 }
2136
2137 // Test that we can create a channel and start sending on it.
TEST_P(WebRtcVoiceEngineTestFake,Send)2138 TEST_P(WebRtcVoiceEngineTestFake, Send) {
2139 EXPECT_TRUE(SetupSendStream());
2140 SetSendParameters(send_parameters_);
2141 SetSend(true);
2142 EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2143 SetSend(false);
2144 EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2145 }
2146
2147 // Test that a channel will send if and only if it has a source and is enabled
2148 // for sending.
TEST_P(WebRtcVoiceEngineTestFake,SendStateWithAndWithoutSource)2149 TEST_P(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
2150 EXPECT_TRUE(SetupSendStream());
2151 SetSendParameters(send_parameters_);
2152 SetAudioSend(kSsrcX, true, nullptr);
2153 SetSend(true);
2154 EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2155 SetAudioSend(kSsrcX, true, &fake_source_);
2156 EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2157 SetAudioSend(kSsrcX, true, nullptr);
2158 EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2159 }
2160
2161 // Test that a channel is muted/unmuted.
TEST_P(WebRtcVoiceEngineTestFake,SendStateMuteUnmute)2162 TEST_P(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2163 EXPECT_TRUE(SetupSendStream());
2164 SetSendParameters(send_parameters_);
2165 EXPECT_FALSE(GetSendStream(kSsrcX).muted());
2166 SetAudioSend(kSsrcX, true, nullptr);
2167 EXPECT_FALSE(GetSendStream(kSsrcX).muted());
2168 SetAudioSend(kSsrcX, false, nullptr);
2169 EXPECT_TRUE(GetSendStream(kSsrcX).muted());
2170 }
2171
2172 // Test that SetSendParameters() does not alter a stream's send state.
TEST_P(WebRtcVoiceEngineTestFake,SendStateWhenStreamsAreRecreated)2173 TEST_P(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2174 EXPECT_TRUE(SetupSendStream());
2175 EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2176
2177 // Turn on sending.
2178 SetSend(true);
2179 EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2180
2181 // Changing RTP header extensions will recreate the AudioSendStream.
2182 send_parameters_.extensions.push_back(
2183 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
2184 SetSendParameters(send_parameters_);
2185 EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2186
2187 // Turn off sending.
2188 SetSend(false);
2189 EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2190
2191 // Changing RTP header extensions will recreate the AudioSendStream.
2192 send_parameters_.extensions.clear();
2193 SetSendParameters(send_parameters_);
2194 EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2195 }
2196
2197 // Test that we can create a channel and start playing out on it.
TEST_P(WebRtcVoiceEngineTestFake,Playout)2198 TEST_P(WebRtcVoiceEngineTestFake, Playout) {
2199 EXPECT_TRUE(SetupRecvStream());
2200 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2201 channel_->SetPlayout(true);
2202 EXPECT_TRUE(GetRecvStream(kSsrcX).started());
2203 channel_->SetPlayout(false);
2204 EXPECT_FALSE(GetRecvStream(kSsrcX).started());
2205 }
2206
2207 // Test that we can add and remove send streams.
TEST_P(WebRtcVoiceEngineTestFake,CreateAndDeleteMultipleSendStreams)2208 TEST_P(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2209 SetupForMultiSendStream();
2210
2211 // Set the global state for sending.
2212 SetSend(true);
2213
2214 for (uint32_t ssrc : kSsrcs4) {
2215 EXPECT_TRUE(
2216 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
2217 SetAudioSend(ssrc, true, &fake_source_);
2218 // Verify that we are in a sending state for all the created streams.
2219 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
2220 }
2221 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
2222
2223 // Delete the send streams.
2224 for (uint32_t ssrc : kSsrcs4) {
2225 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
2226 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
2227 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
2228 }
2229 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
2230 }
2231
2232 // Test SetSendCodecs correctly configure the codecs in all send streams.
TEST_P(WebRtcVoiceEngineTestFake,SetSendCodecsWithMultipleSendStreams)2233 TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2234 SetupForMultiSendStream();
2235
2236 // Create send streams.
2237 for (uint32_t ssrc : kSsrcs4) {
2238 EXPECT_TRUE(
2239 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
2240 }
2241
2242 cricket::AudioSendParameters parameters;
2243 // Set PCMU and CN(8K). VAD should be activated.
2244 parameters.codecs.push_back(kPcmuCodec);
2245 parameters.codecs.push_back(kCn8000Codec);
2246 parameters.codecs[1].id = 97;
2247 SetSendParameters(parameters);
2248
2249 // Verify PCMU and VAD are corrected configured on all send channels.
2250 for (uint32_t ssrc : kSsrcs4) {
2251 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2252 const auto& send_codec_spec =
2253 *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2254 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2255 EXPECT_EQ(1u, send_codec_spec.format.num_channels);
2256 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2257 }
2258
2259 // Change to PCMU(8K) and CN(16K).
2260 parameters.codecs[0] = kPcmuCodec;
2261 parameters.codecs[1] = kCn16000Codec;
2262 SetSendParameters(parameters);
2263 for (uint32_t ssrc : kSsrcs4) {
2264 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2265 const auto& send_codec_spec =
2266 *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2267 EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
2268 EXPECT_EQ(absl::nullopt, send_codec_spec.cng_payload_type);
2269 }
2270 }
2271
2272 // Test we can SetSend on all send streams correctly.
TEST_P(WebRtcVoiceEngineTestFake,SetSendWithMultipleSendStreams)2273 TEST_P(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2274 SetupForMultiSendStream();
2275
2276 // Create the send channels and they should be a "not sending" date.
2277 for (uint32_t ssrc : kSsrcs4) {
2278 EXPECT_TRUE(
2279 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
2280 SetAudioSend(ssrc, true, &fake_source_);
2281 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
2282 }
2283
2284 // Set the global state for starting sending.
2285 SetSend(true);
2286 for (uint32_t ssrc : kSsrcs4) {
2287 // Verify that we are in a sending state for all the send streams.
2288 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
2289 }
2290
2291 // Set the global state for stopping sending.
2292 SetSend(false);
2293 for (uint32_t ssrc : kSsrcs4) {
2294 // Verify that we are in a stop state for all the send streams.
2295 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
2296 }
2297 }
2298
2299 // Test we can set the correct statistics on all send streams.
TEST_P(WebRtcVoiceEngineTestFake,GetStatsWithMultipleSendStreams)2300 TEST_P(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2301 SetupForMultiSendStream();
2302
2303 // Create send streams.
2304 for (uint32_t ssrc : kSsrcs4) {
2305 EXPECT_TRUE(
2306 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
2307 }
2308
2309 // Create a receive stream to check that none of the send streams end up in
2310 // the receive stream stats.
2311 EXPECT_TRUE(AddRecvStream(kSsrcY));
2312
2313 // We need send codec to be set to get all stats.
2314 SetSendParameters(send_parameters_);
2315 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2316 SetAudioSendStreamStats();
2317
2318 // Check stats for the added streams.
2319 {
2320 EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2321 cricket::VoiceMediaInfo info;
2322 EXPECT_EQ(true,
2323 channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2324
2325 // We have added 4 send streams. We should see empty stats for all.
2326 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
2327 for (const auto& sender : info.senders) {
2328 VerifyVoiceSenderInfo(sender, false);
2329 }
2330 VerifyVoiceSendRecvCodecs(info);
2331
2332 // We have added one receive stream. We should see empty stats.
2333 EXPECT_EQ(info.receivers.size(), 1u);
2334 EXPECT_EQ(info.receivers[0].ssrc(), 0u);
2335 }
2336
2337 // Remove the kSsrcY stream. No receiver stats.
2338 {
2339 cricket::VoiceMediaInfo info;
2340 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
2341 EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2342 EXPECT_EQ(true,
2343 channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2344 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
2345 EXPECT_EQ(0u, info.receivers.size());
2346 }
2347
2348 // Deliver a new packet - a default receive stream should be created and we
2349 // should see stats again.
2350 {
2351 cricket::VoiceMediaInfo info;
2352 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2353 SetAudioReceiveStreamStats();
2354 EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2355 EXPECT_EQ(true,
2356 channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2357 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
2358 EXPECT_EQ(1u, info.receivers.size());
2359 VerifyVoiceReceiverInfo(info.receivers[0]);
2360 VerifyVoiceSendRecvCodecs(info);
2361 }
2362 }
2363
2364 // Test that we can add and remove receive streams, and do proper send/playout.
2365 // We can receive on multiple streams while sending one stream.
TEST_P(WebRtcVoiceEngineTestFake,PlayoutWithMultipleStreams)2366 TEST_P(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
2367 EXPECT_TRUE(SetupSendStream());
2368
2369 // Start playout without a receive stream.
2370 SetSendParameters(send_parameters_);
2371 channel_->SetPlayout(true);
2372
2373 // Adding another stream should enable playout on the new stream only.
2374 EXPECT_TRUE(AddRecvStream(kSsrcY));
2375 SetSend(true);
2376 EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
2377
2378 // Make sure only the new stream is played out.
2379 EXPECT_TRUE(GetRecvStream(kSsrcY).started());
2380
2381 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2382 EXPECT_TRUE(AddRecvStream(kSsrcZ));
2383 EXPECT_TRUE(GetRecvStream(kSsrcY).started());
2384 EXPECT_TRUE(GetRecvStream(kSsrcZ).started());
2385
2386 // Stop sending.
2387 SetSend(false);
2388 EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
2389
2390 // Stop playout.
2391 channel_->SetPlayout(false);
2392 EXPECT_FALSE(GetRecvStream(kSsrcY).started());
2393 EXPECT_FALSE(GetRecvStream(kSsrcZ).started());
2394
2395 // Restart playout and make sure recv streams are played out.
2396 channel_->SetPlayout(true);
2397 EXPECT_TRUE(GetRecvStream(kSsrcY).started());
2398 EXPECT_TRUE(GetRecvStream(kSsrcZ).started());
2399
2400 // Now remove the recv streams.
2401 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcZ));
2402 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
2403 }
2404
TEST_P(WebRtcVoiceEngineTestFake,SetAudioNetworkAdaptorViaOptions)2405 TEST_P(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2406 EXPECT_TRUE(SetupSendStream());
2407 send_parameters_.options.audio_network_adaptor = true;
2408 send_parameters_.options.audio_network_adaptor_config = {"1234"};
2409 SetSendParameters(send_parameters_);
2410 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2411 GetAudioNetworkAdaptorConfig(kSsrcX));
2412 }
2413
TEST_P(WebRtcVoiceEngineTestFake,AudioSendResetAudioNetworkAdaptor)2414 TEST_P(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2415 EXPECT_TRUE(SetupSendStream());
2416 send_parameters_.options.audio_network_adaptor = true;
2417 send_parameters_.options.audio_network_adaptor_config = {"1234"};
2418 SetSendParameters(send_parameters_);
2419 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2420 GetAudioNetworkAdaptorConfig(kSsrcX));
2421 cricket::AudioOptions options;
2422 options.audio_network_adaptor = false;
2423 SetAudioSend(kSsrcX, true, nullptr, &options);
2424 EXPECT_EQ(absl::nullopt, GetAudioNetworkAdaptorConfig(kSsrcX));
2425 }
2426
TEST_P(WebRtcVoiceEngineTestFake,AudioNetworkAdaptorNotGetOverridden)2427 TEST_P(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2428 EXPECT_TRUE(SetupSendStream());
2429 send_parameters_.options.audio_network_adaptor = true;
2430 send_parameters_.options.audio_network_adaptor_config = {"1234"};
2431 SetSendParameters(send_parameters_);
2432 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2433 GetAudioNetworkAdaptorConfig(kSsrcX));
2434 const int initial_num = call_.GetNumCreatedSendStreams();
2435 cricket::AudioOptions options;
2436 options.audio_network_adaptor = absl::nullopt;
2437 // Unvalued `options.audio_network_adaptor` should not reset audio network
2438 // adaptor.
2439 SetAudioSend(kSsrcX, true, nullptr, &options);
2440 // AudioSendStream not expected to be recreated.
2441 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2442 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2443 GetAudioNetworkAdaptorConfig(kSsrcX));
2444 }
2445
2446 // Test that we can set the outgoing SSRC properly.
2447 // SSRC is set in SetupSendStream() by calling AddSendStream.
TEST_P(WebRtcVoiceEngineTestFake,SetSendSsrc)2448 TEST_P(WebRtcVoiceEngineTestFake, SetSendSsrc) {
2449 EXPECT_TRUE(SetupSendStream());
2450 EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
2451 }
2452
TEST_P(WebRtcVoiceEngineTestFake,GetStats)2453 TEST_P(WebRtcVoiceEngineTestFake, GetStats) {
2454 // Setup. We need send codec to be set to get all stats.
2455 EXPECT_TRUE(SetupSendStream());
2456 // SetupSendStream adds a send stream with kSsrcX, so the receive
2457 // stream has to use a different SSRC.
2458 EXPECT_TRUE(AddRecvStream(kSsrcY));
2459 SetSendParameters(send_parameters_);
2460 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2461 SetAudioSendStreamStats();
2462
2463 // Check stats for the added streams.
2464 {
2465 EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2466 cricket::VoiceMediaInfo info;
2467 EXPECT_EQ(true,
2468 channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2469
2470 // We have added one send stream. We should see the stats we've set.
2471 EXPECT_EQ(1u, info.senders.size());
2472 VerifyVoiceSenderInfo(info.senders[0], false);
2473 // We have added one receive stream. We should see empty stats.
2474 EXPECT_EQ(info.receivers.size(), 1u);
2475 EXPECT_EQ(info.receivers[0].ssrc(), 0u);
2476 }
2477
2478 // Start sending - this affects some reported stats.
2479 {
2480 cricket::VoiceMediaInfo info;
2481 SetSend(true);
2482 EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2483 EXPECT_EQ(true,
2484 channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2485 VerifyVoiceSenderInfo(info.senders[0], true);
2486 VerifyVoiceSendRecvCodecs(info);
2487 }
2488
2489 // Remove the kSsrcY stream. No receiver stats.
2490 {
2491 cricket::VoiceMediaInfo info;
2492 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
2493 EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2494 EXPECT_EQ(true,
2495 channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2496 EXPECT_EQ(1u, info.senders.size());
2497 EXPECT_EQ(0u, info.receivers.size());
2498 }
2499
2500 // Deliver a new packet - a default receive stream should be created and we
2501 // should see stats again.
2502 {
2503 cricket::VoiceMediaInfo info;
2504 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2505 SetAudioReceiveStreamStats();
2506 EXPECT_CALL(*adm_, GetPlayoutUnderrunCount()).WillOnce(Return(0));
2507 EXPECT_EQ(true,
2508 channel_->GetStats(&info, /*get_and_clear_legacy_stats=*/true));
2509 EXPECT_EQ(1u, info.senders.size());
2510 EXPECT_EQ(1u, info.receivers.size());
2511 VerifyVoiceReceiverInfo(info.receivers[0]);
2512 VerifyVoiceSendRecvCodecs(info);
2513 }
2514 }
2515
2516 // Test that we can set the outgoing SSRC properly with multiple streams.
2517 // SSRC is set in SetupSendStream() by calling AddSendStream.
TEST_P(WebRtcVoiceEngineTestFake,SetSendSsrcWithMultipleStreams)2518 TEST_P(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
2519 EXPECT_TRUE(SetupSendStream());
2520 EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
2521 EXPECT_TRUE(AddRecvStream(kSsrcY));
2522 EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
2523 }
2524
2525 // Test that the local SSRC is the same on sending and receiving channels if the
2526 // receive channel is created before the send channel.
TEST_P(WebRtcVoiceEngineTestFake,SetSendSsrcAfterCreatingReceiveChannel)2527 TEST_P(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
2528 EXPECT_TRUE(SetupChannel());
2529 EXPECT_TRUE(AddRecvStream(kSsrcY));
2530 EXPECT_TRUE(
2531 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
2532 EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
2533 EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
2534 }
2535
2536 // Test that we can properly receive packets.
TEST_P(WebRtcVoiceEngineTestFake,Recv)2537 TEST_P(WebRtcVoiceEngineTestFake, Recv) {
2538 EXPECT_TRUE(SetupChannel());
2539 EXPECT_TRUE(AddRecvStream(1));
2540 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2541
2542 EXPECT_TRUE(
2543 GetRecvStream(1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2544 }
2545
2546 // Test that we can properly receive packets on multiple streams.
TEST_P(WebRtcVoiceEngineTestFake,RecvWithMultipleStreams)2547 TEST_P(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
2548 EXPECT_TRUE(SetupChannel());
2549 const uint32_t ssrc1 = 1;
2550 const uint32_t ssrc2 = 2;
2551 const uint32_t ssrc3 = 3;
2552 EXPECT_TRUE(AddRecvStream(ssrc1));
2553 EXPECT_TRUE(AddRecvStream(ssrc2));
2554 EXPECT_TRUE(AddRecvStream(ssrc3));
2555 // Create packets with the right SSRCs.
2556 unsigned char packets[4][sizeof(kPcmuFrame)];
2557 for (size_t i = 0; i < arraysize(packets); ++i) {
2558 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
2559 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
2560 }
2561
2562 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2563 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2564 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2565
2566 EXPECT_EQ(s1.received_packets(), 0);
2567 EXPECT_EQ(s2.received_packets(), 0);
2568 EXPECT_EQ(s3.received_packets(), 0);
2569
2570 DeliverPacket(packets[0], sizeof(packets[0]));
2571 EXPECT_EQ(s1.received_packets(), 0);
2572 EXPECT_EQ(s2.received_packets(), 0);
2573 EXPECT_EQ(s3.received_packets(), 0);
2574
2575 DeliverPacket(packets[1], sizeof(packets[1]));
2576 EXPECT_EQ(s1.received_packets(), 1);
2577 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2578 EXPECT_EQ(s2.received_packets(), 0);
2579 EXPECT_EQ(s3.received_packets(), 0);
2580
2581 DeliverPacket(packets[2], sizeof(packets[2]));
2582 EXPECT_EQ(s1.received_packets(), 1);
2583 EXPECT_EQ(s2.received_packets(), 1);
2584 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2585 EXPECT_EQ(s3.received_packets(), 0);
2586
2587 DeliverPacket(packets[3], sizeof(packets[3]));
2588 EXPECT_EQ(s1.received_packets(), 1);
2589 EXPECT_EQ(s2.received_packets(), 1);
2590 EXPECT_EQ(s3.received_packets(), 1);
2591 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
2592
2593 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2594 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2595 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
2596 }
2597
2598 // Test that receiving on an unsignaled stream works (a stream is created).
TEST_P(WebRtcVoiceEngineTestFake,RecvUnsignaled)2599 TEST_P(WebRtcVoiceEngineTestFake, RecvUnsignaled) {
2600 EXPECT_TRUE(SetupChannel());
2601 EXPECT_EQ(0u, call_.GetAudioReceiveStreams().size());
2602
2603 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2604
2605 EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2606 EXPECT_TRUE(
2607 GetRecvStream(kSsrc1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2608 }
2609
2610 // Tests that when we add a stream without SSRCs, but contains a stream_id
2611 // that it is stored and its stream id is later used when the first packet
2612 // arrives to properly create a receive stream with a sync label.
TEST_P(WebRtcVoiceEngineTestFake,RecvUnsignaledSsrcWithSignaledStreamId)2613 TEST_P(WebRtcVoiceEngineTestFake, RecvUnsignaledSsrcWithSignaledStreamId) {
2614 const char kSyncLabel[] = "sync_label";
2615 EXPECT_TRUE(SetupChannel());
2616 cricket::StreamParams unsignaled_stream;
2617 unsignaled_stream.set_stream_ids({kSyncLabel});
2618 ASSERT_TRUE(channel_->AddRecvStream(unsignaled_stream));
2619 // The stream shouldn't have been created at this point because it doesn't
2620 // have any SSRCs.
2621 EXPECT_EQ(0u, call_.GetAudioReceiveStreams().size());
2622
2623 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2624
2625 EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2626 EXPECT_TRUE(
2627 GetRecvStream(kSsrc1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2628 EXPECT_EQ(kSyncLabel, GetRecvStream(kSsrc1).GetConfig().sync_group);
2629
2630 // Remset the unsignaled stream to clear the cached parameters. If a new
2631 // default unsignaled receive stream is created it will not have a sync group.
2632 channel_->ResetUnsignaledRecvStream();
2633 channel_->RemoveRecvStream(kSsrc1);
2634
2635 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2636
2637 EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2638 EXPECT_TRUE(
2639 GetRecvStream(kSsrc1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2640 EXPECT_TRUE(GetRecvStream(kSsrc1).GetConfig().sync_group.empty());
2641 }
2642
TEST_P(WebRtcVoiceEngineTestFake,ResetUnsignaledRecvStreamDeletesAllDefaultStreams)2643 TEST_P(WebRtcVoiceEngineTestFake,
2644 ResetUnsignaledRecvStreamDeletesAllDefaultStreams) {
2645 ASSERT_TRUE(SetupChannel());
2646 // No receive streams to start with.
2647 ASSERT_TRUE(call_.GetAudioReceiveStreams().empty());
2648
2649 // Deliver a couple packets with unsignaled SSRCs.
2650 unsigned char packet[sizeof(kPcmuFrame)];
2651 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2652 rtc::SetBE32(&packet[8], 0x1234);
2653 DeliverPacket(packet, sizeof(packet));
2654 rtc::SetBE32(&packet[8], 0x5678);
2655 DeliverPacket(packet, sizeof(packet));
2656
2657 // Verify that the receive streams were created.
2658 const auto& receivers1 = call_.GetAudioReceiveStreams();
2659 ASSERT_EQ(receivers1.size(), 2u);
2660
2661 // Should remove all default streams.
2662 channel_->ResetUnsignaledRecvStream();
2663 const auto& receivers2 = call_.GetAudioReceiveStreams();
2664 EXPECT_EQ(0u, receivers2.size());
2665 }
2666
2667 // Test that receiving N unsignaled stream works (streams will be created), and
2668 // that packets are forwarded to them all.
TEST_P(WebRtcVoiceEngineTestFake,RecvMultipleUnsignaled)2669 TEST_P(WebRtcVoiceEngineTestFake, RecvMultipleUnsignaled) {
2670 EXPECT_TRUE(SetupChannel());
2671 unsigned char packet[sizeof(kPcmuFrame)];
2672 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2673
2674 // Note that SSRC = 0 is not supported.
2675 for (uint32_t ssrc = 1; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc) {
2676 rtc::SetBE32(&packet[8], ssrc);
2677 DeliverPacket(packet, sizeof(packet));
2678
2679 // Verify we have one new stream for each loop iteration.
2680 EXPECT_EQ(ssrc, call_.GetAudioReceiveStreams().size());
2681 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2682 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
2683 }
2684
2685 // Sending on the same SSRCs again should not create new streams.
2686 for (uint32_t ssrc = 1; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc) {
2687 rtc::SetBE32(&packet[8], ssrc);
2688 DeliverPacket(packet, sizeof(packet));
2689
2690 EXPECT_EQ(kMaxUnsignaledRecvStreams, call_.GetAudioReceiveStreams().size());
2691 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2692 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
2693 }
2694
2695 // Send on another SSRC, the oldest unsignaled stream (SSRC=1) is replaced.
2696 constexpr uint32_t kAnotherSsrc = 667;
2697 rtc::SetBE32(&packet[8], kAnotherSsrc);
2698 DeliverPacket(packet, sizeof(packet));
2699
2700 const auto& streams = call_.GetAudioReceiveStreams();
2701 EXPECT_EQ(kMaxUnsignaledRecvStreams, streams.size());
2702 size_t i = 0;
2703 for (uint32_t ssrc = 2; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc, ++i) {
2704 EXPECT_EQ(ssrc, streams[i]->GetConfig().rtp.remote_ssrc);
2705 EXPECT_EQ(2, streams[i]->received_packets());
2706 }
2707 EXPECT_EQ(kAnotherSsrc, streams[i]->GetConfig().rtp.remote_ssrc);
2708 EXPECT_EQ(1, streams[i]->received_packets());
2709 // Sanity check that we've checked all streams.
2710 EXPECT_EQ(kMaxUnsignaledRecvStreams, (i + 1));
2711 }
2712
2713 // Test that a default channel is created even after a signaled stream has been
2714 // added, and that this stream will get any packets for unknown SSRCs.
TEST_P(WebRtcVoiceEngineTestFake,RecvUnsignaledAfterSignaled)2715 TEST_P(WebRtcVoiceEngineTestFake, RecvUnsignaledAfterSignaled) {
2716 EXPECT_TRUE(SetupChannel());
2717 unsigned char packet[sizeof(kPcmuFrame)];
2718 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2719
2720 // Add a known stream, send packet and verify we got it.
2721 const uint32_t signaled_ssrc = 1;
2722 rtc::SetBE32(&packet[8], signaled_ssrc);
2723 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
2724 DeliverPacket(packet, sizeof(packet));
2725 EXPECT_TRUE(
2726 GetRecvStream(signaled_ssrc).VerifyLastPacket(packet, sizeof(packet)));
2727 EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2728
2729 // Note that the first unknown SSRC cannot be 0, because we only support
2730 // creating receive streams for SSRC!=0.
2731 const uint32_t unsignaled_ssrc = 7011;
2732 rtc::SetBE32(&packet[8], unsignaled_ssrc);
2733 DeliverPacket(packet, sizeof(packet));
2734 EXPECT_TRUE(
2735 GetRecvStream(unsignaled_ssrc).VerifyLastPacket(packet, sizeof(packet)));
2736 EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
2737
2738 DeliverPacket(packet, sizeof(packet));
2739 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2740
2741 rtc::SetBE32(&packet[8], signaled_ssrc);
2742 DeliverPacket(packet, sizeof(packet));
2743 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2744 EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
2745 }
2746
2747 // Two tests to verify that adding a receive stream with the same SSRC as a
2748 // previously added unsignaled stream will only recreate underlying stream
2749 // objects if the stream parameters have changed.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStreamAfterUnsignaled_NoRecreate)2750 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStreamAfterUnsignaled_NoRecreate) {
2751 EXPECT_TRUE(SetupChannel());
2752
2753 // Spawn unsignaled stream with SSRC=1.
2754 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2755 EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2756 EXPECT_TRUE(
2757 GetRecvStream(1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2758
2759 // Verify that the underlying stream object in Call is not recreated when a
2760 // stream with SSRC=1 is added.
2761 const auto& streams = call_.GetAudioReceiveStreams();
2762 EXPECT_EQ(1u, streams.size());
2763 int audio_receive_stream_id = streams.front()->id();
2764 EXPECT_TRUE(AddRecvStream(1));
2765 EXPECT_EQ(1u, streams.size());
2766 EXPECT_EQ(audio_receive_stream_id, streams.front()->id());
2767 }
2768
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStreamAfterUnsignaled_Updates)2769 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStreamAfterUnsignaled_Updates) {
2770 EXPECT_TRUE(SetupChannel());
2771
2772 // Spawn unsignaled stream with SSRC=1.
2773 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2774 EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
2775 EXPECT_TRUE(
2776 GetRecvStream(1).VerifyLastPacket(kPcmuFrame, sizeof(kPcmuFrame)));
2777
2778 // Verify that the underlying stream object in Call gets updated when a
2779 // stream with SSRC=1 is added, and which has changed stream parameters.
2780 const auto& streams = call_.GetAudioReceiveStreams();
2781 EXPECT_EQ(1u, streams.size());
2782 // The sync_group id should be empty.
2783 EXPECT_TRUE(streams.front()->GetConfig().sync_group.empty());
2784
2785 const std::string new_stream_id("stream_id");
2786 int audio_receive_stream_id = streams.front()->id();
2787 cricket::StreamParams stream_params;
2788 stream_params.ssrcs.push_back(1);
2789 stream_params.set_stream_ids({new_stream_id});
2790
2791 EXPECT_TRUE(channel_->AddRecvStream(stream_params));
2792 EXPECT_EQ(1u, streams.size());
2793 // The audio receive stream should not have been recreated.
2794 EXPECT_EQ(audio_receive_stream_id, streams.front()->id());
2795
2796 // The sync_group id should now match with the new stream params.
2797 EXPECT_EQ(new_stream_id, streams.front()->GetConfig().sync_group);
2798 }
2799
2800 // Test that AddRecvStream creates new stream.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStream)2801 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStream) {
2802 EXPECT_TRUE(SetupRecvStream());
2803 EXPECT_TRUE(AddRecvStream(1));
2804 }
2805
2806 // Test that after adding a recv stream, we do not decode more codecs than
2807 // those previously passed into SetRecvCodecs.
TEST_P(WebRtcVoiceEngineTestFake,AddRecvStreamUnsupportedCodec)2808 TEST_P(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
2809 EXPECT_TRUE(SetupSendStream());
2810 cricket::AudioRecvParameters parameters;
2811 parameters.codecs.push_back(kOpusCodec);
2812 parameters.codecs.push_back(kPcmuCodec);
2813 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
2814 EXPECT_TRUE(AddRecvStream(kSsrcX));
2815 EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
2816 (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
2817 {{0, {"PCMU", 8000, 1}}, {111, {"OPUS", 48000, 2}}})));
2818 }
2819
2820 // Test that we properly clean up any streams that were added, even if
2821 // not explicitly removed.
TEST_P(WebRtcVoiceEngineTestFake,StreamCleanup)2822 TEST_P(WebRtcVoiceEngineTestFake, StreamCleanup) {
2823 EXPECT_TRUE(SetupSendStream());
2824 SetSendParameters(send_parameters_);
2825 EXPECT_TRUE(AddRecvStream(1));
2826 EXPECT_TRUE(AddRecvStream(2));
2827
2828 EXPECT_EQ(1u, call_.GetAudioSendStreams().size());
2829 EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
2830 delete channel_;
2831 channel_ = NULL;
2832 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
2833 EXPECT_EQ(0u, call_.GetAudioReceiveStreams().size());
2834 }
2835
TEST_P(WebRtcVoiceEngineTestFake,TestAddRecvStreamSuccessWithZeroSsrc)2836 TEST_P(WebRtcVoiceEngineTestFake, TestAddRecvStreamSuccessWithZeroSsrc) {
2837 EXPECT_TRUE(SetupSendStream());
2838 EXPECT_TRUE(AddRecvStream(0));
2839 }
2840
TEST_P(WebRtcVoiceEngineTestFake,TestAddRecvStreamFailWithSameSsrc)2841 TEST_P(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithSameSsrc) {
2842 EXPECT_TRUE(SetupChannel());
2843 EXPECT_TRUE(AddRecvStream(1));
2844 EXPECT_FALSE(AddRecvStream(1));
2845 }
2846
2847 // Test the InsertDtmf on default send stream as caller.
TEST_P(WebRtcVoiceEngineTestFake,InsertDtmfOnDefaultSendStreamAsCaller)2848 TEST_P(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2849 TestInsertDtmf(0, true, kTelephoneEventCodec1);
2850 }
2851
2852 // Test the InsertDtmf on default send stream as callee
TEST_P(WebRtcVoiceEngineTestFake,InsertDtmfOnDefaultSendStreamAsCallee)2853 TEST_P(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2854 TestInsertDtmf(0, false, kTelephoneEventCodec2);
2855 }
2856
2857 // Test the InsertDtmf on specified send stream as caller.
TEST_P(WebRtcVoiceEngineTestFake,InsertDtmfOnSendStreamAsCaller)2858 TEST_P(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2859 TestInsertDtmf(kSsrcX, true, kTelephoneEventCodec2);
2860 }
2861
2862 // Test the InsertDtmf on specified send stream as callee.
TEST_P(WebRtcVoiceEngineTestFake,InsertDtmfOnSendStreamAsCallee)2863 TEST_P(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2864 TestInsertDtmf(kSsrcX, false, kTelephoneEventCodec1);
2865 }
2866
2867 // Test propagation of extmap allow mixed setting.
TEST_P(WebRtcVoiceEngineTestFake,SetExtmapAllowMixedAsCaller)2868 TEST_P(WebRtcVoiceEngineTestFake, SetExtmapAllowMixedAsCaller) {
2869 TestExtmapAllowMixedCaller(/*extmap_allow_mixed=*/true);
2870 }
TEST_P(WebRtcVoiceEngineTestFake,SetExtmapAllowMixedDisabledAsCaller)2871 TEST_P(WebRtcVoiceEngineTestFake, SetExtmapAllowMixedDisabledAsCaller) {
2872 TestExtmapAllowMixedCaller(/*extmap_allow_mixed=*/false);
2873 }
TEST_P(WebRtcVoiceEngineTestFake,SetExtmapAllowMixedAsCallee)2874 TEST_P(WebRtcVoiceEngineTestFake, SetExtmapAllowMixedAsCallee) {
2875 TestExtmapAllowMixedCallee(/*extmap_allow_mixed=*/true);
2876 }
TEST_P(WebRtcVoiceEngineTestFake,SetExtmapAllowMixedDisabledAsCallee)2877 TEST_P(WebRtcVoiceEngineTestFake, SetExtmapAllowMixedDisabledAsCallee) {
2878 TestExtmapAllowMixedCallee(/*extmap_allow_mixed=*/false);
2879 }
2880
TEST_P(WebRtcVoiceEngineTestFake,SetAudioOptions)2881 TEST_P(WebRtcVoiceEngineTestFake, SetAudioOptions) {
2882 EXPECT_TRUE(SetupSendStream());
2883 EXPECT_TRUE(AddRecvStream(kSsrcY));
2884 EXPECT_CALL(*adm_, BuiltInAECIsAvailable())
2885 .Times(8)
2886 .WillRepeatedly(Return(false));
2887 EXPECT_CALL(*adm_, BuiltInAGCIsAvailable())
2888 .Times(4)
2889 .WillRepeatedly(Return(false));
2890 EXPECT_CALL(*adm_, BuiltInNSIsAvailable())
2891 .Times(2)
2892 .WillRepeatedly(Return(false));
2893
2894 EXPECT_EQ(200u, GetRecvStreamConfig(kSsrcY).jitter_buffer_max_packets);
2895 EXPECT_FALSE(GetRecvStreamConfig(kSsrcY).jitter_buffer_fast_accelerate);
2896
2897 // Nothing set in AudioOptions, so everything should be as default.
2898 send_parameters_.options = cricket::AudioOptions();
2899 SetSendParameters(send_parameters_);
2900 if (!use_null_apm_) {
2901 VerifyEchoCancellationSettings(/*enabled=*/true);
2902 EXPECT_TRUE(IsHighPassFilterEnabled());
2903 }
2904 EXPECT_EQ(200u, GetRecvStreamConfig(kSsrcY).jitter_buffer_max_packets);
2905 EXPECT_FALSE(GetRecvStreamConfig(kSsrcY).jitter_buffer_fast_accelerate);
2906
2907 // Turn echo cancellation off
2908 send_parameters_.options.echo_cancellation = false;
2909 SetSendParameters(send_parameters_);
2910 if (!use_null_apm_) {
2911 VerifyEchoCancellationSettings(/*enabled=*/false);
2912 }
2913
2914 // Turn echo cancellation back on, with settings, and make sure
2915 // nothing else changed.
2916 send_parameters_.options.echo_cancellation = true;
2917 SetSendParameters(send_parameters_);
2918 if (!use_null_apm_) {
2919 VerifyEchoCancellationSettings(/*enabled=*/true);
2920 }
2921
2922 // Turn off echo cancellation and delay agnostic aec.
2923 send_parameters_.options.echo_cancellation = false;
2924 SetSendParameters(send_parameters_);
2925 if (!use_null_apm_) {
2926 VerifyEchoCancellationSettings(/*enabled=*/false);
2927 }
2928
2929 // Restore AEC to be on to work with the following tests.
2930 send_parameters_.options.echo_cancellation = true;
2931 SetSendParameters(send_parameters_);
2932
2933 // Turn off AGC
2934 send_parameters_.options.auto_gain_control = false;
2935 SetSendParameters(send_parameters_);
2936 if (!use_null_apm_) {
2937 VerifyEchoCancellationSettings(/*enabled=*/true);
2938 EXPECT_FALSE(apm_config_.gain_controller1.enabled);
2939 }
2940
2941 // Turn AGC back on
2942 send_parameters_.options.auto_gain_control = true;
2943 SetSendParameters(send_parameters_);
2944 if (!use_null_apm_) {
2945 VerifyEchoCancellationSettings(/*enabled=*/true);
2946 EXPECT_TRUE(apm_config_.gain_controller1.enabled);
2947 }
2948
2949 // Turn off other options.
2950 send_parameters_.options.noise_suppression = false;
2951 send_parameters_.options.highpass_filter = false;
2952 send_parameters_.options.stereo_swapping = true;
2953 SetSendParameters(send_parameters_);
2954 if (!use_null_apm_) {
2955 VerifyEchoCancellationSettings(/*enabled=*/true);
2956 EXPECT_FALSE(IsHighPassFilterEnabled());
2957 EXPECT_TRUE(apm_config_.gain_controller1.enabled);
2958 EXPECT_FALSE(apm_config_.noise_suppression.enabled);
2959 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
2960 }
2961
2962 // Set options again to ensure it has no impact.
2963 SetSendParameters(send_parameters_);
2964 if (!use_null_apm_) {
2965 VerifyEchoCancellationSettings(/*enabled=*/true);
2966 EXPECT_TRUE(apm_config_.gain_controller1.enabled);
2967 EXPECT_FALSE(apm_config_.noise_suppression.enabled);
2968 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
2969 }
2970 }
2971
TEST_P(WebRtcVoiceEngineTestFake,InitRecordingOnSend)2972 TEST_P(WebRtcVoiceEngineTestFake, InitRecordingOnSend) {
2973 EXPECT_CALL(*adm_, RecordingIsInitialized()).WillOnce(Return(false));
2974 EXPECT_CALL(*adm_, Recording()).WillOnce(Return(false));
2975 EXPECT_CALL(*adm_, InitRecording()).Times(1);
2976
2977 std::unique_ptr<cricket::VoiceMediaChannel> channel(
2978 engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
2979 cricket::AudioOptions(),
2980 webrtc::CryptoOptions()));
2981
2982 channel->SetSend(true);
2983 }
2984
TEST_P(WebRtcVoiceEngineTestFake,SkipInitRecordingOnSend)2985 TEST_P(WebRtcVoiceEngineTestFake, SkipInitRecordingOnSend) {
2986 EXPECT_CALL(*adm_, RecordingIsInitialized()).Times(0);
2987 EXPECT_CALL(*adm_, Recording()).Times(0);
2988 EXPECT_CALL(*adm_, InitRecording()).Times(0);
2989
2990 cricket::AudioOptions options;
2991 options.init_recording_on_send = false;
2992
2993 std::unique_ptr<cricket::VoiceMediaChannel> channel(
2994 engine_->CreateMediaChannel(&call_, cricket::MediaConfig(), options,
2995 webrtc::CryptoOptions()));
2996
2997 channel->SetSend(true);
2998 }
2999
TEST_P(WebRtcVoiceEngineTestFake,SetOptionOverridesViaChannels)3000 TEST_P(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
3001 EXPECT_TRUE(SetupSendStream());
3002 EXPECT_CALL(*adm_, BuiltInAECIsAvailable())
3003 .Times(use_null_apm_ ? 4 : 8)
3004 .WillRepeatedly(Return(false));
3005 EXPECT_CALL(*adm_, BuiltInAGCIsAvailable())
3006 .Times(use_null_apm_ ? 7 : 8)
3007 .WillRepeatedly(Return(false));
3008 EXPECT_CALL(*adm_, BuiltInNSIsAvailable())
3009 .Times(use_null_apm_ ? 5 : 8)
3010 .WillRepeatedly(Return(false));
3011 EXPECT_CALL(*adm_, RecordingIsInitialized())
3012 .Times(2)
3013 .WillRepeatedly(Return(false));
3014
3015 EXPECT_CALL(*adm_, Recording()).Times(2).WillRepeatedly(Return(false));
3016 EXPECT_CALL(*adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
3017
3018 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
3019 static_cast<cricket::WebRtcVoiceMediaChannel*>(
3020 engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
3021 cricket::AudioOptions(),
3022 webrtc::CryptoOptions())));
3023 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
3024 static_cast<cricket::WebRtcVoiceMediaChannel*>(
3025 engine_->CreateMediaChannel(&call_, cricket::MediaConfig(),
3026 cricket::AudioOptions(),
3027 webrtc::CryptoOptions())));
3028
3029 // Have to add a stream to make SetSend work.
3030 cricket::StreamParams stream1;
3031 stream1.ssrcs.push_back(1);
3032 channel1->AddSendStream(stream1);
3033 cricket::StreamParams stream2;
3034 stream2.ssrcs.push_back(2);
3035 channel2->AddSendStream(stream2);
3036
3037 // AEC and AGC and NS
3038 cricket::AudioSendParameters parameters_options_all = send_parameters_;
3039 parameters_options_all.options.echo_cancellation = true;
3040 parameters_options_all.options.auto_gain_control = true;
3041 parameters_options_all.options.noise_suppression = true;
3042 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
3043 if (!use_null_apm_) {
3044 VerifyEchoCancellationSettings(/*enabled=*/true);
3045 VerifyGainControlEnabledCorrectly();
3046 EXPECT_TRUE(apm_config_.noise_suppression.enabled);
3047 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3048 EXPECT_EQ(parameters_options_all.options, channel1->options());
3049 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
3050 VerifyEchoCancellationSettings(/*enabled=*/true);
3051 VerifyGainControlEnabledCorrectly();
3052 EXPECT_EQ(parameters_options_all.options, channel2->options());
3053 }
3054
3055 // unset NS
3056 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
3057 parameters_options_no_ns.options.noise_suppression = false;
3058 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3059 cricket::AudioOptions expected_options = parameters_options_all.options;
3060 if (!use_null_apm_) {
3061 VerifyEchoCancellationSettings(/*enabled=*/true);
3062 EXPECT_FALSE(apm_config_.noise_suppression.enabled);
3063 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3064 VerifyGainControlEnabledCorrectly();
3065 expected_options.echo_cancellation = true;
3066 expected_options.auto_gain_control = true;
3067 expected_options.noise_suppression = false;
3068 EXPECT_EQ(expected_options, channel1->options());
3069 }
3070
3071 // unset AGC
3072 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
3073 parameters_options_no_agc.options.auto_gain_control = false;
3074 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
3075 if (!use_null_apm_) {
3076 VerifyEchoCancellationSettings(/*enabled=*/true);
3077 EXPECT_FALSE(apm_config_.gain_controller1.enabled);
3078 EXPECT_TRUE(apm_config_.noise_suppression.enabled);
3079 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3080 expected_options.echo_cancellation = true;
3081 expected_options.auto_gain_control = false;
3082 expected_options.noise_suppression = true;
3083 EXPECT_EQ(expected_options, channel2->options());
3084 }
3085
3086 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3087 if (!use_null_apm_) {
3088 VerifyEchoCancellationSettings(/*enabled=*/true);
3089 VerifyGainControlEnabledCorrectly();
3090 EXPECT_TRUE(apm_config_.noise_suppression.enabled);
3091 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3092 }
3093
3094 channel1->SetSend(true);
3095 if (!use_null_apm_) {
3096 VerifyEchoCancellationSettings(/*enabled=*/true);
3097 VerifyGainControlEnabledCorrectly();
3098 EXPECT_FALSE(apm_config_.noise_suppression.enabled);
3099 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3100 }
3101
3102 channel2->SetSend(true);
3103 if (!use_null_apm_) {
3104 VerifyEchoCancellationSettings(/*enabled=*/true);
3105 EXPECT_FALSE(apm_config_.gain_controller1.enabled);
3106 EXPECT_TRUE(apm_config_.noise_suppression.enabled);
3107 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3108 }
3109
3110 // Make sure settings take effect while we are sending.
3111 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3112 send_parameters_;
3113 parameters_options_no_agc_nor_ns.options.auto_gain_control = false;
3114 parameters_options_no_agc_nor_ns.options.noise_suppression = false;
3115 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
3116 if (!use_null_apm_) {
3117 VerifyEchoCancellationSettings(/*enabled=*/true);
3118 EXPECT_FALSE(apm_config_.gain_controller1.enabled);
3119 EXPECT_FALSE(apm_config_.noise_suppression.enabled);
3120 EXPECT_EQ(apm_config_.noise_suppression.level, kDefaultNsLevel);
3121 expected_options.echo_cancellation = true;
3122 expected_options.auto_gain_control = false;
3123 expected_options.noise_suppression = false;
3124 EXPECT_EQ(expected_options, channel2->options());
3125 }
3126 }
3127
3128 // This test verifies DSCP settings are properly applied on voice media channel.
TEST_P(WebRtcVoiceEngineTestFake,TestSetDscpOptions)3129 TEST_P(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
3130 EXPECT_TRUE(SetupSendStream());
3131 cricket::FakeNetworkInterface network_interface;
3132 cricket::MediaConfig config;
3133 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel;
3134 webrtc::RtpParameters parameters;
3135
3136 channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
3137 engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
3138 webrtc::CryptoOptions())));
3139 channel->SetInterface(&network_interface);
3140 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3141 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3142 channel->SetInterface(nullptr);
3143
3144 config.enable_dscp = true;
3145 channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
3146 engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
3147 webrtc::CryptoOptions())));
3148 channel->SetInterface(&network_interface);
3149 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3150
3151 // Create a send stream to configure
3152 EXPECT_TRUE(
3153 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcZ)));
3154 parameters = channel->GetRtpSendParameters(kSsrcZ);
3155 ASSERT_FALSE(parameters.encodings.empty());
3156
3157 // Various priorities map to various dscp values.
3158 parameters.encodings[0].network_priority = webrtc::Priority::kHigh;
3159 ASSERT_TRUE(channel->SetRtpSendParameters(kSsrcZ, parameters, nullptr).ok());
3160 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3161 parameters.encodings[0].network_priority = webrtc::Priority::kVeryLow;
3162 ASSERT_TRUE(channel->SetRtpSendParameters(kSsrcZ, parameters, nullptr).ok());
3163 EXPECT_EQ(rtc::DSCP_CS1, network_interface.dscp());
3164
3165 // Packets should also self-identify their dscp in PacketOptions.
3166 const uint8_t kData[10] = {0};
3167 EXPECT_TRUE(channel->SendRtcp(kData, sizeof(kData)));
3168 EXPECT_EQ(rtc::DSCP_CS1, network_interface.options().dscp);
3169 channel->SetInterface(nullptr);
3170
3171 // Verify that setting the option to false resets the
3172 // DiffServCodePoint.
3173 config.enable_dscp = false;
3174 channel.reset(static_cast<cricket::WebRtcVoiceMediaChannel*>(
3175 engine_->CreateMediaChannel(&call_, config, cricket::AudioOptions(),
3176 webrtc::CryptoOptions())));
3177 channel->SetInterface(&network_interface);
3178 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3179 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3180
3181 channel->SetInterface(nullptr);
3182 }
3183
TEST_P(WebRtcVoiceEngineTestFake,SetOutputVolume)3184 TEST_P(WebRtcVoiceEngineTestFake, SetOutputVolume) {
3185 EXPECT_TRUE(SetupChannel());
3186 EXPECT_FALSE(channel_->SetOutputVolume(kSsrcY, 0.5));
3187 cricket::StreamParams stream;
3188 stream.ssrcs.push_back(kSsrcY);
3189 EXPECT_TRUE(channel_->AddRecvStream(stream));
3190 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrcY).gain());
3191 EXPECT_TRUE(channel_->SetOutputVolume(kSsrcY, 3));
3192 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrcY).gain());
3193 }
3194
TEST_P(WebRtcVoiceEngineTestFake,SetOutputVolumeUnsignaledRecvStream)3195 TEST_P(WebRtcVoiceEngineTestFake, SetOutputVolumeUnsignaledRecvStream) {
3196 EXPECT_TRUE(SetupChannel());
3197
3198 // Spawn an unsignaled stream by sending a packet - gain should be 1.
3199 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3200 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc1).gain());
3201
3202 // Should remember the volume "2" which will be set on new unsignaled streams,
3203 // and also set the gain to 2 on existing unsignaled streams.
3204 EXPECT_TRUE(channel_->SetDefaultOutputVolume(2));
3205 EXPECT_DOUBLE_EQ(2, GetRecvStream(kSsrc1).gain());
3206
3207 // Spawn an unsignaled stream by sending a packet - gain should be 2.
3208 unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
3209 memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
3210 rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
3211 DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
3212 EXPECT_DOUBLE_EQ(2, GetRecvStream(kSsrcX).gain());
3213
3214 // Setting gain for all unsignaled streams.
3215 EXPECT_TRUE(channel_->SetDefaultOutputVolume(3));
3216 if (kMaxUnsignaledRecvStreams > 1) {
3217 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc1).gain());
3218 }
3219 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrcX).gain());
3220
3221 // Setting gain on an individual stream affects only that.
3222 EXPECT_TRUE(channel_->SetOutputVolume(kSsrcX, 4));
3223 if (kMaxUnsignaledRecvStreams > 1) {
3224 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc1).gain());
3225 }
3226 EXPECT_DOUBLE_EQ(4, GetRecvStream(kSsrcX).gain());
3227 }
3228
TEST_P(WebRtcVoiceEngineTestFake,BaseMinimumPlayoutDelayMs)3229 TEST_P(WebRtcVoiceEngineTestFake, BaseMinimumPlayoutDelayMs) {
3230 EXPECT_TRUE(SetupChannel());
3231 EXPECT_FALSE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrcY, 200));
3232 EXPECT_FALSE(channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
3233
3234 cricket::StreamParams stream;
3235 stream.ssrcs.push_back(kSsrcY);
3236 EXPECT_TRUE(channel_->AddRecvStream(stream));
3237 EXPECT_EQ(0, GetRecvStream(kSsrcY).base_mininum_playout_delay_ms());
3238 EXPECT_TRUE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrcY, 300));
3239 EXPECT_EQ(300, GetRecvStream(kSsrcY).base_mininum_playout_delay_ms());
3240 }
3241
TEST_P(WebRtcVoiceEngineTestFake,BaseMinimumPlayoutDelayMsUnsignaledRecvStream)3242 TEST_P(WebRtcVoiceEngineTestFake,
3243 BaseMinimumPlayoutDelayMsUnsignaledRecvStream) {
3244 // Here base minimum delay is abbreviated to delay in comments for shortness.
3245 EXPECT_TRUE(SetupChannel());
3246
3247 // Spawn an unsignaled stream by sending a packet - delay should be 0.
3248 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3249 EXPECT_EQ(0, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
3250 // Check that it doesn't provide default values for unknown ssrc.
3251 EXPECT_FALSE(channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
3252
3253 // Check that default value for unsignaled streams is 0.
3254 EXPECT_EQ(0, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
3255
3256 // Should remember the delay 100 which will be set on new unsignaled streams,
3257 // and also set the delay to 100 on existing unsignaled streams.
3258 EXPECT_TRUE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrc0, 100));
3259 EXPECT_EQ(100, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
3260 // Check that it doesn't provide default values for unknown ssrc.
3261 EXPECT_FALSE(channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
3262
3263 // Spawn an unsignaled stream by sending a packet - delay should be 100.
3264 unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
3265 memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
3266 rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
3267 DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
3268 EXPECT_EQ(100, channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
3269
3270 // Setting delay with SSRC=0 should affect all unsignaled streams.
3271 EXPECT_TRUE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrc0, 300));
3272 if (kMaxUnsignaledRecvStreams > 1) {
3273 EXPECT_EQ(300, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
3274 }
3275 EXPECT_EQ(300, channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
3276
3277 // Setting delay on an individual stream affects only that.
3278 EXPECT_TRUE(channel_->SetBaseMinimumPlayoutDelayMs(kSsrcX, 400));
3279 if (kMaxUnsignaledRecvStreams > 1) {
3280 EXPECT_EQ(300, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc1).value_or(-1));
3281 }
3282 EXPECT_EQ(400, channel_->GetBaseMinimumPlayoutDelayMs(kSsrcX).value_or(-1));
3283 EXPECT_EQ(300, channel_->GetBaseMinimumPlayoutDelayMs(kSsrc0).value_or(-1));
3284 // Check that it doesn't provide default values for unknown ssrc.
3285 EXPECT_FALSE(channel_->GetBaseMinimumPlayoutDelayMs(kSsrcY).has_value());
3286 }
3287
TEST_P(WebRtcVoiceEngineTestFake,SetsSyncGroupFromStreamId)3288 TEST_P(WebRtcVoiceEngineTestFake, SetsSyncGroupFromStreamId) {
3289 const uint32_t kAudioSsrc = 123;
3290 const std::string kStreamId = "AvSyncLabel";
3291
3292 EXPECT_TRUE(SetupSendStream());
3293 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3294 sp.set_stream_ids({kStreamId});
3295 // Creating two channels to make sure that sync label is set properly for both
3296 // the default voice channel and following ones.
3297 EXPECT_TRUE(channel_->AddRecvStream(sp));
3298 sp.ssrcs[0] += 1;
3299 EXPECT_TRUE(channel_->AddRecvStream(sp));
3300
3301 ASSERT_EQ(2u, call_.GetAudioReceiveStreams().size());
3302 EXPECT_EQ(kStreamId,
3303 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
3304 << "SyncGroup should be set based on stream id";
3305 EXPECT_EQ(kStreamId,
3306 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
3307 << "SyncGroup should be set based on stream id";
3308 }
3309
3310 // TODO(solenberg): Remove, once recv streams are configured through Call.
3311 // (This is then covered by TestSetRecvRtpHeaderExtensions.)
TEST_P(WebRtcVoiceEngineTestFake,ConfiguresAudioReceiveStreamRtpExtensions)3312 TEST_P(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
3313 // Test that setting the header extensions results in the expected state
3314 // changes on an associated Call.
3315 std::vector<uint32_t> ssrcs;
3316 ssrcs.push_back(223);
3317 ssrcs.push_back(224);
3318
3319 EXPECT_TRUE(SetupSendStream());
3320 SetSendParameters(send_parameters_);
3321 for (uint32_t ssrc : ssrcs) {
3322 EXPECT_TRUE(
3323 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc)));
3324 }
3325
3326 EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
3327 for (uint32_t ssrc : ssrcs) {
3328 const auto* s = call_.GetAudioReceiveStream(ssrc);
3329 EXPECT_NE(nullptr, s);
3330 EXPECT_EQ(0u, s->GetConfig().rtp.extensions.size());
3331 }
3332
3333 // Set up receive extensions.
3334 const std::vector<webrtc::RtpExtension> header_extensions =
3335 GetDefaultEnabledRtpHeaderExtensions(*engine_);
3336 cricket::AudioRecvParameters recv_parameters;
3337 recv_parameters.extensions = header_extensions;
3338 channel_->SetRecvParameters(recv_parameters);
3339 EXPECT_EQ(2u, call_.GetAudioReceiveStreams().size());
3340 for (uint32_t ssrc : ssrcs) {
3341 const auto* s = call_.GetAudioReceiveStream(ssrc);
3342 EXPECT_NE(nullptr, s);
3343 const auto& s_exts = s->GetConfig().rtp.extensions;
3344 EXPECT_EQ(header_extensions.size(), s_exts.size());
3345 for (const auto& e_ext : header_extensions) {
3346 for (const auto& s_ext : s_exts) {
3347 if (e_ext.id == s_ext.id) {
3348 EXPECT_EQ(e_ext.uri, s_ext.uri);
3349 }
3350 }
3351 }
3352 }
3353
3354 // Disable receive extensions.
3355 channel_->SetRecvParameters(cricket::AudioRecvParameters());
3356 for (uint32_t ssrc : ssrcs) {
3357 const auto* s = call_.GetAudioReceiveStream(ssrc);
3358 EXPECT_NE(nullptr, s);
3359 EXPECT_EQ(0u, s->GetConfig().rtp.extensions.size());
3360 }
3361 }
3362
TEST_P(WebRtcVoiceEngineTestFake,DeliverAudioPacket_Call)3363 TEST_P(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3364 // Test that packets are forwarded to the Call when configured accordingly.
3365 const uint32_t kAudioSsrc = 1;
3366 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3367 static const unsigned char kRtcp[] = {
3368 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
3369 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
3371 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3372
3373 EXPECT_TRUE(SetupSendStream());
3374 cricket::WebRtcVoiceMediaChannel* media_channel =
3375 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3376 SetSendParameters(send_parameters_);
3377 EXPECT_TRUE(media_channel->AddRecvStream(
3378 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3379
3380 EXPECT_EQ(1u, call_.GetAudioReceiveStreams().size());
3381 const cricket::FakeAudioReceiveStream* s =
3382 call_.GetAudioReceiveStream(kAudioSsrc);
3383 EXPECT_EQ(0, s->received_packets());
3384 channel_->OnPacketReceived(kPcmuPacket, /* packet_time_us */ -1);
3385 rtc::Thread::Current()->ProcessMessages(0);
3386
3387 EXPECT_EQ(1, s->received_packets());
3388 }
3389
3390 // All receive channels should be associated with the first send channel,
3391 // since they do not send RTCP SR.
TEST_P(WebRtcVoiceEngineTestFake,AssociateFirstSendChannel_SendCreatedFirst)3392 TEST_P(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
3393 EXPECT_TRUE(SetupSendStream());
3394 EXPECT_TRUE(AddRecvStream(kSsrcY));
3395 EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
3396 EXPECT_TRUE(
3397 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcZ)));
3398 EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
3399 EXPECT_TRUE(AddRecvStream(kSsrcW));
3400 EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcW).rtp.local_ssrc);
3401 }
3402
TEST_P(WebRtcVoiceEngineTestFake,AssociateFirstSendChannel_RecvCreatedFirst)3403 TEST_P(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3404 EXPECT_TRUE(SetupRecvStream());
3405 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
3406 EXPECT_TRUE(
3407 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcY)));
3408 EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
3409 EXPECT_TRUE(AddRecvStream(kSsrcZ));
3410 EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcZ).rtp.local_ssrc);
3411 EXPECT_TRUE(
3412 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcW)));
3413 EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
3414 EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcZ).rtp.local_ssrc);
3415 }
3416
TEST_P(WebRtcVoiceEngineTestFake,SetRawAudioSink)3417 TEST_P(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3418 EXPECT_TRUE(SetupChannel());
3419 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3420 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3421
3422 // Setting the sink before a recv stream exists should do nothing.
3423 channel_->SetRawAudioSink(kSsrcX, std::move(fake_sink_1));
3424 EXPECT_TRUE(AddRecvStream(kSsrcX));
3425 EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
3426
3427 // Now try actually setting the sink.
3428 channel_->SetRawAudioSink(kSsrcX, std::move(fake_sink_2));
3429 EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
3430
3431 // Now try resetting it.
3432 channel_->SetRawAudioSink(kSsrcX, nullptr);
3433 EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
3434 }
3435
TEST_P(WebRtcVoiceEngineTestFake,SetRawAudioSinkUnsignaledRecvStream)3436 TEST_P(WebRtcVoiceEngineTestFake, SetRawAudioSinkUnsignaledRecvStream) {
3437 EXPECT_TRUE(SetupChannel());
3438 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3439 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3440 std::unique_ptr<FakeAudioSink> fake_sink_3(new FakeAudioSink());
3441 std::unique_ptr<FakeAudioSink> fake_sink_4(new FakeAudioSink());
3442
3443 // Should be able to set a default sink even when no stream exists.
3444 channel_->SetDefaultRawAudioSink(std::move(fake_sink_1));
3445
3446 // Spawn an unsignaled stream by sending a packet - it should be assigned the
3447 // default sink.
3448 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3449 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3450
3451 // Try resetting the default sink.
3452 channel_->SetDefaultRawAudioSink(nullptr);
3453 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3454
3455 // Try setting the default sink while the default stream exists.
3456 channel_->SetDefaultRawAudioSink(std::move(fake_sink_2));
3457 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3458
3459 // If we remove and add a default stream, it should get the same sink.
3460 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc1));
3461 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3462 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3463
3464 // Spawn another unsignaled stream - it should be assigned the default sink
3465 // and the previous unsignaled stream should lose it.
3466 unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
3467 memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
3468 rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
3469 DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
3470 if (kMaxUnsignaledRecvStreams > 1) {
3471 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3472 }
3473 EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
3474
3475 // Reset the default sink - the second unsignaled stream should lose it.
3476 channel_->SetDefaultRawAudioSink(nullptr);
3477 if (kMaxUnsignaledRecvStreams > 1) {
3478 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3479 }
3480 EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
3481
3482 // Try setting the default sink while two streams exists.
3483 channel_->SetDefaultRawAudioSink(std::move(fake_sink_3));
3484 if (kMaxUnsignaledRecvStreams > 1) {
3485 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3486 }
3487 EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
3488
3489 // Try setting the sink for the first unsignaled stream using its known SSRC.
3490 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_4));
3491 if (kMaxUnsignaledRecvStreams > 1) {
3492 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3493 }
3494 EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
3495 if (kMaxUnsignaledRecvStreams > 1) {
3496 EXPECT_NE(GetRecvStream(kSsrc1).sink(), GetRecvStream(kSsrcX).sink());
3497 }
3498 }
3499
3500 // Test that, just like the video channel, the voice channel communicates the
3501 // network state to the call.
TEST_P(WebRtcVoiceEngineTestFake,OnReadyToSendSignalsNetworkState)3502 TEST_P(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
3503 EXPECT_TRUE(SetupChannel());
3504
3505 EXPECT_EQ(webrtc::kNetworkUp,
3506 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3507 EXPECT_EQ(webrtc::kNetworkUp,
3508 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3509
3510 channel_->OnReadyToSend(false);
3511 EXPECT_EQ(webrtc::kNetworkDown,
3512 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3513 EXPECT_EQ(webrtc::kNetworkUp,
3514 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3515
3516 channel_->OnReadyToSend(true);
3517 EXPECT_EQ(webrtc::kNetworkUp,
3518 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3519 EXPECT_EQ(webrtc::kNetworkUp,
3520 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3521 }
3522
3523 // Test that playout is still started after changing parameters
TEST_P(WebRtcVoiceEngineTestFake,PreservePlayoutWhenRecreateRecvStream)3524 TEST_P(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3525 SetupRecvStream();
3526 channel_->SetPlayout(true);
3527 EXPECT_TRUE(GetRecvStream(kSsrcX).started());
3528
3529 // Changing RTP header extensions will recreate the
3530 // AudioReceiveStreamInterface.
3531 cricket::AudioRecvParameters parameters;
3532 parameters.extensions.push_back(
3533 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3534 channel_->SetRecvParameters(parameters);
3535
3536 EXPECT_TRUE(GetRecvStream(kSsrcX).started());
3537 }
3538
3539 // Tests when GetSources is called with non-existing ssrc, it will return an
3540 // empty list of RtpSource without crashing.
TEST_P(WebRtcVoiceEngineTestFake,GetSourcesWithNonExistingSsrc)3541 TEST_P(WebRtcVoiceEngineTestFake, GetSourcesWithNonExistingSsrc) {
3542 // Setup an recv stream with `kSsrcX`.
3543 SetupRecvStream();
3544 cricket::WebRtcVoiceMediaChannel* media_channel =
3545 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3546 // Call GetSources with `kSsrcY` which doesn't exist.
3547 std::vector<webrtc::RtpSource> sources = media_channel->GetSources(kSsrcY);
3548 EXPECT_EQ(0u, sources.size());
3549 }
3550
3551 // Tests that the library initializes and shuts down properly.
TEST(WebRtcVoiceEngineTest,StartupShutdown)3552 TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3553 rtc::AutoThread main_thread;
3554 for (bool use_null_apm : {false, true}) {
3555 // If the VoiceEngine wants to gather available codecs early, that's fine
3556 // but we never want it to create a decoder at this stage.
3557 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3558 webrtc::CreateDefaultTaskQueueFactory();
3559 rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3560 webrtc::test::MockAudioDeviceModule::CreateNice();
3561 rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3562 use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3563 webrtc::FieldTrialBasedConfig field_trials;
3564 cricket::WebRtcVoiceEngine engine(
3565 task_queue_factory.get(), adm.get(),
3566 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3567 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
3568 nullptr, field_trials);
3569 engine.Init();
3570 webrtc::RtcEventLogNull event_log;
3571 webrtc::Call::Config call_config(&event_log);
3572 call_config.trials = &field_trials;
3573 call_config.task_queue_factory = task_queue_factory.get();
3574 auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3575 cricket::VoiceMediaChannel* channel = engine.CreateMediaChannel(
3576 call.get(), cricket::MediaConfig(), cricket::AudioOptions(),
3577 webrtc::CryptoOptions());
3578 EXPECT_TRUE(channel != nullptr);
3579 delete channel;
3580 }
3581 }
3582
3583 // Tests that reference counting on the external ADM is correct.
TEST(WebRtcVoiceEngineTest,StartupShutdownWithExternalADM)3584 TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3585 rtc::AutoThread main_thread;
3586 for (bool use_null_apm : {false, true}) {
3587 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3588 webrtc::CreateDefaultTaskQueueFactory();
3589 auto adm = rtc::make_ref_counted<
3590 ::testing::NiceMock<webrtc::test::MockAudioDeviceModule>>();
3591 {
3592 rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3593 use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3594 webrtc::FieldTrialBasedConfig field_trials;
3595 cricket::WebRtcVoiceEngine engine(
3596 task_queue_factory.get(), adm.get(),
3597 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3598 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
3599 nullptr, field_trials);
3600 engine.Init();
3601 webrtc::RtcEventLogNull event_log;
3602 webrtc::Call::Config call_config(&event_log);
3603 call_config.trials = &field_trials;
3604 call_config.task_queue_factory = task_queue_factory.get();
3605 auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3606 cricket::VoiceMediaChannel* channel = engine.CreateMediaChannel(
3607 call.get(), cricket::MediaConfig(), cricket::AudioOptions(),
3608 webrtc::CryptoOptions());
3609 EXPECT_TRUE(channel != nullptr);
3610 delete channel;
3611 }
3612 // The engine/channel should have dropped their references.
3613 EXPECT_EQ(adm.release()->Release(),
3614 rtc::RefCountReleaseStatus::kDroppedLastRef);
3615 }
3616 }
3617
3618 // Verify the payload id of common audio codecs, including CN and G722.
TEST(WebRtcVoiceEngineTest,HasCorrectPayloadTypeMapping)3619 TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) {
3620 for (bool use_null_apm : {false, true}) {
3621 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3622 webrtc::CreateDefaultTaskQueueFactory();
3623 // TODO(ossu): Why are the payload types of codecs with non-static payload
3624 // type assignments checked here? It shouldn't really matter.
3625 rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3626 webrtc::test::MockAudioDeviceModule::CreateNice();
3627 rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3628 use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3629 webrtc::FieldTrialBasedConfig field_trials;
3630 cricket::WebRtcVoiceEngine engine(
3631 task_queue_factory.get(), adm.get(),
3632 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3633 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
3634 nullptr, field_trials);
3635 engine.Init();
3636 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3637 auto is_codec = [&codec](const char* name, int clockrate = 0) {
3638 return absl::EqualsIgnoreCase(codec.name, name) &&
3639 (clockrate == 0 || codec.clockrate == clockrate);
3640 };
3641 if (is_codec("CN", 16000)) {
3642 EXPECT_EQ(105, codec.id);
3643 } else if (is_codec("CN", 32000)) {
3644 EXPECT_EQ(106, codec.id);
3645 } else if (is_codec("G722", 8000)) {
3646 EXPECT_EQ(9, codec.id);
3647 } else if (is_codec("telephone-event", 8000)) {
3648 EXPECT_EQ(126, codec.id);
3649 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3650 // Remove these checks once both send and receive side assigns payload
3651 // types dynamically.
3652 } else if (is_codec("telephone-event", 16000)) {
3653 EXPECT_EQ(113, codec.id);
3654 } else if (is_codec("telephone-event", 32000)) {
3655 EXPECT_EQ(112, codec.id);
3656 } else if (is_codec("telephone-event", 48000)) {
3657 EXPECT_EQ(110, codec.id);
3658 } else if (is_codec("opus")) {
3659 EXPECT_EQ(111, codec.id);
3660 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3661 EXPECT_EQ("10", codec.params.find("minptime")->second);
3662 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3663 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
3664 }
3665 }
3666 }
3667 }
3668
3669 // Tests that VoE supports at least 32 channels
TEST(WebRtcVoiceEngineTest,Has32Channels)3670 TEST(WebRtcVoiceEngineTest, Has32Channels) {
3671 rtc::AutoThread main_thread;
3672 for (bool use_null_apm : {false, true}) {
3673 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3674 webrtc::CreateDefaultTaskQueueFactory();
3675 rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3676 webrtc::test::MockAudioDeviceModule::CreateNice();
3677 rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3678 use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3679 webrtc::FieldTrialBasedConfig field_trials;
3680 cricket::WebRtcVoiceEngine engine(
3681 task_queue_factory.get(), adm.get(),
3682 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3683 webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
3684 nullptr, field_trials);
3685 engine.Init();
3686 webrtc::RtcEventLogNull event_log;
3687 webrtc::Call::Config call_config(&event_log);
3688 call_config.trials = &field_trials;
3689 call_config.task_queue_factory = task_queue_factory.get();
3690 auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3691
3692 cricket::VoiceMediaChannel* channels[32];
3693 size_t num_channels = 0;
3694 while (num_channels < arraysize(channels)) {
3695 cricket::VoiceMediaChannel* channel = engine.CreateMediaChannel(
3696 call.get(), cricket::MediaConfig(), cricket::AudioOptions(),
3697 webrtc::CryptoOptions());
3698 if (!channel)
3699 break;
3700 channels[num_channels++] = channel;
3701 }
3702
3703 size_t expected = arraysize(channels);
3704 EXPECT_EQ(expected, num_channels);
3705
3706 while (num_channels > 0) {
3707 delete channels[--num_channels];
3708 }
3709 }
3710 }
3711
3712 // Test that we set our preferred codecs properly.
TEST(WebRtcVoiceEngineTest,SetRecvCodecs)3713 TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3714 rtc::AutoThread main_thread;
3715 for (bool use_null_apm : {false, true}) {
3716 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3717 webrtc::CreateDefaultTaskQueueFactory();
3718 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3719 // - Check that our builtin codecs are usable by Channel.
3720 // - The codecs provided by the engine is usable by Channel.
3721 // It does not check that the codecs in the RecvParameters are actually
3722 // what we sent in - though it's probably reasonable to expect so, if
3723 // SetRecvParameters returns true.
3724 // I think it will become clear once audio decoder injection is completed.
3725 rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3726 webrtc::test::MockAudioDeviceModule::CreateNice();
3727 rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3728 use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3729 webrtc::FieldTrialBasedConfig field_trials;
3730 cricket::WebRtcVoiceEngine engine(
3731 task_queue_factory.get(), adm.get(),
3732 webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
3733 webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, apm, nullptr,
3734 field_trials);
3735 engine.Init();
3736 webrtc::RtcEventLogNull event_log;
3737 webrtc::Call::Config call_config(&event_log);
3738 call_config.trials = &field_trials;
3739 call_config.task_queue_factory = task_queue_factory.get();
3740 auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3741 cricket::WebRtcVoiceMediaChannel channel(
3742 &engine, cricket::MediaConfig(), cricket::AudioOptions(),
3743 webrtc::CryptoOptions(), call.get());
3744 cricket::AudioRecvParameters parameters;
3745 parameters.codecs = engine.recv_codecs();
3746 EXPECT_TRUE(channel.SetRecvParameters(parameters));
3747 }
3748 }
3749
TEST(WebRtcVoiceEngineTest,SetRtpSendParametersMaxBitrate)3750 TEST(WebRtcVoiceEngineTest, SetRtpSendParametersMaxBitrate) {
3751 rtc::AutoThread main_thread;
3752 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3753 webrtc::CreateDefaultTaskQueueFactory();
3754 rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3755 webrtc::test::MockAudioDeviceModule::CreateNice();
3756 webrtc::FieldTrialBasedConfig field_trials;
3757 FakeAudioSource source;
3758 cricket::WebRtcVoiceEngine engine(task_queue_factory.get(), adm.get(),
3759 webrtc::CreateBuiltinAudioEncoderFactory(),
3760 webrtc::CreateBuiltinAudioDecoderFactory(),
3761 nullptr, nullptr, nullptr, field_trials);
3762 engine.Init();
3763 webrtc::RtcEventLogNull event_log;
3764 webrtc::Call::Config call_config(&event_log);
3765 call_config.trials = &field_trials;
3766 call_config.task_queue_factory = task_queue_factory.get();
3767 {
3768 webrtc::AudioState::Config config;
3769 config.audio_mixer = webrtc::AudioMixerImpl::Create();
3770 config.audio_device_module =
3771 webrtc::test::MockAudioDeviceModule::CreateNice();
3772 call_config.audio_state = webrtc::AudioState::Create(config);
3773 }
3774 auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
3775 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3776 cricket::AudioOptions(),
3777 webrtc::CryptoOptions(), call.get());
3778 {
3779 cricket::AudioSendParameters params;
3780 params.codecs.push_back(cricket::AudioCodec(1, "opus", 48000, 32000, 2));
3781 params.extensions.push_back(webrtc::RtpExtension(
3782 webrtc::RtpExtension::kTransportSequenceNumberUri, 1));
3783 EXPECT_TRUE(channel.SetSendParameters(params));
3784 }
3785 constexpr int kSsrc = 1234;
3786 {
3787 cricket::StreamParams params;
3788 params.add_ssrc(kSsrc);
3789 channel.AddSendStream(params);
3790 }
3791 channel.SetAudioSend(kSsrc, true, nullptr, &source);
3792 channel.SetSend(true);
3793 webrtc::RtpParameters params = channel.GetRtpSendParameters(kSsrc);
3794 for (int max_bitrate : {-10, -1, 0, 10000}) {
3795 params.encodings[0].max_bitrate_bps = max_bitrate;
3796 channel.SetRtpSendParameters(
3797 kSsrc, params, [](webrtc::RTCError error) { EXPECT_TRUE(error.ok()); });
3798 }
3799 }
3800
TEST(WebRtcVoiceEngineTest,CollectRecvCodecs)3801 TEST(WebRtcVoiceEngineTest, CollectRecvCodecs) {
3802 for (bool use_null_apm : {false, true}) {
3803 std::vector<webrtc::AudioCodecSpec> specs;
3804 webrtc::AudioCodecSpec spec1{{"codec1", 48000, 2, {{"param1", "value1"}}},
3805 {48000, 2, 16000, 10000, 20000}};
3806 spec1.info.allow_comfort_noise = false;
3807 spec1.info.supports_network_adaption = true;
3808 specs.push_back(spec1);
3809 webrtc::AudioCodecSpec spec2{{"codec2", 32000, 1}, {32000, 1, 32000}};
3810 spec2.info.allow_comfort_noise = false;
3811 specs.push_back(spec2);
3812 specs.push_back(webrtc::AudioCodecSpec{
3813 {"codec3", 16000, 1, {{"param1", "value1b"}, {"param2", "value2"}}},
3814 {16000, 1, 13300}});
3815 specs.push_back(
3816 webrtc::AudioCodecSpec{{"codec4", 8000, 1}, {8000, 1, 64000}});
3817 specs.push_back(
3818 webrtc::AudioCodecSpec{{"codec5", 8000, 2}, {8000, 1, 64000}});
3819
3820 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory =
3821 webrtc::CreateDefaultTaskQueueFactory();
3822 rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> unused_encoder_factory =
3823 webrtc::MockAudioEncoderFactory::CreateUnusedFactory();
3824 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory =
3825 rtc::make_ref_counted<webrtc::MockAudioDecoderFactory>();
3826 EXPECT_CALL(*mock_decoder_factory.get(), GetSupportedDecoders())
3827 .WillOnce(Return(specs));
3828 rtc::scoped_refptr<webrtc::test::MockAudioDeviceModule> adm =
3829 webrtc::test::MockAudioDeviceModule::CreateNice();
3830
3831 rtc::scoped_refptr<webrtc::AudioProcessing> apm =
3832 use_null_apm ? nullptr : webrtc::AudioProcessingBuilder().Create();
3833 webrtc::FieldTrialBasedConfig field_trials;
3834 cricket::WebRtcVoiceEngine engine(
3835 task_queue_factory.get(), adm.get(), unused_encoder_factory,
3836 mock_decoder_factory, nullptr, apm, nullptr, field_trials);
3837 engine.Init();
3838 auto codecs = engine.recv_codecs();
3839 EXPECT_EQ(11u, codecs.size());
3840
3841 // Rather than just ASSERTing that there are enough codecs, ensure that we
3842 // can check the actual values safely, to provide better test results.
3843 auto get_codec = [&codecs](size_t index) -> const cricket::AudioCodec& {
3844 static const cricket::AudioCodec missing_codec(0, "<missing>", 0, 0, 0);
3845 if (codecs.size() > index)
3846 return codecs[index];
3847 return missing_codec;
3848 };
3849
3850 // Ensure the general codecs are generated first and in order.
3851 for (size_t i = 0; i != specs.size(); ++i) {
3852 EXPECT_EQ(specs[i].format.name, get_codec(i).name);
3853 EXPECT_EQ(specs[i].format.clockrate_hz, get_codec(i).clockrate);
3854 EXPECT_EQ(specs[i].format.num_channels, get_codec(i).channels);
3855 EXPECT_EQ(specs[i].format.parameters, get_codec(i).params);
3856 }
3857
3858 // Find the index of a codec, or -1 if not found, so that we can easily
3859 // check supplementary codecs are ordered after the general codecs.
3860 auto find_codec = [&codecs](const webrtc::SdpAudioFormat& format) -> int {
3861 for (size_t i = 0; i != codecs.size(); ++i) {
3862 const cricket::AudioCodec& codec = codecs[i];
3863 if (absl::EqualsIgnoreCase(codec.name, format.name) &&
3864 codec.clockrate == format.clockrate_hz &&
3865 codec.channels == format.num_channels) {
3866 return rtc::checked_cast<int>(i);
3867 }
3868 }
3869 return -1;
3870 };
3871
3872 // Ensure all supplementary codecs are generated last. Their internal
3873 // ordering is not important. Without this cast, the comparison turned
3874 // unsigned and, thus, failed for -1.
3875 const int num_specs = static_cast<int>(specs.size());
3876 EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs);
3877 EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs);
3878 EXPECT_EQ(find_codec({"cn", 32000, 1}), -1);
3879 EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs);
3880 EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs);
3881 EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs);
3882 EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs);
3883 }
3884 }
3885