blob: 5e99db36312d4d1fe44f8e2d806062ad69815be9 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * 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.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakenetworkinterface.h"
22#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080023#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
solenbergbc37fc82016-04-04 09:54:44 -070027#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000029using cricket::kRtpAudioLevelHeaderExtension;
30using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
deadbeef67cf2c12016-04-13 10:07:16 -070036const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
44const cricket::AudioCodec kTelephoneEventCodec(106,
45 "telephone-event",
46 8000,
47 0,
48 1);
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080050const uint32_t kSsrc2 = 2;
51const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070052const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053
54class FakeVoEWrapper : public cricket::VoEWrapper {
55 public:
56 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
57 : cricket::VoEWrapper(engine, // processing
58 engine, // base
59 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 engine) { // volume
63 }
64};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
solenbergff976312016-03-30 23:28:51 -070067// Tests that our stub library "works".
68TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070069 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
70 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
71 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070072 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
73 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070075 cricket::FakeWebRtcVoiceEngine voe;
76 EXPECT_FALSE(voe.IsInited());
77 {
solenbergbc37fc82016-04-04 09:54:44 -070078 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070079 EXPECT_TRUE(voe.IsInited());
80 }
81 EXPECT_FALSE(voe.IsInited());
82}
83
deadbeef884f5852016-01-15 09:20:04 -080084class FakeAudioSink : public webrtc::AudioSinkInterface {
85 public:
86 void OnData(const Data& audio) override {}
87};
88
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080089class FakeAudioSource : public cricket::AudioSource {
90 void SetSink(Sink* sink) override {}
91};
92
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093class WebRtcVoiceEngineTestFake : public testing::Test {
94 public:
stefanba4c0e42016-02-04 04:12:24 -080095 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
96
97 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070098 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
99 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
100 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700101 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
102 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
103 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergbc37fc82016-04-04 09:54:44 -0700104 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
105 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200106 send_parameters_.codecs.push_back(kPcmuCodec);
107 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 }
solenbergff976312016-03-30 23:28:51 -0700109 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700110 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
111 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200112 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000113 }
solenbergff976312016-03-30 23:28:51 -0700114 bool SetupRecvStream() {
115 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700116 return false;
117 }
118 return channel_->AddRecvStream(
119 cricket::StreamParams::CreateLegacy(kSsrc1));
120 }
solenbergff976312016-03-30 23:28:51 -0700121 bool SetupSendStream() {
122 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000123 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800125 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
126 return false;
127 }
128 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000130 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700131 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700132 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800133 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700134 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700135 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800136 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000137 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700139 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000140 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200142 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 }
145
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100146 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
147 const auto* send_stream = call_.GetAudioSendStream(ssrc);
148 EXPECT_TRUE(send_stream);
149 return *send_stream;
150 }
151
deadbeef884f5852016-01-15 09:20:04 -0800152 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
153 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
154 EXPECT_TRUE(recv_stream);
155 return *recv_stream;
156 }
157
solenberg3a941542015-11-16 07:34:50 -0800158 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800159 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800160 }
161
solenberg7add0582015-11-20 09:59:34 -0800162 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800163 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800164 }
165
solenbergd53a3f92016-04-14 13:56:37 -0700166 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
167 ASSERT_TRUE(channel);
168 if (enable) {
169 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
170 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
171 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
172 }
173 channel->SetSend(enable);
174 }
175
Peter Boström0c4e06b2015-10-07 12:23:21 +0200176 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700177 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000178 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700179 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000180 // send stream.
181 EXPECT_TRUE(channel_->AddSendStream(
182 cricket::StreamParams::CreateLegacy(kSsrc1)));
183 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000184
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200186 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700187 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000188 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800189 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200190 send_parameters_.codecs.push_back(kTelephoneEventCodec);
191 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000192 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000193
194 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700195 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800196 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000197 EXPECT_TRUE(channel_->AddSendStream(
198 cricket::StreamParams::CreateLegacy(kSsrc1)));
199 }
200
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800202 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000203
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100204 // Test send.
205 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
206 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
207 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800208 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100209 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
210 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
211 EXPECT_EQ(2, telephone_event.event_code);
212 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 }
214
215 // Test that send bandwidth is set correctly.
216 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000217 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
218 // |expected_result| is the expected result from SetMaxSendBandwidth().
219 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700220 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
221 int max_bitrate,
222 bool expected_result,
223 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 cricket::AudioSendParameters parameters;
225 parameters.codecs.push_back(codec);
226 parameters.max_bandwidth_bps = max_bitrate;
227 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
228
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000230 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000232 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 }
234
skvlade0d46372016-04-07 22:59:22 -0700235 // Sets the per-stream maximum bitrate limit for the specified SSRC.
236 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
237 webrtc::RtpParameters parameters = channel_->GetRtpParameters(ssrc);
238 EXPECT_EQ(1UL, parameters.encodings.size());
239
240 parameters.encodings[0].max_bitrate_bps = bitrate;
241 return channel_->SetRtpParameters(ssrc, parameters);
242 }
243
244 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
245 cricket::AudioSendParameters send_parameters;
246 send_parameters.codecs.push_back(codec);
247 send_parameters.max_bandwidth_bps = bitrate;
248 return channel_->SetSendParameters(send_parameters);
249 }
250
251 int GetCodecBitrate(int32_t ssrc) {
252 cricket::WebRtcVoiceMediaChannel* media_channel =
253 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
254 int channel = media_channel->GetSendChannelId(ssrc);
255 EXPECT_NE(-1, channel);
256 webrtc::CodecInst codec;
257 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
258 return codec.rate;
259 }
260
261 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
262 int global_max,
263 int stream_max,
264 bool expected_result,
265 int expected_codec_bitrate) {
266 // Clear the bitrate limit from the previous test case.
267 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
268
269 // Attempt to set the requested bitrate limits.
270 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
271 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
272
273 // Verify that reading back the parameters gives results
274 // consistent with the Set() result.
275 webrtc::RtpParameters resulting_parameters =
276 channel_->GetRtpParameters(kSsrc1);
277 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
278 EXPECT_EQ(expected_result ? stream_max : -1,
279 resulting_parameters.encodings[0].max_bitrate_bps);
280
281 // Verify that the codec settings have the expected bitrate.
282 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
283 }
284
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000285 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700286 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000287
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000288 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800289 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000290
291 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200292 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000293 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200294 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800295 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000296
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000297 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200298 send_parameters_.extensions.clear();
299 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800300 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000301
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000302 // Ensure extension is set properly.
303 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200304 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
305 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800306 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
307 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
308 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000309
solenberg7add0582015-11-20 09:59:34 -0800310 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000311 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700312 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800313 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
314 call_.GetAudioSendStream(kSsrc2));
315 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
316 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
317 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000318
319 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200320 send_parameters_.codecs.push_back(kPcmuCodec);
321 send_parameters_.extensions.clear();
322 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800323 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
324 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000325 }
326
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000327 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700328 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000329
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000330 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800331 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000332
333 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800334 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000335 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800336 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
337 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000338
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000339 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800340 recv_parameters_.extensions.clear();
341 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
342 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000343
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000344 // Ensure extension is set properly.
345 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800346 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
347 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
348 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
349 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
350 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000351
solenberg7add0582015-11-20 09:59:34 -0800352 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000353 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700354 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800355 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
356 call_.GetAudioReceiveStream(kSsrc2));
357 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
358 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
359 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000360
361 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800362 recv_parameters_.extensions.clear();
363 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
364 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
365 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000366 }
367
solenberg85a04962015-10-27 03:35:21 -0700368 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
369 webrtc::AudioSendStream::Stats stats;
370 stats.local_ssrc = 12;
371 stats.bytes_sent = 345;
372 stats.packets_sent = 678;
373 stats.packets_lost = 9012;
374 stats.fraction_lost = 34.56f;
375 stats.codec_name = "codec_name_send";
376 stats.ext_seqnum = 789;
377 stats.jitter_ms = 12;
378 stats.rtt_ms = 345;
379 stats.audio_level = 678;
380 stats.aec_quality_min = 9.01f;
381 stats.echo_delay_median_ms = 234;
382 stats.echo_delay_std_ms = 567;
383 stats.echo_return_loss = 890;
384 stats.echo_return_loss_enhancement = 1234;
385 stats.typing_noise_detected = true;
386 return stats;
387 }
388 void SetAudioSendStreamStats() {
389 for (auto* s : call_.GetAudioSendStreams()) {
390 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200391 }
solenberg85a04962015-10-27 03:35:21 -0700392 }
solenberg566ef242015-11-06 15:34:49 -0800393 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
394 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700395 const auto stats = GetAudioSendStreamStats();
396 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
397 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
398 EXPECT_EQ(info.packets_sent, stats.packets_sent);
399 EXPECT_EQ(info.packets_lost, stats.packets_lost);
400 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
401 EXPECT_EQ(info.codec_name, stats.codec_name);
402 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
403 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
404 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
405 EXPECT_EQ(info.audio_level, stats.audio_level);
406 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
407 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
408 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
409 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
410 EXPECT_EQ(info.echo_return_loss_enhancement,
411 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800412 EXPECT_EQ(info.typing_noise_detected,
413 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700414 }
415
416 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
417 webrtc::AudioReceiveStream::Stats stats;
418 stats.remote_ssrc = 123;
419 stats.bytes_rcvd = 456;
420 stats.packets_rcvd = 768;
421 stats.packets_lost = 101;
422 stats.fraction_lost = 23.45f;
423 stats.codec_name = "codec_name_recv";
424 stats.ext_seqnum = 678;
425 stats.jitter_ms = 901;
426 stats.jitter_buffer_ms = 234;
427 stats.jitter_buffer_preferred_ms = 567;
428 stats.delay_estimate_ms = 890;
429 stats.audio_level = 1234;
430 stats.expand_rate = 5.67f;
431 stats.speech_expand_rate = 8.90f;
432 stats.secondary_decoded_rate = 1.23f;
433 stats.accelerate_rate = 4.56f;
434 stats.preemptive_expand_rate = 7.89f;
435 stats.decoding_calls_to_silence_generator = 12;
436 stats.decoding_calls_to_neteq = 345;
437 stats.decoding_normal = 67890;
438 stats.decoding_plc = 1234;
439 stats.decoding_cng = 5678;
440 stats.decoding_plc_cng = 9012;
441 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200442 return stats;
443 }
444 void SetAudioReceiveStreamStats() {
445 for (auto* s : call_.GetAudioReceiveStreams()) {
446 s->SetStats(GetAudioReceiveStreamStats());
447 }
448 }
449 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700450 const auto stats = GetAudioReceiveStreamStats();
451 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
452 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
453 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
454 EXPECT_EQ(info.packets_lost, stats.packets_lost);
455 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
456 EXPECT_EQ(info.codec_name, stats.codec_name);
457 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
458 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
459 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200460 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700461 stats.jitter_buffer_preferred_ms);
462 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
463 EXPECT_EQ(info.audio_level, stats.audio_level);
464 EXPECT_EQ(info.expand_rate, stats.expand_rate);
465 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
466 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
467 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
468 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200469 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700470 stats.decoding_calls_to_silence_generator);
471 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
472 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
473 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
474 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
475 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
476 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200477 }
478
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700480 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200481 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700483 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700484 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200485 cricket::AudioSendParameters send_parameters_;
486 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800487 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800488 private:
489 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490};
491
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492// Tests that we can create and destroy a channel.
493TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700494 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000495}
496
solenberg31fec402016-05-06 02:13:12 -0700497// Test that we can add a send stream and that it has the correct defaults.
498TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
499 EXPECT_TRUE(SetupChannel());
500 EXPECT_TRUE(
501 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
502 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
503 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
504 EXPECT_EQ("", config.rtp.c_name);
505 EXPECT_EQ(0u, config.rtp.extensions.size());
506 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
507 config.send_transport);
508}
509
510// Test that we can add a receive stream and that it has the correct defaults.
511TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
512 EXPECT_TRUE(SetupChannel());
513 EXPECT_TRUE(
514 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
515 const webrtc::AudioReceiveStream::Config& config =
516 GetRecvStreamConfig(kSsrc1);
517 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
518 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
519 EXPECT_FALSE(config.rtp.transport_cc);
520 EXPECT_EQ(0u, config.rtp.extensions.size());
521 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
522 config.rtcp_send_transport);
523 EXPECT_EQ("", config.sync_group);
524}
525
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700527// correctly (such that opus appears first).
528TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700529 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 ASSERT_FALSE(codecs.empty());
531 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
532 EXPECT_EQ(48000, codecs[0].clockrate);
533 EXPECT_EQ(2, codecs[0].channels);
534 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535}
536
stefanba4c0e42016-02-04 04:12:24 -0800537TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700538 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800539 bool opus_found = false;
540 for (cricket::AudioCodec codec : codecs) {
541 if (codec.name == "opus") {
542 EXPECT_TRUE(HasTransportCc(codec));
543 opus_found = true;
544 }
545 }
546 EXPECT_TRUE(opus_found);
547}
548
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549// Tests that we can find codecs by name or id, and that we interpret the
550// clockrate and bitrate fields properly.
551TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
552 cricket::AudioCodec codec;
553 webrtc::CodecInst codec_inst;
554 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800555 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800557 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800559 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
560 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561 // Find ISAC with a different payload id.
562 codec = kIsacCodec;
563 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800564 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000565 EXPECT_EQ(codec.id, codec_inst.pltype);
566 // Find PCMU with a 0 clockrate.
567 codec = kPcmuCodec;
568 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800569 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 EXPECT_EQ(codec.id, codec_inst.pltype);
571 EXPECT_EQ(8000, codec_inst.plfreq);
572 // Find PCMU with a 0 bitrate.
573 codec = kPcmuCodec;
574 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800575 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000576 EXPECT_EQ(codec.id, codec_inst.pltype);
577 EXPECT_EQ(64000, codec_inst.rate);
578 // Find ISAC with an explicit bitrate.
579 codec = kIsacCodec;
580 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800581 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 EXPECT_EQ(codec.id, codec_inst.pltype);
583 EXPECT_EQ(32000, codec_inst.rate);
584}
585
586// Test that we set our inbound codecs properly, including changing PT.
587TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700588 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200589 cricket::AudioRecvParameters parameters;
590 parameters.codecs.push_back(kIsacCodec);
591 parameters.codecs.push_back(kPcmuCodec);
592 parameters.codecs.push_back(kTelephoneEventCodec);
593 parameters.codecs[0].id = 106; // collide with existing telephone-event
594 parameters.codecs[2].id = 126;
595 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700596 EXPECT_TRUE(channel_->AddRecvStream(
597 cricket::StreamParams::CreateLegacy(kSsrc1)));
598 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800600 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 gcodec.plfreq = 16000;
602 gcodec.channels = 1;
603 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
604 EXPECT_EQ(106, gcodec.pltype);
605 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800606 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 gcodec.plfreq = 8000;
608 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
609 EXPECT_EQ(126, gcodec.pltype);
610 EXPECT_STREQ("telephone-event", gcodec.plname);
611}
612
613// Test that we fail to set an unknown inbound codec.
614TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700615 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200616 cricket::AudioRecvParameters parameters;
617 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700618 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620}
621
622// Test that we fail if we have duplicate types in the inbound list.
623TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700624 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200625 cricket::AudioRecvParameters parameters;
626 parameters.codecs.push_back(kIsacCodec);
627 parameters.codecs.push_back(kCn16000Codec);
628 parameters.codecs[1].id = kIsacCodec.id;
629 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630}
631
632// Test that we can decode OPUS without stereo parameters.
633TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700634 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200635 cricket::AudioRecvParameters parameters;
636 parameters.codecs.push_back(kIsacCodec);
637 parameters.codecs.push_back(kPcmuCodec);
638 parameters.codecs.push_back(kOpusCodec);
639 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 EXPECT_TRUE(channel_->AddRecvStream(
641 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700642 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800644 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Even without stereo parameters, recv codecs still specify channels = 2.
646 EXPECT_EQ(2, opus.channels);
647 EXPECT_EQ(111, opus.pltype);
648 EXPECT_STREQ("opus", opus.plname);
649 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700650 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 EXPECT_EQ(111, opus.pltype);
652}
653
654// Test that we can decode OPUS with stereo = 0.
655TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700656 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200657 cricket::AudioRecvParameters parameters;
658 parameters.codecs.push_back(kIsacCodec);
659 parameters.codecs.push_back(kPcmuCodec);
660 parameters.codecs.push_back(kOpusCodec);
661 parameters.codecs[2].params["stereo"] = "0";
662 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 EXPECT_TRUE(channel_->AddRecvStream(
664 cricket::StreamParams::CreateLegacy(kSsrc1)));
665 int channel_num2 = voe_.GetLastChannel();
666 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800667 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 // Even when stereo is off, recv codecs still specify channels = 2.
669 EXPECT_EQ(2, opus.channels);
670 EXPECT_EQ(111, opus.pltype);
671 EXPECT_STREQ("opus", opus.plname);
672 opus.pltype = 0;
673 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
674 EXPECT_EQ(111, opus.pltype);
675}
676
677// Test that we can decode OPUS with stereo = 1.
678TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700679 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200680 cricket::AudioRecvParameters parameters;
681 parameters.codecs.push_back(kIsacCodec);
682 parameters.codecs.push_back(kPcmuCodec);
683 parameters.codecs.push_back(kOpusCodec);
684 parameters.codecs[2].params["stereo"] = "1";
685 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 EXPECT_TRUE(channel_->AddRecvStream(
687 cricket::StreamParams::CreateLegacy(kSsrc1)));
688 int channel_num2 = voe_.GetLastChannel();
689 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800690 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 EXPECT_EQ(2, opus.channels);
692 EXPECT_EQ(111, opus.pltype);
693 EXPECT_STREQ("opus", opus.plname);
694 opus.pltype = 0;
695 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
696 EXPECT_EQ(111, opus.pltype);
697}
698
699// Test that changes to recv codecs are applied to all streams.
700TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700701 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200702 cricket::AudioRecvParameters parameters;
703 parameters.codecs.push_back(kIsacCodec);
704 parameters.codecs.push_back(kPcmuCodec);
705 parameters.codecs.push_back(kTelephoneEventCodec);
706 parameters.codecs[0].id = 106; // collide with existing telephone-event
707 parameters.codecs[2].id = 126;
708 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_TRUE(channel_->AddRecvStream(
710 cricket::StreamParams::CreateLegacy(kSsrc1)));
711 int channel_num2 = voe_.GetLastChannel();
712 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800713 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714 gcodec.plfreq = 16000;
715 gcodec.channels = 1;
716 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
717 EXPECT_EQ(106, gcodec.pltype);
718 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800719 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 gcodec.plfreq = 8000;
721 gcodec.channels = 1;
722 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
723 EXPECT_EQ(126, gcodec.pltype);
724 EXPECT_STREQ("telephone-event", gcodec.plname);
725}
726
727TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700728 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200729 cricket::AudioRecvParameters parameters;
730 parameters.codecs.push_back(kIsacCodec);
731 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200732 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733
734 int channel_num2 = voe_.GetLastChannel();
735 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800736 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 gcodec.plfreq = 16000;
738 gcodec.channels = 1;
739 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
740 EXPECT_EQ(106, gcodec.pltype);
741 EXPECT_STREQ("ISAC", gcodec.plname);
742}
743
744// Test that we can apply the same set of codecs again while playing.
745TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700746 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200747 cricket::AudioRecvParameters parameters;
748 parameters.codecs.push_back(kIsacCodec);
749 parameters.codecs.push_back(kCn16000Codec);
750 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200752 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753
754 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755 parameters.codecs[0].id = 127;
756 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
757 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_TRUE(voe_.GetPlayout(channel_num));
759}
760
761// Test that we can add a codec while playing.
762TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700763 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764 cricket::AudioRecvParameters parameters;
765 parameters.codecs.push_back(kIsacCodec);
766 parameters.codecs.push_back(kCn16000Codec);
767 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768 EXPECT_TRUE(channel_->SetPlayout(true));
769
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200770 parameters.codecs.push_back(kOpusCodec);
771 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
772 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 EXPECT_TRUE(voe_.GetPlayout(channel_num));
774 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800775 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
777}
778
779TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700780 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000782 // Test that when autobw is enabled, bitrate is kept as the default
783 // value. autobw is enabled for the following tests because the target
784 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785
786 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700787 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788
789 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700790 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700793 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794}
795
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000796TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700797 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000799 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
801 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700802 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
803 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
804 // Rates above the max (56000) should be capped.
805 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000807 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700808 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
809 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
810 // Rates above the max (510000) should be capped.
811 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812}
813
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000814TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700815 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000816
817 // Test that we can only set a maximum bitrate for a fixed-rate codec
818 // if it's bigger than the fixed rate.
819
820 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700821 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
822 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
823 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
824 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
825 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
826 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
827 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000828}
829
830TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700831 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200832 const int kDesiredBitrate = 128000;
833 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700834 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835 parameters.max_bandwidth_bps = kDesiredBitrate;
836 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000837
838 EXPECT_TRUE(channel_->AddSendStream(
839 cricket::StreamParams::CreateLegacy(kSsrc1)));
840
841 int channel_num = voe_.GetLastChannel();
842 webrtc::CodecInst codec;
843 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000845}
846
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847// Test that bitrate cannot be set for CBR codecs.
848// Bitrate is ignored if it is higher than the fixed bitrate.
849// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000850TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700851 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852
853 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200854 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
855 int channel_num = voe_.GetLastChannel();
856 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
858 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200859
860 send_parameters_.max_bandwidth_bps = 128000;
861 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
863 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200864
865 send_parameters_.max_bandwidth_bps = 128;
866 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
868 EXPECT_EQ(64000, codec.rate);
869}
870
skvlade0d46372016-04-07 22:59:22 -0700871// Test that the per-stream bitrate limit and the global
872// bitrate limit both apply.
873TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
874 EXPECT_TRUE(SetupSendStream());
875
876 // opus, default bitrate == 64000.
877 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
878 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
879 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
880 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
881
882 // CBR codecs allow both maximums to exceed the bitrate.
883 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
884 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
885 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
886 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
887
888 // CBR codecs don't allow per stream maximums to be too low.
889 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
890 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
891}
892
893// Test that an attempt to set RtpParameters for a stream that does not exist
894// fails.
895TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
896 EXPECT_TRUE(SetupChannel());
897 webrtc::RtpParameters nonexistent_parameters =
898 channel_->GetRtpParameters(kSsrc1);
899 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
900
901 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
902 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, nonexistent_parameters));
903}
904
905TEST_F(WebRtcVoiceEngineTestFake,
906 CannotSetRtpParametersWithIncorrectNumberOfEncodings) {
907 // This test verifies that setting RtpParameters succeeds only if
908 // the structure contains exactly one encoding.
909 // TODO(skvlad): Update this test when we start supporting setting parameters
910 // for each encoding individually.
911
912 EXPECT_TRUE(SetupSendStream());
913 // Setting RtpParameters with no encoding is expected to fail.
914 webrtc::RtpParameters parameters;
915 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
916 // Setting RtpParameters with exactly one encoding should succeed.
917 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
918 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
919 // Two or more encodings should result in failure.
920 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
921 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
922}
923
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700924// Test that a stream will not be sending if its encoding is made
925// inactive through SetRtpParameters.
926TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
927 EXPECT_TRUE(SetupSendStream());
928 SetSend(channel_, true);
929 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
930 // Get current parameters and change "active" to false.
931 webrtc::RtpParameters parameters = channel_->GetRtpParameters(kSsrc1);
932 ASSERT_EQ(1u, parameters.encodings.size());
933 ASSERT_TRUE(parameters.encodings[0].active);
934 parameters.encodings[0].active = false;
935 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
936 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
937
938 // Now change it back to active and verify we resume sending.
939 parameters.encodings[0].active = true;
940 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
941 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
942}
943
skvlade0d46372016-04-07 22:59:22 -0700944// Test that SetRtpParameters configures the correct encoding channel for each
945// SSRC.
946TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
947 SetupForMultiSendStream();
948 // Create send streams.
949 for (uint32_t ssrc : kSsrcs4) {
950 EXPECT_TRUE(
951 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
952 }
953 // Configure one stream to be limited by the stream config, another to be
954 // limited by the global max, and the third one with no per-stream limit
955 // (still subject to the global limit).
956 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
957 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
958 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
959 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
960
961 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
962 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
963 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
964
965 // Remove the global cap; the streams should switch to their respective
966 // maximums (or remain unchanged if there was no other limit on them.)
967 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
968 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
969 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
970 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
971}
972
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700973// Test that GetRtpParameters returns the currently configured codecs.
974TEST_F(WebRtcVoiceEngineTestFake, GetRtpParametersCodecs) {
975 EXPECT_TRUE(SetupSendStream());
976 cricket::AudioSendParameters parameters;
977 parameters.codecs.push_back(kIsacCodec);
978 parameters.codecs.push_back(kPcmuCodec);
979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
980
981 webrtc::RtpParameters rtp_parameters = channel_->GetRtpParameters(kSsrc1);
982 ASSERT_EQ(2u, rtp_parameters.codecs.size());
983 EXPECT_EQ(kIsacCodec.id, rtp_parameters.codecs[0].payload_type);
984 EXPECT_EQ(kIsacCodec.name, rtp_parameters.codecs[0].mime_type);
985 EXPECT_EQ(kIsacCodec.clockrate, rtp_parameters.codecs[0].clock_rate);
986 EXPECT_EQ(kIsacCodec.channels, rtp_parameters.codecs[0].channels);
987 EXPECT_EQ(kPcmuCodec.id, rtp_parameters.codecs[1].payload_type);
988 EXPECT_EQ(kPcmuCodec.name, rtp_parameters.codecs[1].mime_type);
989 EXPECT_EQ(kPcmuCodec.clockrate, rtp_parameters.codecs[1].clock_rate);
990 EXPECT_EQ(kPcmuCodec.channels, rtp_parameters.codecs[1].channels);
991}
992
993// Test that if we set/get parameters multiple times, we get the same results.
994TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpParameters) {
995 EXPECT_TRUE(SetupSendStream());
996 cricket::AudioSendParameters parameters;
997 parameters.codecs.push_back(kIsacCodec);
998 parameters.codecs.push_back(kPcmuCodec);
999 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1000
1001 webrtc::RtpParameters initial_params = channel_->GetRtpParameters(kSsrc1);
1002
1003 // We should be able to set the params we just got.
1004 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, initial_params));
1005
1006 // ... And this shouldn't change the params returned by GetRtpParameters.
1007 webrtc::RtpParameters new_params = channel_->GetRtpParameters(kSsrc1);
1008 EXPECT_EQ(initial_params, channel_->GetRtpParameters(kSsrc1));
1009}
1010
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001011// Test that we apply codecs properly.
1012TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001013 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001014 cricket::AudioSendParameters parameters;
1015 parameters.codecs.push_back(kIsacCodec);
1016 parameters.codecs.push_back(kPcmuCodec);
1017 parameters.codecs.push_back(kRedCodec);
1018 parameters.codecs[0].id = 96;
1019 parameters.codecs[0].bitrate = 48000;
1020 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001021 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001022 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001023 webrtc::CodecInst gcodec;
1024 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1025 EXPECT_EQ(96, gcodec.pltype);
1026 EXPECT_EQ(48000, gcodec.rate);
1027 EXPECT_STREQ("ISAC", gcodec.plname);
1028 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001029 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1031 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001032 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033}
1034
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001035// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1036// to apply.
1037TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001038 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001039 cricket::AudioSendParameters parameters;
1040 parameters.codecs.push_back(kIsacCodec);
1041 parameters.codecs.push_back(kPcmuCodec);
1042 parameters.codecs.push_back(kRedCodec);
1043 parameters.codecs[0].id = 96;
1044 parameters.codecs[0].bitrate = 48000;
1045 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001046 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1047 // Calling SetSendCodec again with same codec which is already set.
1048 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001050 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1051}
1052
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001053// Verify that G722 is set with 16000 samples per second to WebRTC.
1054TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001055 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001056 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001057 cricket::AudioSendParameters parameters;
1058 parameters.codecs.push_back(kG722CodecSdp);
1059 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001060 webrtc::CodecInst gcodec;
1061 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1062 EXPECT_STREQ("G722", gcodec.plname);
1063 EXPECT_EQ(1, gcodec.channels);
1064 EXPECT_EQ(16000, gcodec.plfreq);
1065}
1066
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001067// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001068TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001069 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 cricket::AudioSendParameters parameters;
1071 parameters.codecs.push_back(kOpusCodec);
1072 parameters.codecs[0].bitrate = 0;
1073 parameters.codecs[0].clockrate = 50000;
1074 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075}
1076
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001077// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001078TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001079 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001080 cricket::AudioSendParameters parameters;
1081 parameters.codecs.push_back(kOpusCodec);
1082 parameters.codecs[0].bitrate = 0;
1083 parameters.codecs[0].channels = 0;
1084 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085}
1086
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001087// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001089 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001090 cricket::AudioSendParameters parameters;
1091 parameters.codecs.push_back(kOpusCodec);
1092 parameters.codecs[0].bitrate = 0;
1093 parameters.codecs[0].channels = 0;
1094 parameters.codecs[0].params["stereo"] = "1";
1095 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096}
1097
1098// Test that if channel is 1 for opus and there's no stereo, we fail.
1099TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001100 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001101 cricket::AudioSendParameters parameters;
1102 parameters.codecs.push_back(kOpusCodec);
1103 parameters.codecs[0].bitrate = 0;
1104 parameters.codecs[0].channels = 1;
1105 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106}
1107
1108// Test that if channel is 1 for opus and stereo=0, we fail.
1109TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001110 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001111 cricket::AudioSendParameters parameters;
1112 parameters.codecs.push_back(kOpusCodec);
1113 parameters.codecs[0].bitrate = 0;
1114 parameters.codecs[0].channels = 1;
1115 parameters.codecs[0].params["stereo"] = "0";
1116 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117}
1118
1119// Test that if channel is 1 for opus and stereo=1, we fail.
1120TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001121 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001122 cricket::AudioSendParameters parameters;
1123 parameters.codecs.push_back(kOpusCodec);
1124 parameters.codecs[0].bitrate = 0;
1125 parameters.codecs[0].channels = 1;
1126 parameters.codecs[0].params["stereo"] = "1";
1127 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128}
1129
1130// Test that with bitrate=0 and no stereo,
1131// channels and bitrate are 1 and 32000.
1132TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001133 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001135 cricket::AudioSendParameters parameters;
1136 parameters.codecs.push_back(kOpusCodec);
1137 parameters.codecs[0].bitrate = 0;
1138 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 webrtc::CodecInst gcodec;
1140 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1141 EXPECT_STREQ("opus", gcodec.plname);
1142 EXPECT_EQ(1, gcodec.channels);
1143 EXPECT_EQ(32000, gcodec.rate);
1144}
1145
1146// Test that with bitrate=0 and stereo=0,
1147// channels and bitrate are 1 and 32000.
1148TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001149 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001151 cricket::AudioSendParameters parameters;
1152 parameters.codecs.push_back(kOpusCodec);
1153 parameters.codecs[0].bitrate = 0;
1154 parameters.codecs[0].params["stereo"] = "0";
1155 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156 webrtc::CodecInst gcodec;
1157 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1158 EXPECT_STREQ("opus", gcodec.plname);
1159 EXPECT_EQ(1, gcodec.channels);
1160 EXPECT_EQ(32000, gcodec.rate);
1161}
1162
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001163// Test that with bitrate=invalid and stereo=0,
1164// channels and bitrate are 1 and 32000.
1165TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001166 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001167 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 cricket::AudioSendParameters parameters;
1169 parameters.codecs.push_back(kOpusCodec);
1170 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001171 webrtc::CodecInst gcodec;
1172
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001173 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001174 parameters.codecs[0].bitrate = 5999;
1175 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001176 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1177 EXPECT_STREQ("opus", gcodec.plname);
1178 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001179 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001180
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001181 parameters.codecs[0].bitrate = 510001;
1182 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001183 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1184 EXPECT_STREQ("opus", gcodec.plname);
1185 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001186 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001187}
1188
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189// Test that with bitrate=0 and stereo=1,
1190// channels and bitrate are 2 and 64000.
1191TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001192 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001193 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001194 cricket::AudioSendParameters parameters;
1195 parameters.codecs.push_back(kOpusCodec);
1196 parameters.codecs[0].bitrate = 0;
1197 parameters.codecs[0].params["stereo"] = "1";
1198 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199 webrtc::CodecInst gcodec;
1200 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1201 EXPECT_STREQ("opus", gcodec.plname);
1202 EXPECT_EQ(2, gcodec.channels);
1203 EXPECT_EQ(64000, gcodec.rate);
1204}
1205
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001206// Test that with bitrate=invalid and stereo=1,
1207// channels and bitrate are 2 and 64000.
1208TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001209 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001210 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001211 cricket::AudioSendParameters parameters;
1212 parameters.codecs.push_back(kOpusCodec);
1213 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001214 webrtc::CodecInst gcodec;
1215
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001216 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001217 parameters.codecs[0].bitrate = 5999;
1218 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001219 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1220 EXPECT_STREQ("opus", gcodec.plname);
1221 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001222 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001223
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001224 parameters.codecs[0].bitrate = 510001;
1225 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001226 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1227 EXPECT_STREQ("opus", gcodec.plname);
1228 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001229 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001230}
1231
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001232// Test that with bitrate=N and stereo unset,
1233// channels and bitrate are 1 and N.
1234TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001235 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001236 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001237 cricket::AudioSendParameters parameters;
1238 parameters.codecs.push_back(kOpusCodec);
1239 parameters.codecs[0].bitrate = 96000;
1240 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001241 webrtc::CodecInst gcodec;
1242 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1243 EXPECT_EQ(111, gcodec.pltype);
1244 EXPECT_EQ(96000, gcodec.rate);
1245 EXPECT_STREQ("opus", gcodec.plname);
1246 EXPECT_EQ(1, gcodec.channels);
1247 EXPECT_EQ(48000, gcodec.plfreq);
1248}
1249
1250// Test that with bitrate=N and stereo=0,
1251// channels and bitrate are 1 and N.
1252TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001253 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001254 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001255 cricket::AudioSendParameters parameters;
1256 parameters.codecs.push_back(kOpusCodec);
1257 parameters.codecs[0].bitrate = 30000;
1258 parameters.codecs[0].params["stereo"] = "0";
1259 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001260 webrtc::CodecInst gcodec;
1261 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1262 EXPECT_EQ(1, gcodec.channels);
1263 EXPECT_EQ(30000, gcodec.rate);
1264 EXPECT_STREQ("opus", gcodec.plname);
1265}
1266
1267// Test that with bitrate=N and without any parameters,
1268// channels and bitrate are 1 and N.
1269TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001270 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001272 cricket::AudioSendParameters parameters;
1273 parameters.codecs.push_back(kOpusCodec);
1274 parameters.codecs[0].bitrate = 30000;
1275 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001276 webrtc::CodecInst gcodec;
1277 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1278 EXPECT_EQ(1, gcodec.channels);
1279 EXPECT_EQ(30000, gcodec.rate);
1280 EXPECT_STREQ("opus", gcodec.plname);
1281}
1282
1283// Test that with bitrate=N and stereo=1,
1284// channels and bitrate are 2 and N.
1285TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001286 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001287 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001288 cricket::AudioSendParameters parameters;
1289 parameters.codecs.push_back(kOpusCodec);
1290 parameters.codecs[0].bitrate = 30000;
1291 parameters.codecs[0].params["stereo"] = "1";
1292 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293 webrtc::CodecInst gcodec;
1294 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1295 EXPECT_EQ(2, gcodec.channels);
1296 EXPECT_EQ(30000, gcodec.rate);
1297 EXPECT_STREQ("opus", gcodec.plname);
1298}
1299
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001300// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1301// Also test that the "maxaveragebitrate" can't be set to values outside the
1302// range of 6000 and 510000
1303TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001304 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001305 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001306 cricket::AudioSendParameters parameters;
1307 parameters.codecs.push_back(kOpusCodec);
1308 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001309 webrtc::CodecInst gcodec;
1310
1311 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001312 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1313 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001314 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001315 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001316
1317 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001318 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1319 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001320 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001321 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001322
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001323 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1324 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001325 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1326 EXPECT_EQ(200000, gcodec.rate);
1327}
1328
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001329// Test that we can enable NACK with opus as caller.
1330TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001331 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001332 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001333 cricket::AudioSendParameters parameters;
1334 parameters.codecs.push_back(kOpusCodec);
1335 parameters.codecs[0].AddFeedbackParam(
1336 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1337 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001338 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001339 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340 EXPECT_TRUE(voe_.GetNACK(channel_num));
1341}
1342
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001343// Test that we can enable NACK with opus as callee.
1344TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001345 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001346 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001347 cricket::AudioSendParameters parameters;
1348 parameters.codecs.push_back(kOpusCodec);
1349 parameters.codecs[0].AddFeedbackParam(
1350 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1351 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001352 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001353 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001354 // NACK should be enabled even with no send stream.
1355 EXPECT_TRUE(voe_.GetNACK(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001356
1357 EXPECT_TRUE(channel_->AddSendStream(
1358 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001359 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001360}
1361
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001362// Test that we can enable NACK on receive streams.
1363TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001364 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 int channel_num1 = voe_.GetLastChannel();
1366 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1367 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 cricket::AudioSendParameters parameters;
1369 parameters.codecs.push_back(kOpusCodec);
1370 parameters.codecs[0].AddFeedbackParam(
1371 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1372 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1374 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001375 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1377 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1378}
1379
1380// Test that we can disable NACK.
1381TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001382 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001383 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001384 cricket::AudioSendParameters parameters;
1385 parameters.codecs.push_back(kOpusCodec);
1386 parameters.codecs[0].AddFeedbackParam(
1387 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1388 cricket::kParamValueEmpty));
1389 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001390 EXPECT_TRUE(voe_.GetNACK(channel_num));
1391
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001392 parameters.codecs.clear();
1393 parameters.codecs.push_back(kOpusCodec);
1394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001395 EXPECT_FALSE(voe_.GetNACK(channel_num));
1396}
1397
1398// Test that we can disable NACK on receive streams.
1399TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001400 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001401 int channel_num1 = voe_.GetLastChannel();
1402 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1403 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 cricket::AudioSendParameters parameters;
1405 parameters.codecs.push_back(kOpusCodec);
1406 parameters.codecs[0].AddFeedbackParam(
1407 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1408 cricket::kParamValueEmpty));
1409 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001410 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1411 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1412
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001413 parameters.codecs.clear();
1414 parameters.codecs.push_back(kOpusCodec);
1415 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1417 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1418}
1419
1420// Test that NACK is enabled on a new receive stream.
1421TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001422 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001423 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001424 cricket::AudioSendParameters parameters;
1425 parameters.codecs.push_back(kIsacCodec);
1426 parameters.codecs.push_back(kCn16000Codec);
1427 parameters.codecs[0].AddFeedbackParam(
1428 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1429 cricket::kParamValueEmpty));
1430 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001431 EXPECT_TRUE(voe_.GetNACK(channel_num));
1432
1433 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1434 channel_num = voe_.GetLastChannel();
1435 EXPECT_TRUE(voe_.GetNACK(channel_num));
1436 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1437 channel_num = voe_.GetLastChannel();
1438 EXPECT_TRUE(voe_.GetNACK(channel_num));
1439}
1440
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001441// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001442TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001443 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001444 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001445 cricket::AudioSendParameters parameters;
1446 parameters.codecs.push_back(kOpusCodec);
1447 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001448 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1449}
1450
1451// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001452TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001453 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001454 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001455 cricket::AudioSendParameters parameters;
1456 parameters.codecs.push_back(kOpusCodec);
1457 parameters.codecs[0].bitrate = 0;
1458 parameters.codecs[0].params["useinbandfec"] = "0";
1459 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001460 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1461 webrtc::CodecInst gcodec;
1462 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1463 EXPECT_STREQ("opus", gcodec.plname);
1464 EXPECT_EQ(1, gcodec.channels);
1465 EXPECT_EQ(32000, gcodec.rate);
1466}
1467
1468// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001469TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001470 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001471 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001472 cricket::AudioSendParameters parameters;
1473 parameters.codecs.push_back(kOpusCodec);
1474 parameters.codecs[0].bitrate = 0;
1475 parameters.codecs[0].params["useinbandfec"] = "1";
1476 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001477 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1478 webrtc::CodecInst gcodec;
1479 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1480 EXPECT_STREQ("opus", gcodec.plname);
1481 EXPECT_EQ(1, gcodec.channels);
1482 EXPECT_EQ(32000, gcodec.rate);
1483}
1484
1485// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001486TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001487 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001488 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001489 cricket::AudioSendParameters parameters;
1490 parameters.codecs.push_back(kOpusCodec);
1491 parameters.codecs[0].bitrate = 0;
1492 parameters.codecs[0].params["stereo"] = "1";
1493 parameters.codecs[0].params["useinbandfec"] = "1";
1494 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001495 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1496 webrtc::CodecInst gcodec;
1497 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1498 EXPECT_STREQ("opus", gcodec.plname);
1499 EXPECT_EQ(2, gcodec.channels);
1500 EXPECT_EQ(64000, gcodec.rate);
1501}
1502
1503// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001504TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001505 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001506 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001507 cricket::AudioSendParameters parameters;
1508 parameters.codecs.push_back(kIsacCodec);
1509 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001510 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1511}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001512
1513// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1514TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001515 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001516 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001517 cricket::AudioSendParameters parameters;
1518 parameters.codecs.push_back(kIsacCodec);
1519 parameters.codecs[0].params["useinbandfec"] = "1";
1520 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001521 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1522}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001523
1524// Test that Opus FEC status can be changed.
1525TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001526 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001527 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001528 cricket::AudioSendParameters parameters;
1529 parameters.codecs.push_back(kOpusCodec);
1530 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001531 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001532 parameters.codecs[0].params["useinbandfec"] = "1";
1533 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001534 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1535}
1536
stefanba4c0e42016-02-04 04:12:24 -08001537TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001538 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001539 cricket::AudioSendParameters send_parameters;
1540 send_parameters.codecs.push_back(kOpusCodec);
1541 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1542 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1543
1544 cricket::AudioRecvParameters recv_parameters;
1545 recv_parameters.codecs.push_back(kIsacCodec);
1546 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1547 EXPECT_TRUE(
1548 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1549 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1550 EXPECT_FALSE(
1551 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1552
solenbergbc37fc82016-04-04 09:54:44 -07001553 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001554 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1555 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1556 EXPECT_TRUE(
1557 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1558}
1559
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1561TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001562 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001563 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001564 cricket::AudioSendParameters parameters;
1565 parameters.codecs.push_back(kOpusCodec);
1566 parameters.codecs[0].bitrate = 0;
1567 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1568 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001569 EXPECT_EQ(cricket::kOpusBandwidthNb,
1570 voe_.GetMaxEncodingBandwidth(channel_num));
1571 webrtc::CodecInst gcodec;
1572 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1573 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001574
1575 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001576 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1577 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001578 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1579 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001580}
1581
1582// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1583TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001584 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001585 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 cricket::AudioSendParameters parameters;
1587 parameters.codecs.push_back(kOpusCodec);
1588 parameters.codecs[0].bitrate = 0;
1589 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1590 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001591 EXPECT_EQ(cricket::kOpusBandwidthMb,
1592 voe_.GetMaxEncodingBandwidth(channel_num));
1593 webrtc::CodecInst gcodec;
1594 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1595 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001596
1597 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001598 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1599 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001600 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1601 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001602}
1603
1604// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1605TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001606 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001607 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001608 cricket::AudioSendParameters parameters;
1609 parameters.codecs.push_back(kOpusCodec);
1610 parameters.codecs[0].bitrate = 0;
1611 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1612 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001613 EXPECT_EQ(cricket::kOpusBandwidthWb,
1614 voe_.GetMaxEncodingBandwidth(channel_num));
1615 webrtc::CodecInst gcodec;
1616 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1617 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001618
1619 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001620 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001622 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1623 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001624}
1625
1626// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1627TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001628 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001629 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001630 cricket::AudioSendParameters parameters;
1631 parameters.codecs.push_back(kOpusCodec);
1632 parameters.codecs[0].bitrate = 0;
1633 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1634 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001635 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1636 voe_.GetMaxEncodingBandwidth(channel_num));
1637 webrtc::CodecInst gcodec;
1638 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1639 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001640
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001641 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001642 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1643 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001644 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1645 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001646}
1647
1648// Test 24000 < maxplaybackrate triggers Opus full band mode.
1649TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001650 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001651 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001652 cricket::AudioSendParameters parameters;
1653 parameters.codecs.push_back(kOpusCodec);
1654 parameters.codecs[0].bitrate = 0;
1655 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1656 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001657 EXPECT_EQ(cricket::kOpusBandwidthFb,
1658 voe_.GetMaxEncodingBandwidth(channel_num));
1659 webrtc::CodecInst gcodec;
1660 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1661 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001662
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001663 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001664 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1665 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001666 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1667 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001668}
1669
1670// Test Opus that without maxplaybackrate, default playback rate is used.
1671TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001672 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001673 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001674 cricket::AudioSendParameters parameters;
1675 parameters.codecs.push_back(kOpusCodec);
1676 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001677 EXPECT_EQ(cricket::kOpusBandwidthFb,
1678 voe_.GetMaxEncodingBandwidth(channel_num));
1679}
1680
1681// Test the with non-Opus, maxplaybackrate has no effect.
1682TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001683 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001684 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001685 cricket::AudioSendParameters parameters;
1686 parameters.codecs.push_back(kIsacCodec);
1687 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1688 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001689 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1690}
1691
1692// Test maxplaybackrate can be set on two streams.
1693TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001694 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001695 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001696 cricket::AudioSendParameters parameters;
1697 parameters.codecs.push_back(kOpusCodec);
1698 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001699 // Default bandwidth is 24000.
1700 EXPECT_EQ(cricket::kOpusBandwidthFb,
1701 voe_.GetMaxEncodingBandwidth(channel_num));
1702
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001704
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001706 EXPECT_EQ(cricket::kOpusBandwidthNb,
1707 voe_.GetMaxEncodingBandwidth(channel_num));
1708
1709 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1710 channel_num = voe_.GetLastChannel();
1711 EXPECT_EQ(cricket::kOpusBandwidthNb,
1712 voe_.GetMaxEncodingBandwidth(channel_num));
1713}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001714
Minyue Li7100dcd2015-03-27 05:05:59 +01001715// Test that with usedtx=0, Opus DTX is off.
1716TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001717 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001718 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001719 cricket::AudioSendParameters parameters;
1720 parameters.codecs.push_back(kOpusCodec);
1721 parameters.codecs[0].params["usedtx"] = "0";
1722 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001723 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1724}
1725
1726// Test that with usedtx=1, Opus DTX is on.
1727TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001728 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001729 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001730 cricket::AudioSendParameters parameters;
1731 parameters.codecs.push_back(kOpusCodec);
1732 parameters.codecs[0].params["usedtx"] = "1";
1733 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001734 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1735 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1736}
1737
1738// Test that usedtx=1 works with stereo Opus.
1739TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001740 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001741 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001742 cricket::AudioSendParameters parameters;
1743 parameters.codecs.push_back(kOpusCodec);
1744 parameters.codecs[0].params["usedtx"] = "1";
1745 parameters.codecs[0].params["stereo"] = "1";
1746 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001747 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1748 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1749}
1750
1751// Test that usedtx=1 does not work with non Opus.
1752TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001753 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001754 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001755 cricket::AudioSendParameters parameters;
1756 parameters.codecs.push_back(kIsacCodec);
1757 parameters.codecs[0].params["usedtx"] = "1";
1758 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001759 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1760}
1761
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001762// Test that we can switch back and forth between Opus and ISAC with CN.
1763TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001764 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001766 cricket::AudioSendParameters opus_parameters;
1767 opus_parameters.codecs.push_back(kOpusCodec);
1768 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 webrtc::CodecInst gcodec;
1770 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001771 EXPECT_EQ(111, gcodec.pltype);
1772 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001773
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001774 cricket::AudioSendParameters isac_parameters;
1775 isac_parameters.codecs.push_back(kIsacCodec);
1776 isac_parameters.codecs.push_back(kCn16000Codec);
1777 isac_parameters.codecs.push_back(kOpusCodec);
1778 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001779 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1780 EXPECT_EQ(103, gcodec.pltype);
1781 EXPECT_STREQ("ISAC", gcodec.plname);
1782
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001783 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001785 EXPECT_EQ(111, gcodec.pltype);
1786 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787}
1788
1789// Test that we handle various ways of specifying bitrate.
1790TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001791 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001793 cricket::AudioSendParameters parameters;
1794 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1795 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796 webrtc::CodecInst gcodec;
1797 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1798 EXPECT_EQ(103, gcodec.pltype);
1799 EXPECT_STREQ("ISAC", gcodec.plname);
1800 EXPECT_EQ(32000, gcodec.rate);
1801
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001802 parameters.codecs[0].bitrate = 0; // bitrate == default
1803 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1805 EXPECT_EQ(103, gcodec.pltype);
1806 EXPECT_STREQ("ISAC", gcodec.plname);
1807 EXPECT_EQ(-1, gcodec.rate);
1808
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001809 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1810 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1812 EXPECT_EQ(103, gcodec.pltype);
1813 EXPECT_STREQ("ISAC", gcodec.plname);
1814 EXPECT_EQ(28000, gcodec.rate);
1815
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001816 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1817 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1819 EXPECT_EQ(0, gcodec.pltype);
1820 EXPECT_STREQ("PCMU", gcodec.plname);
1821 EXPECT_EQ(64000, gcodec.rate);
1822
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001823 parameters.codecs[0].bitrate = 0; // bitrate == default
1824 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1826 EXPECT_EQ(0, gcodec.pltype);
1827 EXPECT_STREQ("PCMU", gcodec.plname);
1828 EXPECT_EQ(64000, gcodec.rate);
1829
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001830 parameters.codecs[0] = kOpusCodec;
1831 parameters.codecs[0].bitrate = 0; // bitrate == default
1832 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1834 EXPECT_EQ(111, gcodec.pltype);
1835 EXPECT_STREQ("opus", gcodec.plname);
1836 EXPECT_EQ(32000, gcodec.rate);
1837}
1838
Brave Yao5225dd82015-03-26 07:39:19 +08001839// Test that we could set packet size specified in kCodecParamPTime.
1840TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001841 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001842 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 cricket::AudioSendParameters parameters;
1844 parameters.codecs.push_back(kOpusCodec);
1845 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1846 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001847 webrtc::CodecInst gcodec;
1848 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1849 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1850
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001851 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1852 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001853 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1854 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1855
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001856 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1857 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001858 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1859 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1860
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001861 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1862 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1863 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001864 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1865 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1866
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001867 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1868 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1869 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001870 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1871 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1872}
1873
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001874// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001875TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001876 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001877 cricket::AudioSendParameters parameters;
1878 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001879}
1880
1881// Test that we can set send codecs even with telephone-event codec as the first
1882// one on the list.
1883TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001884 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001885 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001886 cricket::AudioSendParameters parameters;
1887 parameters.codecs.push_back(kTelephoneEventCodec);
1888 parameters.codecs.push_back(kIsacCodec);
1889 parameters.codecs.push_back(kPcmuCodec);
1890 parameters.codecs[0].id = 98; // DTMF
1891 parameters.codecs[1].id = 96;
1892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001893 webrtc::CodecInst gcodec;
1894 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001895 EXPECT_EQ(96, gcodec.pltype);
1896 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001897 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001898}
1899
solenberg31642aa2016-03-14 08:00:37 -07001900// Test that payload type range is limited for telephone-event codec.
1901TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001902 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001903 cricket::AudioSendParameters parameters;
1904 parameters.codecs.push_back(kTelephoneEventCodec);
1905 parameters.codecs.push_back(kIsacCodec);
1906 parameters.codecs[0].id = 0; // DTMF
1907 parameters.codecs[1].id = 96;
1908 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1909 EXPECT_TRUE(channel_->CanInsertDtmf());
1910 parameters.codecs[0].id = 128; // DTMF
1911 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1912 EXPECT_FALSE(channel_->CanInsertDtmf());
1913 parameters.codecs[0].id = 127;
1914 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1915 EXPECT_TRUE(channel_->CanInsertDtmf());
1916 parameters.codecs[0].id = -1; // DTMF
1917 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1918 EXPECT_FALSE(channel_->CanInsertDtmf());
1919}
1920
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001921// Test that we can set send codecs even with CN codec as the first
1922// one on the list.
1923TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001924 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001925 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001926 cricket::AudioSendParameters parameters;
1927 parameters.codecs.push_back(kCn16000Codec);
1928 parameters.codecs.push_back(kIsacCodec);
1929 parameters.codecs.push_back(kPcmuCodec);
1930 parameters.codecs[0].id = 98; // wideband CN
1931 parameters.codecs[1].id = 96;
1932 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001933 webrtc::CodecInst gcodec;
1934 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1935 EXPECT_EQ(96, gcodec.pltype);
1936 EXPECT_STREQ("ISAC", gcodec.plname);
1937 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938}
1939
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001940// Test that we set VAD and DTMF types correctly as caller.
1941TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001942 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001944 cricket::AudioSendParameters parameters;
1945 parameters.codecs.push_back(kIsacCodec);
1946 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001948 parameters.codecs.push_back(kCn16000Codec);
1949 parameters.codecs.push_back(kCn8000Codec);
1950 parameters.codecs.push_back(kTelephoneEventCodec);
1951 parameters.codecs.push_back(kRedCodec);
1952 parameters.codecs[0].id = 96;
1953 parameters.codecs[2].id = 97; // wideband CN
1954 parameters.codecs[4].id = 98; // DTMF
1955 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 webrtc::CodecInst gcodec;
1957 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1958 EXPECT_EQ(96, gcodec.pltype);
1959 EXPECT_STREQ("ISAC", gcodec.plname);
1960 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001961 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1963 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001964 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965}
1966
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001967// Test that we set VAD and DTMF types correctly as callee.
1968TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001969 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001970 cricket::AudioSendParameters parameters;
1971 parameters.codecs.push_back(kIsacCodec);
1972 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001973 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001974 parameters.codecs.push_back(kCn16000Codec);
1975 parameters.codecs.push_back(kCn8000Codec);
1976 parameters.codecs.push_back(kTelephoneEventCodec);
1977 parameters.codecs.push_back(kRedCodec);
1978 parameters.codecs[0].id = 96;
1979 parameters.codecs[2].id = 97; // wideband CN
1980 parameters.codecs[4].id = 98; // DTMF
1981 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001982 EXPECT_TRUE(channel_->AddSendStream(
1983 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001984 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001985
1986 webrtc::CodecInst gcodec;
1987 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1988 EXPECT_EQ(96, gcodec.pltype);
1989 EXPECT_STREQ("ISAC", gcodec.plname);
1990 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001991 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001992 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1993 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001994 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001995}
1996
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997// Test that we only apply VAD if we have a CN codec that matches the
1998// send codec clockrate.
1999TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002000 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002001 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002002 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002003 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002004 parameters.codecs.push_back(kIsacCodec);
2005 parameters.codecs.push_back(kCn16000Codec);
2006 parameters.codecs[1].id = 97;
2007 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002008 webrtc::CodecInst gcodec;
2009 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2010 EXPECT_STREQ("ISAC", gcodec.plname);
2011 EXPECT_TRUE(voe_.GetVAD(channel_num));
2012 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2013 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002014 parameters.codecs[0] = kPcmuCodec;
2015 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002016 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2017 EXPECT_STREQ("PCMU", gcodec.plname);
2018 EXPECT_FALSE(voe_.GetVAD(channel_num));
2019 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002020 parameters.codecs[1] = kCn8000Codec;
2021 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2023 EXPECT_STREQ("PCMU", gcodec.plname);
2024 EXPECT_TRUE(voe_.GetVAD(channel_num));
2025 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002026 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002027 parameters.codecs[0] = kIsacCodec;
2028 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2030 EXPECT_STREQ("ISAC", gcodec.plname);
2031 EXPECT_FALSE(voe_.GetVAD(channel_num));
2032}
2033
2034// Test that we perform case-insensitive matching of codec names.
2035TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002036 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002037 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002038 cricket::AudioSendParameters parameters;
2039 parameters.codecs.push_back(kIsacCodec);
2040 parameters.codecs.push_back(kPcmuCodec);
2041 parameters.codecs.push_back(kCn16000Codec);
2042 parameters.codecs.push_back(kCn8000Codec);
2043 parameters.codecs.push_back(kTelephoneEventCodec);
2044 parameters.codecs.push_back(kRedCodec);
2045 parameters.codecs[0].name = "iSaC";
2046 parameters.codecs[0].id = 96;
2047 parameters.codecs[2].id = 97; // wideband CN
2048 parameters.codecs[4].id = 98; // DTMF
2049 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002050 webrtc::CodecInst gcodec;
2051 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2052 EXPECT_EQ(96, gcodec.pltype);
2053 EXPECT_STREQ("ISAC", gcodec.plname);
2054 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002055 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002056 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2057 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002058 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002059}
2060
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002061// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002062TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002063 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002065 cricket::AudioSendParameters parameters;
2066 parameters.codecs.push_back(kRedCodec);
2067 parameters.codecs.push_back(kIsacCodec);
2068 parameters.codecs.push_back(kPcmuCodec);
2069 parameters.codecs[0].id = 127;
2070 parameters.codecs[0].params[""] = "96/96";
2071 parameters.codecs[1].id = 96;
2072 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002073 webrtc::CodecInst gcodec;
2074 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2075 EXPECT_EQ(96, gcodec.pltype);
2076 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002077 EXPECT_TRUE(voe_.GetRED(channel_num));
2078 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079}
2080
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002081// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002082TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002083 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002084 cricket::AudioSendParameters parameters;
2085 parameters.codecs.push_back(kRedCodec);
2086 parameters.codecs.push_back(kIsacCodec);
2087 parameters.codecs.push_back(kPcmuCodec);
2088 parameters.codecs[0].id = 127;
2089 parameters.codecs[0].params[""] = "96/96";
2090 parameters.codecs[1].id = 96;
2091 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002092 EXPECT_TRUE(channel_->AddSendStream(
2093 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002094 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002095 webrtc::CodecInst gcodec;
2096 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2097 EXPECT_EQ(96, gcodec.pltype);
2098 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002099 EXPECT_TRUE(voe_.GetRED(channel_num));
2100 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002101}
2102
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002103// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002105 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002107 cricket::AudioSendParameters parameters;
2108 parameters.codecs.push_back(kRedCodec);
2109 parameters.codecs.push_back(kIsacCodec);
2110 parameters.codecs.push_back(kPcmuCodec);
2111 parameters.codecs[0].id = 127;
2112 parameters.codecs[1].id = 96;
2113 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114 webrtc::CodecInst gcodec;
2115 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2116 EXPECT_EQ(96, gcodec.pltype);
2117 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002118 EXPECT_TRUE(voe_.GetRED(channel_num));
2119 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120}
2121
2122// Test that we ignore RED if the parameters aren't named the way we expect.
2123TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002124 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002125 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002126 cricket::AudioSendParameters parameters;
2127 parameters.codecs.push_back(kRedCodec);
2128 parameters.codecs.push_back(kIsacCodec);
2129 parameters.codecs.push_back(kPcmuCodec);
2130 parameters.codecs[0].id = 127;
2131 parameters.codecs[0].params["ABC"] = "96/96";
2132 parameters.codecs[1].id = 96;
2133 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002134 webrtc::CodecInst gcodec;
2135 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2136 EXPECT_EQ(96, gcodec.pltype);
2137 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002138 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002139}
2140
2141// Test that we ignore RED if it uses different primary/secondary encoding.
2142TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002143 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002144 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002145 cricket::AudioSendParameters parameters;
2146 parameters.codecs.push_back(kRedCodec);
2147 parameters.codecs.push_back(kIsacCodec);
2148 parameters.codecs.push_back(kPcmuCodec);
2149 parameters.codecs[0].id = 127;
2150 parameters.codecs[0].params[""] = "96/0";
2151 parameters.codecs[1].id = 96;
2152 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153 webrtc::CodecInst gcodec;
2154 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2155 EXPECT_EQ(96, gcodec.pltype);
2156 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002157 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002158}
2159
2160// Test that we ignore RED if it uses more than 2 encodings.
2161TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002162 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002163 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002164 cricket::AudioSendParameters parameters;
2165 parameters.codecs.push_back(kRedCodec);
2166 parameters.codecs.push_back(kIsacCodec);
2167 parameters.codecs.push_back(kPcmuCodec);
2168 parameters.codecs[0].id = 127;
2169 parameters.codecs[0].params[""] = "96/96/96";
2170 parameters.codecs[1].id = 96;
2171 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002172 webrtc::CodecInst gcodec;
2173 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2174 EXPECT_EQ(96, gcodec.pltype);
2175 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002176 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002177}
2178
2179// Test that we ignore RED if it has bogus codec ids.
2180TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002181 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002182 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002183 cricket::AudioSendParameters parameters;
2184 parameters.codecs.push_back(kRedCodec);
2185 parameters.codecs.push_back(kIsacCodec);
2186 parameters.codecs.push_back(kPcmuCodec);
2187 parameters.codecs[0].id = 127;
2188 parameters.codecs[0].params[""] = "ABC/ABC";
2189 parameters.codecs[1].id = 96;
2190 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002191 webrtc::CodecInst gcodec;
2192 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2193 EXPECT_EQ(96, gcodec.pltype);
2194 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002195 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002196}
2197
2198// Test that we ignore RED if it refers to a codec that is not present.
2199TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002200 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002202 cricket::AudioSendParameters parameters;
2203 parameters.codecs.push_back(kRedCodec);
2204 parameters.codecs.push_back(kIsacCodec);
2205 parameters.codecs.push_back(kPcmuCodec);
2206 parameters.codecs[0].id = 127;
2207 parameters.codecs[0].params[""] = "97/97";
2208 parameters.codecs[1].id = 96;
2209 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002210 webrtc::CodecInst gcodec;
2211 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2212 EXPECT_EQ(96, gcodec.pltype);
2213 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002214 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002215}
2216
stefanba4c0e42016-02-04 04:12:24 -08002217class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2218 public:
2219 WebRtcVoiceEngineWithSendSideBweTest()
2220 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2221};
2222
2223TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2224 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002225 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002226 ASSERT_FALSE(capabilities.header_extensions.empty());
2227 for (const cricket::RtpHeaderExtension& extension :
2228 capabilities.header_extensions) {
2229 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2230 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2231 extension.id);
2232 return;
2233 }
2234 }
2235 FAIL() << "Transport sequence number extension not in header-extension list.";
2236}
2237
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002238// Test support for audio level header extension.
2239TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2240 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002241}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002242TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2243 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2244}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002245
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002246// Test support for absolute send time header extension.
2247TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2248 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2249}
2250TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2251 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002252}
2253
solenberg1ac56142015-10-13 03:58:19 -07002254// Test that we can create a channel and start sending on it.
2255TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002256 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002257 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002258 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002259 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002260 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002261 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2262}
2263
2264// Test that a channel will send if and only if it has a source and is enabled
2265// for sending.
2266TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002267 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002268 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2269 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002270 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002271 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2272 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2273 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2274 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2275 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002276}
2277
solenberg6d6e7c52016-04-13 09:07:30 -07002278// Test that SetSendParameters() does not alter a stream's send state.
2279TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2280 EXPECT_TRUE(SetupSendStream());
2281 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2282
2283 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002284 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002285 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2286
2287 // Changing RTP header extensions will recreate the AudioSendStream.
2288 send_parameters_.extensions.push_back(
2289 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2290 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2291 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2292
2293 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002294 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002295 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2296
2297 // Changing RTP header extensions will recreate the AudioSendStream.
2298 send_parameters_.extensions.clear();
2299 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2300 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2301}
2302
solenberg1ac56142015-10-13 03:58:19 -07002303// Test that we can create a channel and start playing out on it.
2304TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002305 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002306 int channel_num = voe_.GetLastChannel();
2307 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2308 EXPECT_TRUE(channel_->SetPlayout(true));
2309 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310 EXPECT_TRUE(channel_->SetPlayout(false));
2311 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2312}
2313
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002314// Test that we can add and remove send streams.
2315TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2316 SetupForMultiSendStream();
2317
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002318 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002319 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002320
solenbergc96df772015-10-21 13:01:53 -07002321 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002322 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002323 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002324 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002325 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002326 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002327 }
tfarina5237aaf2015-11-10 23:44:30 -08002328 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002329
solenbergc96df772015-10-21 13:01:53 -07002330 // Delete the send streams.
2331 for (uint32_t ssrc : kSsrcs4) {
2332 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002333 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002334 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002335 }
solenbergc96df772015-10-21 13:01:53 -07002336 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002337}
2338
2339// Test SetSendCodecs correctly configure the codecs in all send streams.
2340TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2341 SetupForMultiSendStream();
2342
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002343 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002344 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002345 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002346 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002347 }
2348
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002349 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002350 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002351 parameters.codecs.push_back(kIsacCodec);
2352 parameters.codecs.push_back(kCn16000Codec);
2353 parameters.codecs[1].id = 97;
2354 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002355
2356 // Verify ISAC and VAD are corrected configured on all send channels.
2357 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002358 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002359 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002360 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2361 EXPECT_STREQ("ISAC", gcodec.plname);
2362 EXPECT_TRUE(voe_.GetVAD(channel_num));
2363 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2364 }
2365
2366 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002367 parameters.codecs[0] = kPcmuCodec;
2368 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002369 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002370 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002371 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2372 EXPECT_STREQ("PCMU", gcodec.plname);
2373 EXPECT_FALSE(voe_.GetVAD(channel_num));
2374 }
2375}
2376
2377// Test we can SetSend on all send streams correctly.
2378TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2379 SetupForMultiSendStream();
2380
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002381 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002382 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002383 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002384 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002385 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2386 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002387 }
2388
2389 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002390 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002391 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002392 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002393 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002394 }
2395
2396 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002397 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002398 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002399 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002400 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002401 }
2402}
2403
2404// Test we can set the correct statistics on all send streams.
2405TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2406 SetupForMultiSendStream();
2407
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002408 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002409 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002410 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002411 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002412 }
solenberg85a04962015-10-27 03:35:21 -07002413 SetAudioSendStreamStats();
2414
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002415 // Create a receive stream to check that none of the send streams end up in
2416 // the receive stream stats.
2417 EXPECT_TRUE(channel_->AddRecvStream(
2418 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002419 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002420 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2421 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002422
solenberg85a04962015-10-27 03:35:21 -07002423 // Check stats for the added streams.
2424 {
2425 cricket::VoiceMediaInfo info;
2426 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002427
solenberg85a04962015-10-27 03:35:21 -07002428 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002429 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002430 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002431 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002432 }
2433
2434 // We have added one receive stream. We should see empty stats.
2435 EXPECT_EQ(info.receivers.size(), 1u);
2436 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002437 }
solenberg1ac56142015-10-13 03:58:19 -07002438
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002439 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002440 {
2441 cricket::VoiceMediaInfo info;
2442 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2443 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002444 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002445 EXPECT_EQ(0u, info.receivers.size());
2446 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002447
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002448 // Deliver a new packet - a default receive stream should be created and we
2449 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002450 {
2451 cricket::VoiceMediaInfo info;
2452 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2453 SetAudioReceiveStreamStats();
2454 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002455 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002456 EXPECT_EQ(1u, info.receivers.size());
2457 VerifyVoiceReceiverInfo(info.receivers[0]);
2458 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002459}
2460
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002461// Test that we can add and remove receive streams, and do proper send/playout.
2462// We can receive on multiple streams while sending one stream.
2463TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002464 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002465 int channel_num1 = voe_.GetLastChannel();
2466
solenberg1ac56142015-10-13 03:58:19 -07002467 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002468 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002470 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002471
solenberg1ac56142015-10-13 03:58:19 -07002472 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002473 EXPECT_TRUE(
2474 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002475 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002476 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002477 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478
solenberg1ac56142015-10-13 03:58:19 -07002479 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2481 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2482
2483 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002484 EXPECT_TRUE(
2485 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002486 int channel_num3 = voe_.GetLastChannel();
2487 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2488 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2489 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002490
2491 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002492 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002493 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494
2495 // Stop playout.
2496 EXPECT_TRUE(channel_->SetPlayout(false));
2497 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2498 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2499 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2500
solenberg1ac56142015-10-13 03:58:19 -07002501 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002502 EXPECT_TRUE(channel_->SetPlayout(true));
2503 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2504 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2505 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2506
solenberg1ac56142015-10-13 03:58:19 -07002507 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2509 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002510 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511}
2512
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002513// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002514// and start sending on it.
2515TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002516 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002517 cricket::AudioOptions options_adjust_agc;
2518 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002519 webrtc::AgcConfig agc_config;
2520 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2521 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002522 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002523 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002524 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002525 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2527 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002528 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002529 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002531}
2532
wu@webrtc.org97077a32013-10-25 21:18:33 +00002533TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002534 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002535 EXPECT_CALL(adm_,
2536 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002537 webrtc::AgcConfig agc_config;
2538 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2539 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002540 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2541 send_parameters_.options.tx_agc_digital_compression_gain =
2542 rtc::Optional<uint16_t>(9);
2543 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2544 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2545 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002546 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2547 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2548 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2549 EXPECT_TRUE(agc_config.limiterEnable);
2550
2551 // Check interaction with adjust_agc_delta. Both should be respected, for
2552 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002553 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2554 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002555 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2556 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2557}
2558
wu@webrtc.org97077a32013-10-25 21:18:33 +00002559TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002560 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002561 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2562 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002563 send_parameters_.options.recording_sample_rate =
2564 rtc::Optional<uint32_t>(48000);
2565 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2566 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002567}
2568
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002569// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002570// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002572 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002573 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002574}
2575
2576TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2577 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002578 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002579 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002580 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002581 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002582 EXPECT_TRUE(channel_->AddRecvStream(
2583 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002584 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2585 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586
solenberg85a04962015-10-27 03:35:21 -07002587 // Check stats for the added streams.
2588 {
2589 cricket::VoiceMediaInfo info;
2590 EXPECT_EQ(true, channel_->GetStats(&info));
2591
2592 // We have added one send stream. We should see the stats we've set.
2593 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002594 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002595 // We have added one receive stream. We should see empty stats.
2596 EXPECT_EQ(info.receivers.size(), 1u);
2597 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2598 }
solenberg1ac56142015-10-13 03:58:19 -07002599
solenberg566ef242015-11-06 15:34:49 -08002600 // Start sending - this affects some reported stats.
2601 {
2602 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002603 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002604 EXPECT_EQ(true, channel_->GetStats(&info));
2605 VerifyVoiceSenderInfo(info.senders[0], true);
2606 }
2607
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002608 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002609 {
2610 cricket::VoiceMediaInfo info;
2611 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2612 EXPECT_EQ(true, channel_->GetStats(&info));
2613 EXPECT_EQ(1u, info.senders.size());
2614 EXPECT_EQ(0u, info.receivers.size());
2615 }
solenberg1ac56142015-10-13 03:58:19 -07002616
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002617 // Deliver a new packet - a default receive stream should be created and we
2618 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002619 {
2620 cricket::VoiceMediaInfo info;
2621 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2622 SetAudioReceiveStreamStats();
2623 EXPECT_EQ(true, channel_->GetStats(&info));
2624 EXPECT_EQ(1u, info.senders.size());
2625 EXPECT_EQ(1u, info.receivers.size());
2626 VerifyVoiceReceiverInfo(info.receivers[0]);
2627 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002628}
2629
2630// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002631// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002632TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002633 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002634 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002635 EXPECT_TRUE(channel_->AddRecvStream(
2636 cricket::StreamParams::CreateLegacy(kSsrc2)));
2637 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002638}
2639
2640// Test that the local SSRC is the same on sending and receiving channels if the
2641// receive channel is created before the send channel.
2642TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002643 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2645 int receive_channel_num = voe_.GetLastChannel();
2646 EXPECT_TRUE(channel_->AddSendStream(
2647 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002648
solenberg3a941542015-11-16 07:34:50 -08002649 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002650 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651}
2652
2653// Test that we can properly receive packets.
2654TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002655 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002656 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002657 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002658
2659 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2660 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661}
2662
2663// Test that we can properly receive packets on multiple streams.
2664TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002665 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002666 const uint32_t ssrc1 = 1;
2667 const uint32_t ssrc2 = 2;
2668 const uint32_t ssrc3 = 3;
2669 EXPECT_TRUE(channel_->AddRecvStream(
2670 cricket::StreamParams::CreateLegacy(ssrc1)));
2671 EXPECT_TRUE(channel_->AddRecvStream(
2672 cricket::StreamParams::CreateLegacy(ssrc2)));
2673 EXPECT_TRUE(channel_->AddRecvStream(
2674 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002675 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002676 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002677 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002679 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680 }
mflodman3d7db262016-04-29 00:57:13 -07002681
2682 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2683 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2684 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2685
2686 EXPECT_EQ(s1.received_packets(), 0);
2687 EXPECT_EQ(s2.received_packets(), 0);
2688 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002689
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002690 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002691 EXPECT_EQ(s1.received_packets(), 0);
2692 EXPECT_EQ(s2.received_packets(), 0);
2693 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002694
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002695 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002696 EXPECT_EQ(s1.received_packets(), 1);
2697 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2698 EXPECT_EQ(s2.received_packets(), 0);
2699 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002700
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002701 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002702 EXPECT_EQ(s1.received_packets(), 1);
2703 EXPECT_EQ(s2.received_packets(), 1);
2704 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2705 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002706
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002707 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002708 EXPECT_EQ(s1.received_packets(), 1);
2709 EXPECT_EQ(s2.received_packets(), 1);
2710 EXPECT_EQ(s3.received_packets(), 1);
2711 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002712
mflodman3d7db262016-04-29 00:57:13 -07002713 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2714 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2715 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716}
2717
solenberg7e63ef02015-11-20 00:19:43 -08002718// Test that receiving on an unsignalled stream works (default channel will be
2719// created).
2720TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002721 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002722 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2723
solenberg7e63ef02015-11-20 00:19:43 -08002724 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002725
2726 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2727 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2728 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002729}
2730
2731// Test that receiving on an unsignalled stream works (default channel will be
2732// created), and that packets will be forwarded to the default channel
2733// regardless of their SSRCs.
2734TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002735 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002736 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002737 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2738
mflodman3d7db262016-04-29 00:57:13 -07002739 // Note that ssrc = 0 is not supported.
2740 uint32_t ssrc = 1;
2741 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002742 rtc::SetBE32(&packet[8], ssrc);
2743 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002744
2745 // Verify we only have one default stream.
2746 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2747 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2748 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002749 }
mflodman3d7db262016-04-29 00:57:13 -07002750
2751 // Sending the same ssrc again should not create a new stream.
2752 --ssrc;
2753 DeliverPacket(packet, sizeof(packet));
2754 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2755 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2756 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002757}
2758
2759// Test that a default channel is created even after a signalled stream has been
2760// added, and that this stream will get any packets for unknown SSRCs.
2761TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002762 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002763 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002764 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2765
2766 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002767 const uint32_t signaled_ssrc = 1;
2768 rtc::SetBE32(&packet[8], signaled_ssrc);
2769 EXPECT_TRUE(channel_->AddRecvStream(
2770 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002771 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002772 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2773 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002774
2775 // Note that the first unknown SSRC cannot be 0, because we only support
2776 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002777 const uint32_t unsignaled_ssrc = 7011;
2778 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002779 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002780 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2781 packet, sizeof(packet)));
2782 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2783
2784 DeliverPacket(packet, sizeof(packet));
2785 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2786
2787 rtc::SetBE32(&packet[8], signaled_ssrc);
2788 DeliverPacket(packet, sizeof(packet));
2789 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2790 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002791}
2792
solenberg0a617e22015-10-20 15:49:38 -07002793// Test that we properly handle failures to add a receive stream.
2794TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002795 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002797 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002798}
2799
solenberg0a617e22015-10-20 15:49:38 -07002800// Test that we properly handle failures to add a send stream.
2801TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002802 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002803 voe_.set_fail_create_channel(true);
2804 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2805}
2806
solenberg1ac56142015-10-13 03:58:19 -07002807// Test that AddRecvStream creates new stream.
2808TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002809 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002810 int channel_num = voe_.GetLastChannel();
2811 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002812 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002813}
2814
2815// Test that after adding a recv stream, we do not decode more codecs than
2816// those previously passed into SetRecvCodecs.
2817TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002818 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002819 cricket::AudioRecvParameters parameters;
2820 parameters.codecs.push_back(kIsacCodec);
2821 parameters.codecs.push_back(kPcmuCodec);
2822 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002823 EXPECT_TRUE(channel_->AddRecvStream(
2824 cricket::StreamParams::CreateLegacy(kSsrc1)));
2825 int channel_num2 = voe_.GetLastChannel();
2826 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002827 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002828 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002829 gcodec.channels = 2;
2830 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2831}
2832
2833// Test that we properly clean up any streams that were added, even if
2834// not explicitly removed.
2835TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002836 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002837 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002838 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2839 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2840 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2841 delete channel_;
2842 channel_ = NULL;
2843 EXPECT_EQ(0, voe_.GetNumChannels());
2844}
2845
wu@webrtc.org78187522013-10-07 23:32:02 +00002846TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002847 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002848 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2849}
2850
2851TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002852 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002853 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002854 // Manually delete channel to simulate a failure.
2855 int channel = voe_.GetLastChannel();
2856 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2857 // Add recv stream 2 should work.
2858 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002859 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002860 EXPECT_NE(channel, new_channel);
2861 // The last created channel is deleted too.
2862 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002863}
2864
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002865// Test the InsertDtmf on default send stream as caller.
2866TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2867 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002868}
2869
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002870// Test the InsertDtmf on default send stream as callee
2871TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2872 TestInsertDtmf(0, false);
2873}
2874
2875// Test the InsertDtmf on specified send stream as caller.
2876TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2877 TestInsertDtmf(kSsrc1, true);
2878}
2879
2880// Test the InsertDtmf on specified send stream as callee.
2881TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2882 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002883}
2884
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002886 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002887 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002888 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002889 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2890 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2891 EXPECT_TRUE(channel_->SetPlayout(true));
2892 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2893 EXPECT_TRUE(channel_->SetPlayout(false));
2894 EXPECT_FALSE(channel_->SetPlayout(true));
2895}
2896
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002898 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002899 EXPECT_CALL(adm_,
2900 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2901 EXPECT_CALL(adm_,
2902 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2903 EXPECT_CALL(adm_,
2904 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002905 bool ec_enabled;
2906 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907 webrtc::AecmModes aecm_mode;
2908 bool cng_enabled;
2909 bool agc_enabled;
2910 webrtc::AgcModes agc_mode;
2911 webrtc::AgcConfig agc_config;
2912 bool ns_enabled;
2913 webrtc::NsModes ns_mode;
2914 bool highpass_filter_enabled;
2915 bool stereo_swapping_enabled;
2916 bool typing_detection_enabled;
2917 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002918 voe_.GetAecmMode(aecm_mode, cng_enabled);
2919 voe_.GetAgcStatus(agc_enabled, agc_mode);
2920 voe_.GetAgcConfig(agc_config);
2921 voe_.GetNsStatus(ns_enabled, ns_mode);
2922 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2923 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2924 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2925 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002926 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927 EXPECT_FALSE(cng_enabled);
2928 EXPECT_TRUE(agc_enabled);
2929 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2930 EXPECT_TRUE(ns_enabled);
2931 EXPECT_TRUE(highpass_filter_enabled);
2932 EXPECT_FALSE(stereo_swapping_enabled);
2933 EXPECT_TRUE(typing_detection_enabled);
2934 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2935 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002936 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2937 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002938
solenberg246b8172015-12-08 09:50:23 -08002939 // Nothing set in AudioOptions, so everything should be as default.
2940 send_parameters_.options = cricket::AudioOptions();
2941 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943 voe_.GetAecmMode(aecm_mode, cng_enabled);
2944 voe_.GetAgcStatus(agc_enabled, agc_mode);
2945 voe_.GetAgcConfig(agc_config);
2946 voe_.GetNsStatus(ns_enabled, ns_mode);
2947 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2948 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2949 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2950 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002951 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002952 EXPECT_FALSE(cng_enabled);
2953 EXPECT_TRUE(agc_enabled);
2954 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2955 EXPECT_TRUE(ns_enabled);
2956 EXPECT_TRUE(highpass_filter_enabled);
2957 EXPECT_FALSE(stereo_swapping_enabled);
2958 EXPECT_TRUE(typing_detection_enabled);
2959 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2960 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002961 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2962 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002963
2964 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002965 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2966 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002967 voe_.GetEcStatus(ec_enabled, ec_mode);
2968 EXPECT_FALSE(ec_enabled);
2969
2970 // Turn echo cancellation back on, with settings, and make sure
2971 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002972 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2973 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002974 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002975 voe_.GetAecmMode(aecm_mode, cng_enabled);
2976 voe_.GetAgcStatus(agc_enabled, agc_mode);
2977 voe_.GetAgcConfig(agc_config);
2978 voe_.GetNsStatus(ns_enabled, ns_mode);
2979 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2980 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2981 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2982 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002983 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002984 EXPECT_TRUE(agc_enabled);
2985 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2986 EXPECT_TRUE(ns_enabled);
2987 EXPECT_TRUE(highpass_filter_enabled);
2988 EXPECT_FALSE(stereo_swapping_enabled);
2989 EXPECT_TRUE(typing_detection_enabled);
2990 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2991 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2992
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002993 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2994 // control.
solenberg246b8172015-12-08 09:50:23 -08002995 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2996 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002997 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002998 voe_.GetAecmMode(aecm_mode, cng_enabled);
2999 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003000 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003001 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3002
3003 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08003004 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
3005 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
3006 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
3007 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003008 voe_.GetEcStatus(ec_enabled, ec_mode);
3009 EXPECT_FALSE(ec_enabled);
3010 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08003011 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3012 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003013 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003014 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003015 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003016 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3017
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08003019 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
3020 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003021 voe_.GetAgcStatus(agc_enabled, agc_mode);
3022 EXPECT_FALSE(agc_enabled);
3023
3024 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08003025 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
3026 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
3027 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003028 voe_.GetAgcStatus(agc_enabled, agc_mode);
3029 EXPECT_TRUE(agc_enabled);
3030 voe_.GetAgcConfig(agc_config);
3031 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3032
3033 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08003034 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
3035 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
3036 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
3037 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
3038 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003039 voe_.GetNsStatus(ns_enabled, ns_mode);
3040 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3041 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3042 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3043 EXPECT_FALSE(ns_enabled);
3044 EXPECT_FALSE(highpass_filter_enabled);
3045 EXPECT_FALSE(typing_detection_enabled);
3046 EXPECT_TRUE(stereo_swapping_enabled);
3047
solenberg1ac56142015-10-13 03:58:19 -07003048 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08003049 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003050 voe_.GetEcStatus(ec_enabled, ec_mode);
3051 voe_.GetNsStatus(ns_enabled, ns_mode);
3052 EXPECT_TRUE(ec_enabled);
3053 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3054 EXPECT_FALSE(ns_enabled);
3055 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3056}
3057
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003058TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003059 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003060
3061 bool ec_enabled;
3062 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003063 bool agc_enabled;
3064 webrtc::AgcModes agc_mode;
3065 bool ns_enabled;
3066 webrtc::NsModes ns_mode;
3067 bool highpass_filter_enabled;
3068 bool stereo_swapping_enabled;
3069 bool typing_detection_enabled;
3070
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003071 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003072 voe_.GetAgcStatus(agc_enabled, agc_mode);
3073 voe_.GetNsStatus(ns_enabled, ns_mode);
3074 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3075 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3076 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3077 EXPECT_TRUE(ec_enabled);
3078 EXPECT_TRUE(agc_enabled);
3079 EXPECT_TRUE(ns_enabled);
3080 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003081 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003082 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003083}
3084
3085TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3086 webrtc::AgcConfig set_config = {0};
3087 set_config.targetLeveldBOv = 3;
3088 set_config.digitalCompressionGaindB = 9;
3089 set_config.limiterEnable = true;
3090 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003091
3092 webrtc::AgcConfig config = {0};
3093 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3094 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3095 EXPECT_EQ(set_config.digitalCompressionGaindB,
3096 config.digitalCompressionGaindB);
3097 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3098}
3099
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003100TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003101 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003102 EXPECT_CALL(adm_,
3103 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3104 EXPECT_CALL(adm_,
3105 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3106 EXPECT_CALL(adm_,
3107 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3108
kwiberg686a8ef2016-02-26 03:00:35 -08003109 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003110 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003111 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003112 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003113 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003114 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003115
3116 // Have to add a stream to make SetSend work.
3117 cricket::StreamParams stream1;
3118 stream1.ssrcs.push_back(1);
3119 channel1->AddSendStream(stream1);
3120 cricket::StreamParams stream2;
3121 stream2.ssrcs.push_back(2);
3122 channel2->AddSendStream(stream2);
3123
3124 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003125 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003126 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3127 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3128 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003129 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3130 EXPECT_EQ(parameters_options_all.options, channel1->options());
3131 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3132 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003133
3134 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003135 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003136 parameters_options_no_ns.options.noise_suppression =
3137 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003138 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3139 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003140 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3141 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3142 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003143 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003144
3145 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003146 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003147 parameters_options_no_agc.options.auto_gain_control =
3148 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003149 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003150 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3151 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3152 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003153 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003154
solenberg246b8172015-12-08 09:50:23 -08003155 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003156 bool ec_enabled;
3157 webrtc::EcModes ec_mode;
3158 bool agc_enabled;
3159 webrtc::AgcModes agc_mode;
3160 bool ns_enabled;
3161 webrtc::NsModes ns_mode;
3162 voe_.GetEcStatus(ec_enabled, ec_mode);
3163 voe_.GetAgcStatus(agc_enabled, agc_mode);
3164 voe_.GetNsStatus(ns_enabled, ns_mode);
3165 EXPECT_TRUE(ec_enabled);
3166 EXPECT_TRUE(agc_enabled);
3167 EXPECT_TRUE(ns_enabled);
3168
solenbergd53a3f92016-04-14 13:56:37 -07003169 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003170 voe_.GetEcStatus(ec_enabled, ec_mode);
3171 voe_.GetAgcStatus(agc_enabled, agc_mode);
3172 voe_.GetNsStatus(ns_enabled, ns_mode);
3173 EXPECT_TRUE(ec_enabled);
3174 EXPECT_TRUE(agc_enabled);
3175 EXPECT_FALSE(ns_enabled);
3176
solenbergd53a3f92016-04-14 13:56:37 -07003177 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003178 voe_.GetEcStatus(ec_enabled, ec_mode);
3179 voe_.GetAgcStatus(agc_enabled, agc_mode);
3180 voe_.GetNsStatus(ns_enabled, ns_mode);
3181 EXPECT_TRUE(ec_enabled);
3182 EXPECT_FALSE(agc_enabled);
3183 EXPECT_TRUE(ns_enabled);
3184
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003185 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003186 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003187 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3188 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003189 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003190 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003191 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003192 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003193 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003194 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003195 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3196 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3197 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003198 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003199 voe_.GetEcStatus(ec_enabled, ec_mode);
3200 voe_.GetAgcStatus(agc_enabled, agc_mode);
3201 voe_.GetNsStatus(ns_enabled, ns_mode);
3202 EXPECT_TRUE(ec_enabled);
3203 EXPECT_FALSE(agc_enabled);
3204 EXPECT_FALSE(ns_enabled);
3205}
3206
wu@webrtc.orgde305012013-10-31 15:40:38 +00003207// This test verifies DSCP settings are properly applied on voice media channel.
3208TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003209 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003210 cricket::FakeNetworkInterface network_interface;
3211 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003212 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003213
solenbergbc37fc82016-04-04 09:54:44 -07003214 channel.reset(
3215 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003216 channel->SetInterface(&network_interface);
3217 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3218 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3219
3220 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003221 channel.reset(
3222 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003223 channel->SetInterface(&network_interface);
3224 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3225
3226 // Verify that setting the option to false resets the
3227 // DiffServCodePoint.
3228 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003229 channel.reset(
3230 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003231 channel->SetInterface(&network_interface);
3232 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3233 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3234
3235 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003236}
3237
solenberg1ac56142015-10-13 03:58:19 -07003238TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003239 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003240 cricket::WebRtcVoiceMediaChannel* media_channel =
3241 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003242 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3243 EXPECT_TRUE(channel_->AddRecvStream(
3244 cricket::StreamParams::CreateLegacy(kSsrc1)));
3245 int channel_id = voe_.GetLastChannel();
3246 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3247 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3248 EXPECT_TRUE(channel_->AddRecvStream(
3249 cricket::StreamParams::CreateLegacy(kSsrc2)));
3250 int channel_id2 = voe_.GetLastChannel();
3251 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003252}
3253
solenberg1ac56142015-10-13 03:58:19 -07003254TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003255 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003256 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003257 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3258 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3259 EXPECT_TRUE(channel_->AddSendStream(
3260 cricket::StreamParams::CreateLegacy(kSsrc1)));
3261 int channel_id = voe_.GetLastChannel();
3262 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3263 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3264 EXPECT_TRUE(channel_->AddSendStream(
3265 cricket::StreamParams::CreateLegacy(kSsrc2)));
3266 int channel_id2 = voe_.GetLastChannel();
3267 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003268}
3269
solenberg4bac9c52015-10-09 02:32:53 -07003270TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003271 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003272 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003273 cricket::StreamParams stream;
3274 stream.ssrcs.push_back(kSsrc2);
3275 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003276 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003277 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003278 float scale = 0;
3279 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3280 EXPECT_DOUBLE_EQ(3, scale);
3281}
3282
3283TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003284 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003285 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3286 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3287 int channel_id = voe_.GetLastChannel();
3288 float scale = 0;
3289 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3290 EXPECT_DOUBLE_EQ(2, scale);
3291 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003292 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003293 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003294}
3295
pbos8fc7fa72015-07-15 08:02:58 -07003296TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003297 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003298 const std::string kSyncLabel = "AvSyncLabel";
3299
solenbergff976312016-03-30 23:28:51 -07003300 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003301 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3302 sp.sync_label = kSyncLabel;
3303 // Creating two channels to make sure that sync label is set properly for both
3304 // the default voice channel and following ones.
3305 EXPECT_TRUE(channel_->AddRecvStream(sp));
3306 sp.ssrcs[0] += 1;
3307 EXPECT_TRUE(channel_->AddRecvStream(sp));
3308
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003309 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003310 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003311 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003312 << "SyncGroup should be set based on sync_label";
3313 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003314 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003315 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003316}
3317
solenberg3a941542015-11-16 07:34:50 -08003318// TODO(solenberg): Remove, once recv streams are configured through Call.
3319// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003320TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003321 // Test that setting the header extensions results in the expected state
3322 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003323 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003324 ssrcs.push_back(223);
3325 ssrcs.push_back(224);
3326
solenbergff976312016-03-30 23:28:51 -07003327 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003328 cricket::WebRtcVoiceMediaChannel* media_channel =
3329 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003330 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003331 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003332 EXPECT_TRUE(media_channel->AddRecvStream(
3333 cricket::StreamParams::CreateLegacy(ssrc)));
3334 }
3335
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003336 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003337 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003338 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003339 EXPECT_NE(nullptr, s);
3340 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3341 }
3342
3343 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003344 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003345 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003346 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003347 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003348 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003349 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003350 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003351 EXPECT_NE(nullptr, s);
3352 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003353 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3354 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003355 for (const auto& s_ext : s_exts) {
3356 if (e_ext.id == s_ext.id) {
3357 EXPECT_EQ(e_ext.uri, s_ext.name);
3358 }
3359 }
3360 }
3361 }
3362
3363 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003364 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003365 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003366 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003367 EXPECT_NE(nullptr, s);
3368 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3369 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003370}
3371
3372TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3373 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003374 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003375 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003376 static const unsigned char kRtcp[] = {
3377 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3378 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3381 };
jbaucheec21bd2016-03-20 06:15:43 -07003382 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003383
solenbergff976312016-03-30 23:28:51 -07003384 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003385 cricket::WebRtcVoiceMediaChannel* media_channel =
3386 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003387 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003388 EXPECT_TRUE(media_channel->AddRecvStream(
3389 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3390
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003391 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003392 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003393 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003394 EXPECT_EQ(0, s->received_packets());
3395 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3396 EXPECT_EQ(1, s->received_packets());
3397 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3398 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003399}
Minyue2013aec2015-05-13 14:14:42 +02003400
solenberg0a617e22015-10-20 15:49:38 -07003401// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003402// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003403TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003404 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003405 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003406 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003407 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3408 int recv_ch = voe_.GetLastChannel();
3409 EXPECT_NE(recv_ch, default_channel);
3410 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3411 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3412 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003413 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3414 recv_ch = voe_.GetLastChannel();
3415 EXPECT_NE(recv_ch, default_channel);
3416 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003417}
3418
3419TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003420 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003421 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003422
3423 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3424 int recv_ch = voe_.GetLastChannel();
3425
3426 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3427 int send_ch = voe_.GetLastChannel();
3428
3429 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3430 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3431 // channel of |recv_ch|.This is not a common case, since, normally, only the
3432 // default channel can be associated. However, the default is not deletable.
3433 // So we force the |recv_ch| to associate with a non-default channel.
3434 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3435 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3436
3437 EXPECT_TRUE(channel_->RemoveSendStream(2));
3438 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3439}
stefan658910c2015-09-03 05:48:32 -07003440
deadbeef884f5852016-01-15 09:20:04 -08003441TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003442 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003443 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3444 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003445
3446 // Setting the sink before a recv stream exists should do nothing.
3447 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3448 EXPECT_TRUE(
3449 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3450 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3451
3452 // Now try actually setting the sink.
3453 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3454 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3455
3456 // Now try resetting it.
3457 channel_->SetRawAudioSink(kSsrc1, nullptr);
3458 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3459}
3460
3461TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003462 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003463 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3464 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003465
3466 // Should be able to set a default sink even when no stream exists.
3467 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3468
3469 // Create default channel and ensure it's assigned the default sink.
3470 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3471 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3472
3473 // Try resetting the default sink.
3474 channel_->SetRawAudioSink(0, nullptr);
3475 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3476
3477 // Try setting the default sink while the default stream exists.
3478 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3479 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3480
3481 // If we remove and add a default stream, it should get the same sink.
3482 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3483 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3484 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3485}
3486
skvlad7a43d252016-03-22 15:32:27 -07003487// Test that, just like the video channel, the voice channel communicates the
3488// network state to the call.
3489TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003490 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003491
3492 EXPECT_EQ(webrtc::kNetworkUp,
3493 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3494 EXPECT_EQ(webrtc::kNetworkUp,
3495 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3496
3497 channel_->OnReadyToSend(false);
3498 EXPECT_EQ(webrtc::kNetworkDown,
3499 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3500 EXPECT_EQ(webrtc::kNetworkUp,
3501 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3502
3503 channel_->OnReadyToSend(true);
3504 EXPECT_EQ(webrtc::kNetworkUp,
3505 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3506 EXPECT_EQ(webrtc::kNetworkUp,
3507 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3508}
3509
stefan658910c2015-09-03 05:48:32 -07003510// Tests that the library initializes and shuts down properly.
3511TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003512 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003513 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003514 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003515 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3516 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003517 EXPECT_TRUE(channel != nullptr);
3518 delete channel;
solenbergff976312016-03-30 23:28:51 -07003519}
stefan658910c2015-09-03 05:48:32 -07003520
solenbergff976312016-03-30 23:28:51 -07003521// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003522TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3523 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3524 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3525 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003526 {
3527 cricket::WebRtcVoiceEngine engine(&adm);
3528 std::unique_ptr<webrtc::Call> call(
3529 webrtc::Call::Create(webrtc::Call::Config()));
3530 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3531 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3532 EXPECT_TRUE(channel != nullptr);
3533 delete channel;
3534 }
stefan658910c2015-09-03 05:48:32 -07003535}
3536
3537// Tests that the library is configured with the codecs we want.
3538TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003539 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003540 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003541 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003542 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003543 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003544 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003545 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003546 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003547 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003548 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003549 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003550 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003551 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003552 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003553 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003554 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003555 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003556 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003557 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003558 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003559 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003560 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003561 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003562 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003563 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003564 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003565 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003566 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003567 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003568 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003569 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003570 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003571 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003572 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003573 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003574 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003575 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003576 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003577 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003578 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003579 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003580 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003581 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003582 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003583 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003584 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003585 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003586 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003587 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003588 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003589 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003590
stefan658910c2015-09-03 05:48:32 -07003591 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003592 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003593 for (std::vector<cricket::AudioCodec>::const_iterator it =
3594 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3595 if (it->name == "CN" && it->clockrate == 16000) {
3596 EXPECT_EQ(105, it->id);
3597 } else if (it->name == "CN" && it->clockrate == 32000) {
3598 EXPECT_EQ(106, it->id);
3599 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3600 EXPECT_EQ(103, it->id);
3601 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3602 EXPECT_EQ(104, it->id);
3603 } else if (it->name == "G722" && it->clockrate == 8000) {
3604 EXPECT_EQ(9, it->id);
3605 } else if (it->name == "telephone-event") {
3606 EXPECT_EQ(126, it->id);
3607 } else if (it->name == "red") {
3608 EXPECT_EQ(127, it->id);
3609 } else if (it->name == "opus") {
3610 EXPECT_EQ(111, it->id);
3611 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3612 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003613 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3614 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3615 }
3616 }
stefan658910c2015-09-03 05:48:32 -07003617}
3618
3619// Tests that VoE supports at least 32 channels
3620TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003621 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003622 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003623 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003624
3625 cricket::VoiceMediaChannel* channels[32];
3626 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003627 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003628 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3629 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003630 if (!channel)
3631 break;
stefan658910c2015-09-03 05:48:32 -07003632 channels[num_channels++] = channel;
3633 }
3634
tfarina5237aaf2015-11-10 23:44:30 -08003635 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003636 EXPECT_EQ(expected, num_channels);
3637
3638 while (num_channels > 0) {
3639 delete channels[--num_channels];
3640 }
stefan658910c2015-09-03 05:48:32 -07003641}
3642
3643// Test that we set our preferred codecs properly.
3644TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003645 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003646 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003647 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003648 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3649 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003650 cricket::AudioRecvParameters parameters;
3651 parameters.codecs = engine.codecs();
3652 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003653}