blob: 5d8dd90d02beff0c6370ada650a3618d5e92e422 [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));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001354 EXPECT_FALSE(voe_.GetNACK(channel_num));
1355
1356 EXPECT_TRUE(channel_->AddSendStream(
1357 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001358 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001359}
1360
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361// Test that we can enable NACK on receive streams.
1362TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001363 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364 int channel_num1 = voe_.GetLastChannel();
1365 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1366 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001367 cricket::AudioSendParameters parameters;
1368 parameters.codecs.push_back(kOpusCodec);
1369 parameters.codecs[0].AddFeedbackParam(
1370 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1371 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001372 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1373 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001375 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1376 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1377}
1378
1379// Test that we can disable NACK.
1380TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001381 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001382 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001383 cricket::AudioSendParameters parameters;
1384 parameters.codecs.push_back(kOpusCodec);
1385 parameters.codecs[0].AddFeedbackParam(
1386 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1387 cricket::kParamValueEmpty));
1388 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001389 EXPECT_TRUE(voe_.GetNACK(channel_num));
1390
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001391 parameters.codecs.clear();
1392 parameters.codecs.push_back(kOpusCodec);
1393 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001394 EXPECT_FALSE(voe_.GetNACK(channel_num));
1395}
1396
1397// Test that we can disable NACK on receive streams.
1398TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001399 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001400 int channel_num1 = voe_.GetLastChannel();
1401 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1402 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001403 cricket::AudioSendParameters parameters;
1404 parameters.codecs.push_back(kOpusCodec);
1405 parameters.codecs[0].AddFeedbackParam(
1406 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1407 cricket::kParamValueEmpty));
1408 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001409 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1410 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1411
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001412 parameters.codecs.clear();
1413 parameters.codecs.push_back(kOpusCodec);
1414 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001415 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1416 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1417}
1418
1419// Test that NACK is enabled on a new receive stream.
1420TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001421 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001422 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001423 cricket::AudioSendParameters parameters;
1424 parameters.codecs.push_back(kIsacCodec);
1425 parameters.codecs.push_back(kCn16000Codec);
1426 parameters.codecs[0].AddFeedbackParam(
1427 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1428 cricket::kParamValueEmpty));
1429 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 EXPECT_TRUE(voe_.GetNACK(channel_num));
1431
1432 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1433 channel_num = voe_.GetLastChannel();
1434 EXPECT_TRUE(voe_.GetNACK(channel_num));
1435 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1436 channel_num = voe_.GetLastChannel();
1437 EXPECT_TRUE(voe_.GetNACK(channel_num));
1438}
1439
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001440// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001441TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001442 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001443 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001444 cricket::AudioSendParameters parameters;
1445 parameters.codecs.push_back(kOpusCodec);
1446 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001447 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1448}
1449
1450// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001451TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001452 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001453 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001454 cricket::AudioSendParameters parameters;
1455 parameters.codecs.push_back(kOpusCodec);
1456 parameters.codecs[0].bitrate = 0;
1457 parameters.codecs[0].params["useinbandfec"] = "0";
1458 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001459 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1460 webrtc::CodecInst gcodec;
1461 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1462 EXPECT_STREQ("opus", gcodec.plname);
1463 EXPECT_EQ(1, gcodec.channels);
1464 EXPECT_EQ(32000, gcodec.rate);
1465}
1466
1467// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001468TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001469 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001470 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001471 cricket::AudioSendParameters parameters;
1472 parameters.codecs.push_back(kOpusCodec);
1473 parameters.codecs[0].bitrate = 0;
1474 parameters.codecs[0].params["useinbandfec"] = "1";
1475 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001476 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1477 webrtc::CodecInst gcodec;
1478 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1479 EXPECT_STREQ("opus", gcodec.plname);
1480 EXPECT_EQ(1, gcodec.channels);
1481 EXPECT_EQ(32000, gcodec.rate);
1482}
1483
1484// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001485TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001486 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001487 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 cricket::AudioSendParameters parameters;
1489 parameters.codecs.push_back(kOpusCodec);
1490 parameters.codecs[0].bitrate = 0;
1491 parameters.codecs[0].params["stereo"] = "1";
1492 parameters.codecs[0].params["useinbandfec"] = "1";
1493 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001494 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1495 webrtc::CodecInst gcodec;
1496 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1497 EXPECT_STREQ("opus", gcodec.plname);
1498 EXPECT_EQ(2, gcodec.channels);
1499 EXPECT_EQ(64000, gcodec.rate);
1500}
1501
1502// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001503TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001504 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001505 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001506 cricket::AudioSendParameters parameters;
1507 parameters.codecs.push_back(kIsacCodec);
1508 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001509 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1510}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001511
1512// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1513TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001514 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001515 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001516 cricket::AudioSendParameters parameters;
1517 parameters.codecs.push_back(kIsacCodec);
1518 parameters.codecs[0].params["useinbandfec"] = "1";
1519 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001520 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1521}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001522
1523// Test that Opus FEC status can be changed.
1524TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001525 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001526 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001527 cricket::AudioSendParameters parameters;
1528 parameters.codecs.push_back(kOpusCodec);
1529 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001530 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001531 parameters.codecs[0].params["useinbandfec"] = "1";
1532 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001533 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1534}
1535
stefanba4c0e42016-02-04 04:12:24 -08001536TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001537 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001538 cricket::AudioSendParameters send_parameters;
1539 send_parameters.codecs.push_back(kOpusCodec);
1540 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1541 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1542
1543 cricket::AudioRecvParameters recv_parameters;
1544 recv_parameters.codecs.push_back(kIsacCodec);
1545 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1546 EXPECT_TRUE(
1547 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1548 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1549 EXPECT_FALSE(
1550 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1551
solenbergbc37fc82016-04-04 09:54:44 -07001552 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001553 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1554 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1555 EXPECT_TRUE(
1556 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1557}
1558
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001559// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1560TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001561 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001562 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001563 cricket::AudioSendParameters parameters;
1564 parameters.codecs.push_back(kOpusCodec);
1565 parameters.codecs[0].bitrate = 0;
1566 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1567 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001568 EXPECT_EQ(cricket::kOpusBandwidthNb,
1569 voe_.GetMaxEncodingBandwidth(channel_num));
1570 webrtc::CodecInst gcodec;
1571 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1572 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001573
1574 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001575 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1576 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001577 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1578 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001579}
1580
1581// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1582TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001583 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001584 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001585 cricket::AudioSendParameters parameters;
1586 parameters.codecs.push_back(kOpusCodec);
1587 parameters.codecs[0].bitrate = 0;
1588 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1589 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001590 EXPECT_EQ(cricket::kOpusBandwidthMb,
1591 voe_.GetMaxEncodingBandwidth(channel_num));
1592 webrtc::CodecInst gcodec;
1593 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1594 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001595
1596 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001597 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1598 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001599 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1600 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001601}
1602
1603// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1604TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001605 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001606 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001607 cricket::AudioSendParameters parameters;
1608 parameters.codecs.push_back(kOpusCodec);
1609 parameters.codecs[0].bitrate = 0;
1610 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1611 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001612 EXPECT_EQ(cricket::kOpusBandwidthWb,
1613 voe_.GetMaxEncodingBandwidth(channel_num));
1614 webrtc::CodecInst gcodec;
1615 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1616 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001617
1618 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001619 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1620 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001621 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1622 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001623}
1624
1625// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1626TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001627 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001628 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001629 cricket::AudioSendParameters parameters;
1630 parameters.codecs.push_back(kOpusCodec);
1631 parameters.codecs[0].bitrate = 0;
1632 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1633 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001634 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1635 voe_.GetMaxEncodingBandwidth(channel_num));
1636 webrtc::CodecInst gcodec;
1637 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1638 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001639
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001640 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1642 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001643 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1644 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001645}
1646
1647// Test 24000 < maxplaybackrate triggers Opus full band mode.
1648TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001649 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001650 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001651 cricket::AudioSendParameters parameters;
1652 parameters.codecs.push_back(kOpusCodec);
1653 parameters.codecs[0].bitrate = 0;
1654 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1655 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001656 EXPECT_EQ(cricket::kOpusBandwidthFb,
1657 voe_.GetMaxEncodingBandwidth(channel_num));
1658 webrtc::CodecInst gcodec;
1659 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1660 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001661
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001662 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001663 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1664 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001665 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1666 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001667}
1668
1669// Test Opus that without maxplaybackrate, default playback rate is used.
1670TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001671 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001672 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001673 cricket::AudioSendParameters parameters;
1674 parameters.codecs.push_back(kOpusCodec);
1675 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001676 EXPECT_EQ(cricket::kOpusBandwidthFb,
1677 voe_.GetMaxEncodingBandwidth(channel_num));
1678}
1679
1680// Test the with non-Opus, maxplaybackrate has no effect.
1681TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001682 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001683 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001684 cricket::AudioSendParameters parameters;
1685 parameters.codecs.push_back(kIsacCodec);
1686 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1687 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001688 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1689}
1690
1691// Test maxplaybackrate can be set on two streams.
1692TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001693 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001694 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001695 cricket::AudioSendParameters parameters;
1696 parameters.codecs.push_back(kOpusCodec);
1697 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001698 // Default bandwidth is 24000.
1699 EXPECT_EQ(cricket::kOpusBandwidthFb,
1700 voe_.GetMaxEncodingBandwidth(channel_num));
1701
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001702 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001703
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001704 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001705 EXPECT_EQ(cricket::kOpusBandwidthNb,
1706 voe_.GetMaxEncodingBandwidth(channel_num));
1707
1708 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1709 channel_num = voe_.GetLastChannel();
1710 EXPECT_EQ(cricket::kOpusBandwidthNb,
1711 voe_.GetMaxEncodingBandwidth(channel_num));
1712}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001713
Minyue Li7100dcd2015-03-27 05:05:59 +01001714// Test that with usedtx=0, Opus DTX is off.
1715TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001716 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001717 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001718 cricket::AudioSendParameters parameters;
1719 parameters.codecs.push_back(kOpusCodec);
1720 parameters.codecs[0].params["usedtx"] = "0";
1721 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001722 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1723}
1724
1725// Test that with usedtx=1, Opus DTX is on.
1726TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001727 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001728 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001729 cricket::AudioSendParameters parameters;
1730 parameters.codecs.push_back(kOpusCodec);
1731 parameters.codecs[0].params["usedtx"] = "1";
1732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001733 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1734 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1735}
1736
1737// Test that usedtx=1 works with stereo Opus.
1738TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001739 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001740 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001741 cricket::AudioSendParameters parameters;
1742 parameters.codecs.push_back(kOpusCodec);
1743 parameters.codecs[0].params["usedtx"] = "1";
1744 parameters.codecs[0].params["stereo"] = "1";
1745 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001746 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1747 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1748}
1749
1750// Test that usedtx=1 does not work with non Opus.
1751TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001752 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001753 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001754 cricket::AudioSendParameters parameters;
1755 parameters.codecs.push_back(kIsacCodec);
1756 parameters.codecs[0].params["usedtx"] = "1";
1757 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001758 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1759}
1760
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001761// Test that we can switch back and forth between Opus and ISAC with CN.
1762TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001763 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001764 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001765 cricket::AudioSendParameters opus_parameters;
1766 opus_parameters.codecs.push_back(kOpusCodec);
1767 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 webrtc::CodecInst gcodec;
1769 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001770 EXPECT_EQ(111, gcodec.pltype);
1771 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001773 cricket::AudioSendParameters isac_parameters;
1774 isac_parameters.codecs.push_back(kIsacCodec);
1775 isac_parameters.codecs.push_back(kCn16000Codec);
1776 isac_parameters.codecs.push_back(kOpusCodec);
1777 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001778 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1779 EXPECT_EQ(103, gcodec.pltype);
1780 EXPECT_STREQ("ISAC", gcodec.plname);
1781
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001782 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001784 EXPECT_EQ(111, gcodec.pltype);
1785 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001786}
1787
1788// Test that we handle various ways of specifying bitrate.
1789TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001790 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001792 cricket::AudioSendParameters parameters;
1793 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1794 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795 webrtc::CodecInst gcodec;
1796 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1797 EXPECT_EQ(103, gcodec.pltype);
1798 EXPECT_STREQ("ISAC", gcodec.plname);
1799 EXPECT_EQ(32000, gcodec.rate);
1800
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001801 parameters.codecs[0].bitrate = 0; // bitrate == default
1802 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1804 EXPECT_EQ(103, gcodec.pltype);
1805 EXPECT_STREQ("ISAC", gcodec.plname);
1806 EXPECT_EQ(-1, gcodec.rate);
1807
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001808 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1809 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1811 EXPECT_EQ(103, gcodec.pltype);
1812 EXPECT_STREQ("ISAC", gcodec.plname);
1813 EXPECT_EQ(28000, gcodec.rate);
1814
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001815 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1816 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1818 EXPECT_EQ(0, gcodec.pltype);
1819 EXPECT_STREQ("PCMU", gcodec.plname);
1820 EXPECT_EQ(64000, gcodec.rate);
1821
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 parameters.codecs[0].bitrate = 0; // bitrate == default
1823 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1825 EXPECT_EQ(0, gcodec.pltype);
1826 EXPECT_STREQ("PCMU", gcodec.plname);
1827 EXPECT_EQ(64000, gcodec.rate);
1828
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001829 parameters.codecs[0] = kOpusCodec;
1830 parameters.codecs[0].bitrate = 0; // bitrate == default
1831 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1833 EXPECT_EQ(111, gcodec.pltype);
1834 EXPECT_STREQ("opus", gcodec.plname);
1835 EXPECT_EQ(32000, gcodec.rate);
1836}
1837
Brave Yao5225dd82015-03-26 07:39:19 +08001838// Test that we could set packet size specified in kCodecParamPTime.
1839TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001840 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001841 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001842 cricket::AudioSendParameters parameters;
1843 parameters.codecs.push_back(kOpusCodec);
1844 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1845 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001846 webrtc::CodecInst gcodec;
1847 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1848 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1849
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001850 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1851 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001852 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1853 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1854
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001855 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1856 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001857 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1858 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1859
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001860 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1861 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1862 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001863 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1864 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1865
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001866 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1867 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1868 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001869 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1870 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1871}
1872
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001873// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001874TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001875 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001876 cricket::AudioSendParameters parameters;
1877 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001878}
1879
1880// Test that we can set send codecs even with telephone-event codec as the first
1881// one on the list.
1882TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001883 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001885 cricket::AudioSendParameters parameters;
1886 parameters.codecs.push_back(kTelephoneEventCodec);
1887 parameters.codecs.push_back(kIsacCodec);
1888 parameters.codecs.push_back(kPcmuCodec);
1889 parameters.codecs[0].id = 98; // DTMF
1890 parameters.codecs[1].id = 96;
1891 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001892 webrtc::CodecInst gcodec;
1893 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001894 EXPECT_EQ(96, gcodec.pltype);
1895 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001896 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001897}
1898
solenberg31642aa2016-03-14 08:00:37 -07001899// Test that payload type range is limited for telephone-event codec.
1900TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001901 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001902 cricket::AudioSendParameters parameters;
1903 parameters.codecs.push_back(kTelephoneEventCodec);
1904 parameters.codecs.push_back(kIsacCodec);
1905 parameters.codecs[0].id = 0; // DTMF
1906 parameters.codecs[1].id = 96;
1907 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1908 EXPECT_TRUE(channel_->CanInsertDtmf());
1909 parameters.codecs[0].id = 128; // DTMF
1910 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1911 EXPECT_FALSE(channel_->CanInsertDtmf());
1912 parameters.codecs[0].id = 127;
1913 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1914 EXPECT_TRUE(channel_->CanInsertDtmf());
1915 parameters.codecs[0].id = -1; // DTMF
1916 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1917 EXPECT_FALSE(channel_->CanInsertDtmf());
1918}
1919
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001920// Test that we can set send codecs even with CN codec as the first
1921// one on the list.
1922TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001923 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001924 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001925 cricket::AudioSendParameters parameters;
1926 parameters.codecs.push_back(kCn16000Codec);
1927 parameters.codecs.push_back(kIsacCodec);
1928 parameters.codecs.push_back(kPcmuCodec);
1929 parameters.codecs[0].id = 98; // wideband CN
1930 parameters.codecs[1].id = 96;
1931 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001932 webrtc::CodecInst gcodec;
1933 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1934 EXPECT_EQ(96, gcodec.pltype);
1935 EXPECT_STREQ("ISAC", gcodec.plname);
1936 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937}
1938
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001939// Test that we set VAD and DTMF types correctly as caller.
1940TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001941 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001942 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001943 cricket::AudioSendParameters parameters;
1944 parameters.codecs.push_back(kIsacCodec);
1945 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001947 parameters.codecs.push_back(kCn16000Codec);
1948 parameters.codecs.push_back(kCn8000Codec);
1949 parameters.codecs.push_back(kTelephoneEventCodec);
1950 parameters.codecs.push_back(kRedCodec);
1951 parameters.codecs[0].id = 96;
1952 parameters.codecs[2].id = 97; // wideband CN
1953 parameters.codecs[4].id = 98; // DTMF
1954 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 webrtc::CodecInst gcodec;
1956 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1957 EXPECT_EQ(96, gcodec.pltype);
1958 EXPECT_STREQ("ISAC", gcodec.plname);
1959 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001960 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001961 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1962 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001963 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964}
1965
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001966// Test that we set VAD and DTMF types correctly as callee.
1967TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001968 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001969 cricket::AudioSendParameters parameters;
1970 parameters.codecs.push_back(kIsacCodec);
1971 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001972 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 parameters.codecs.push_back(kCn16000Codec);
1974 parameters.codecs.push_back(kCn8000Codec);
1975 parameters.codecs.push_back(kTelephoneEventCodec);
1976 parameters.codecs.push_back(kRedCodec);
1977 parameters.codecs[0].id = 96;
1978 parameters.codecs[2].id = 97; // wideband CN
1979 parameters.codecs[4].id = 98; // DTMF
1980 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001981 EXPECT_TRUE(channel_->AddSendStream(
1982 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001983 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001984
1985 webrtc::CodecInst gcodec;
1986 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1987 EXPECT_EQ(96, gcodec.pltype);
1988 EXPECT_STREQ("ISAC", gcodec.plname);
1989 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001990 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001991 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1992 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001993 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001994}
1995
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001996// Test that we only apply VAD if we have a CN codec that matches the
1997// send codec clockrate.
1998TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001999 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002000 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002001 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002002 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002003 parameters.codecs.push_back(kIsacCodec);
2004 parameters.codecs.push_back(kCn16000Codec);
2005 parameters.codecs[1].id = 97;
2006 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 webrtc::CodecInst gcodec;
2008 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2009 EXPECT_STREQ("ISAC", gcodec.plname);
2010 EXPECT_TRUE(voe_.GetVAD(channel_num));
2011 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2012 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002013 parameters.codecs[0] = kPcmuCodec;
2014 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2016 EXPECT_STREQ("PCMU", gcodec.plname);
2017 EXPECT_FALSE(voe_.GetVAD(channel_num));
2018 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002019 parameters.codecs[1] = kCn8000Codec;
2020 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002021 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2022 EXPECT_STREQ("PCMU", gcodec.plname);
2023 EXPECT_TRUE(voe_.GetVAD(channel_num));
2024 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002025 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002026 parameters.codecs[0] = kIsacCodec;
2027 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002028 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2029 EXPECT_STREQ("ISAC", gcodec.plname);
2030 EXPECT_FALSE(voe_.GetVAD(channel_num));
2031}
2032
2033// Test that we perform case-insensitive matching of codec names.
2034TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002035 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002036 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002037 cricket::AudioSendParameters parameters;
2038 parameters.codecs.push_back(kIsacCodec);
2039 parameters.codecs.push_back(kPcmuCodec);
2040 parameters.codecs.push_back(kCn16000Codec);
2041 parameters.codecs.push_back(kCn8000Codec);
2042 parameters.codecs.push_back(kTelephoneEventCodec);
2043 parameters.codecs.push_back(kRedCodec);
2044 parameters.codecs[0].name = "iSaC";
2045 parameters.codecs[0].id = 96;
2046 parameters.codecs[2].id = 97; // wideband CN
2047 parameters.codecs[4].id = 98; // DTMF
2048 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002049 webrtc::CodecInst gcodec;
2050 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2051 EXPECT_EQ(96, gcodec.pltype);
2052 EXPECT_STREQ("ISAC", gcodec.plname);
2053 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002054 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002055 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2056 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002057 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002058}
2059
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002060// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002061TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002062 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002063 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002064 cricket::AudioSendParameters parameters;
2065 parameters.codecs.push_back(kRedCodec);
2066 parameters.codecs.push_back(kIsacCodec);
2067 parameters.codecs.push_back(kPcmuCodec);
2068 parameters.codecs[0].id = 127;
2069 parameters.codecs[0].params[""] = "96/96";
2070 parameters.codecs[1].id = 96;
2071 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002072 webrtc::CodecInst gcodec;
2073 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2074 EXPECT_EQ(96, gcodec.pltype);
2075 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002076 EXPECT_TRUE(voe_.GetRED(channel_num));
2077 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002078}
2079
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002080// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002081TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002082 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002083 cricket::AudioSendParameters parameters;
2084 parameters.codecs.push_back(kRedCodec);
2085 parameters.codecs.push_back(kIsacCodec);
2086 parameters.codecs.push_back(kPcmuCodec);
2087 parameters.codecs[0].id = 127;
2088 parameters.codecs[0].params[""] = "96/96";
2089 parameters.codecs[1].id = 96;
2090 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002091 EXPECT_TRUE(channel_->AddSendStream(
2092 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002093 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002094 webrtc::CodecInst gcodec;
2095 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2096 EXPECT_EQ(96, gcodec.pltype);
2097 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002098 EXPECT_TRUE(voe_.GetRED(channel_num));
2099 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002100}
2101
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002102// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002103TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002104 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002106 cricket::AudioSendParameters parameters;
2107 parameters.codecs.push_back(kRedCodec);
2108 parameters.codecs.push_back(kIsacCodec);
2109 parameters.codecs.push_back(kPcmuCodec);
2110 parameters.codecs[0].id = 127;
2111 parameters.codecs[1].id = 96;
2112 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002113 webrtc::CodecInst gcodec;
2114 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2115 EXPECT_EQ(96, gcodec.pltype);
2116 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002117 EXPECT_TRUE(voe_.GetRED(channel_num));
2118 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002119}
2120
2121// Test that we ignore RED if the parameters aren't named the way we expect.
2122TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002123 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002124 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002125 cricket::AudioSendParameters parameters;
2126 parameters.codecs.push_back(kRedCodec);
2127 parameters.codecs.push_back(kIsacCodec);
2128 parameters.codecs.push_back(kPcmuCodec);
2129 parameters.codecs[0].id = 127;
2130 parameters.codecs[0].params["ABC"] = "96/96";
2131 parameters.codecs[1].id = 96;
2132 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133 webrtc::CodecInst gcodec;
2134 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2135 EXPECT_EQ(96, gcodec.pltype);
2136 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002137 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002138}
2139
2140// Test that we ignore RED if it uses different primary/secondary encoding.
2141TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002142 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002144 cricket::AudioSendParameters parameters;
2145 parameters.codecs.push_back(kRedCodec);
2146 parameters.codecs.push_back(kIsacCodec);
2147 parameters.codecs.push_back(kPcmuCodec);
2148 parameters.codecs[0].id = 127;
2149 parameters.codecs[0].params[""] = "96/0";
2150 parameters.codecs[1].id = 96;
2151 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152 webrtc::CodecInst gcodec;
2153 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2154 EXPECT_EQ(96, gcodec.pltype);
2155 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002156 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002157}
2158
2159// Test that we ignore RED if it uses more than 2 encodings.
2160TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002161 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002162 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002163 cricket::AudioSendParameters parameters;
2164 parameters.codecs.push_back(kRedCodec);
2165 parameters.codecs.push_back(kIsacCodec);
2166 parameters.codecs.push_back(kPcmuCodec);
2167 parameters.codecs[0].id = 127;
2168 parameters.codecs[0].params[""] = "96/96/96";
2169 parameters.codecs[1].id = 96;
2170 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 webrtc::CodecInst gcodec;
2172 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2173 EXPECT_EQ(96, gcodec.pltype);
2174 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002175 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002176}
2177
2178// Test that we ignore RED if it has bogus codec ids.
2179TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002180 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002182 cricket::AudioSendParameters parameters;
2183 parameters.codecs.push_back(kRedCodec);
2184 parameters.codecs.push_back(kIsacCodec);
2185 parameters.codecs.push_back(kPcmuCodec);
2186 parameters.codecs[0].id = 127;
2187 parameters.codecs[0].params[""] = "ABC/ABC";
2188 parameters.codecs[1].id = 96;
2189 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002190 webrtc::CodecInst gcodec;
2191 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2192 EXPECT_EQ(96, gcodec.pltype);
2193 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002194 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002195}
2196
2197// Test that we ignore RED if it refers to a codec that is not present.
2198TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002199 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002200 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002201 cricket::AudioSendParameters parameters;
2202 parameters.codecs.push_back(kRedCodec);
2203 parameters.codecs.push_back(kIsacCodec);
2204 parameters.codecs.push_back(kPcmuCodec);
2205 parameters.codecs[0].id = 127;
2206 parameters.codecs[0].params[""] = "97/97";
2207 parameters.codecs[1].id = 96;
2208 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209 webrtc::CodecInst gcodec;
2210 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2211 EXPECT_EQ(96, gcodec.pltype);
2212 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002213 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002214}
2215
stefanba4c0e42016-02-04 04:12:24 -08002216class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2217 public:
2218 WebRtcVoiceEngineWithSendSideBweTest()
2219 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2220};
2221
2222TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2223 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002224 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002225 ASSERT_FALSE(capabilities.header_extensions.empty());
2226 for (const cricket::RtpHeaderExtension& extension :
2227 capabilities.header_extensions) {
2228 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2229 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2230 extension.id);
2231 return;
2232 }
2233 }
2234 FAIL() << "Transport sequence number extension not in header-extension list.";
2235}
2236
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002237// Test support for audio level header extension.
2238TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2239 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002240}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002241TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2242 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2243}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002244
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002245// Test support for absolute send time header extension.
2246TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2247 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2248}
2249TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2250 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251}
2252
solenberg1ac56142015-10-13 03:58:19 -07002253// Test that we can create a channel and start sending on it.
2254TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002255 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002256 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002257 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002258 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002259 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002260 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2261}
2262
2263// Test that a channel will send if and only if it has a source and is enabled
2264// for sending.
2265TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002266 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002267 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2268 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002269 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002270 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2271 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2272 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2273 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2274 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002275}
2276
solenberg6d6e7c52016-04-13 09:07:30 -07002277// Test that SetSendParameters() does not alter a stream's send state.
2278TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2279 EXPECT_TRUE(SetupSendStream());
2280 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2281
2282 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002283 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002284 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2285
2286 // Changing RTP header extensions will recreate the AudioSendStream.
2287 send_parameters_.extensions.push_back(
2288 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2289 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2290 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2291
2292 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002293 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002294 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2295
2296 // Changing RTP header extensions will recreate the AudioSendStream.
2297 send_parameters_.extensions.clear();
2298 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2299 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2300}
2301
solenberg1ac56142015-10-13 03:58:19 -07002302// Test that we can create a channel and start playing out on it.
2303TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002304 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002305 int channel_num = voe_.GetLastChannel();
2306 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2307 EXPECT_TRUE(channel_->SetPlayout(true));
2308 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309 EXPECT_TRUE(channel_->SetPlayout(false));
2310 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2311}
2312
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002313// Test that we can add and remove send streams.
2314TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2315 SetupForMultiSendStream();
2316
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002317 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002318 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002319
solenbergc96df772015-10-21 13:01:53 -07002320 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002321 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002322 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002323 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002324 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002325 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002326 }
tfarina5237aaf2015-11-10 23:44:30 -08002327 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002328
solenbergc96df772015-10-21 13:01:53 -07002329 // Delete the send streams.
2330 for (uint32_t ssrc : kSsrcs4) {
2331 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002332 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002333 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002334 }
solenbergc96df772015-10-21 13:01:53 -07002335 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002336}
2337
2338// Test SetSendCodecs correctly configure the codecs in all send streams.
2339TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2340 SetupForMultiSendStream();
2341
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002342 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002343 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002344 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002345 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002346 }
2347
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002348 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002349 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002350 parameters.codecs.push_back(kIsacCodec);
2351 parameters.codecs.push_back(kCn16000Codec);
2352 parameters.codecs[1].id = 97;
2353 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002354
2355 // Verify ISAC and VAD are corrected configured on all send channels.
2356 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002357 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002358 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002359 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2360 EXPECT_STREQ("ISAC", gcodec.plname);
2361 EXPECT_TRUE(voe_.GetVAD(channel_num));
2362 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2363 }
2364
2365 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002366 parameters.codecs[0] = kPcmuCodec;
2367 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002368 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002369 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002370 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2371 EXPECT_STREQ("PCMU", gcodec.plname);
2372 EXPECT_FALSE(voe_.GetVAD(channel_num));
2373 }
2374}
2375
2376// Test we can SetSend on all send streams correctly.
2377TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2378 SetupForMultiSendStream();
2379
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002380 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002381 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002382 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002383 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002384 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2385 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002386 }
2387
2388 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002389 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002390 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002391 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002392 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002393 }
2394
2395 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002396 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002397 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002398 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002399 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002400 }
2401}
2402
2403// Test we can set the correct statistics on all send streams.
2404TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2405 SetupForMultiSendStream();
2406
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002407 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002408 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002409 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002410 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002411 }
solenberg85a04962015-10-27 03:35:21 -07002412 SetAudioSendStreamStats();
2413
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002414 // Create a receive stream to check that none of the send streams end up in
2415 // the receive stream stats.
2416 EXPECT_TRUE(channel_->AddRecvStream(
2417 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002418 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002419 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2420 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002421
solenberg85a04962015-10-27 03:35:21 -07002422 // Check stats for the added streams.
2423 {
2424 cricket::VoiceMediaInfo info;
2425 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002426
solenberg85a04962015-10-27 03:35:21 -07002427 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002428 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002429 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002430 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002431 }
2432
2433 // We have added one receive stream. We should see empty stats.
2434 EXPECT_EQ(info.receivers.size(), 1u);
2435 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002436 }
solenberg1ac56142015-10-13 03:58:19 -07002437
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002438 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002439 {
2440 cricket::VoiceMediaInfo info;
2441 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2442 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002443 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002444 EXPECT_EQ(0u, info.receivers.size());
2445 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002446
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002447 // Deliver a new packet - a default receive stream should be created and we
2448 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002449 {
2450 cricket::VoiceMediaInfo info;
2451 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2452 SetAudioReceiveStreamStats();
2453 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002454 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002455 EXPECT_EQ(1u, info.receivers.size());
2456 VerifyVoiceReceiverInfo(info.receivers[0]);
2457 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002458}
2459
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002460// Test that we can add and remove receive streams, and do proper send/playout.
2461// We can receive on multiple streams while sending one stream.
2462TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002463 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464 int channel_num1 = voe_.GetLastChannel();
2465
solenberg1ac56142015-10-13 03:58:19 -07002466 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002467 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002468 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002469 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470
solenberg1ac56142015-10-13 03:58:19 -07002471 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002472 EXPECT_TRUE(
2473 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002474 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002475 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002476 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477
solenberg1ac56142015-10-13 03:58:19 -07002478 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2480 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2481
2482 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002483 EXPECT_TRUE(
2484 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002485 int channel_num3 = voe_.GetLastChannel();
2486 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2487 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2488 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489
2490 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002491 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002492 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002493
2494 // Stop playout.
2495 EXPECT_TRUE(channel_->SetPlayout(false));
2496 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2497 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2498 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2499
solenberg1ac56142015-10-13 03:58:19 -07002500 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501 EXPECT_TRUE(channel_->SetPlayout(true));
2502 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2503 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2504 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2505
solenberg1ac56142015-10-13 03:58:19 -07002506 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2508 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002509 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510}
2511
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002513// and start sending on it.
2514TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002515 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002516 cricket::AudioOptions options_adjust_agc;
2517 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518 webrtc::AgcConfig agc_config;
2519 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2520 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002521 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002522 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002523 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002524 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002525 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2526 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002527 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002528 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530}
2531
wu@webrtc.org97077a32013-10-25 21:18:33 +00002532TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002533 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002534 EXPECT_CALL(adm_,
2535 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002536 webrtc::AgcConfig agc_config;
2537 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2538 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002539 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2540 send_parameters_.options.tx_agc_digital_compression_gain =
2541 rtc::Optional<uint16_t>(9);
2542 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2543 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2544 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002545 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2546 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2547 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2548 EXPECT_TRUE(agc_config.limiterEnable);
2549
2550 // Check interaction with adjust_agc_delta. Both should be respected, for
2551 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002552 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2553 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002554 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2555 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2556}
2557
wu@webrtc.org97077a32013-10-25 21:18:33 +00002558TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002559 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002560 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2561 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002562 send_parameters_.options.recording_sample_rate =
2563 rtc::Optional<uint32_t>(48000);
2564 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2565 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002566}
2567
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002568// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002569// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002571 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002572 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573}
2574
2575TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2576 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002577 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002578 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002579 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002580 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002581 EXPECT_TRUE(channel_->AddRecvStream(
2582 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002583 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2584 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002585
solenberg85a04962015-10-27 03:35:21 -07002586 // Check stats for the added streams.
2587 {
2588 cricket::VoiceMediaInfo info;
2589 EXPECT_EQ(true, channel_->GetStats(&info));
2590
2591 // We have added one send stream. We should see the stats we've set.
2592 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002593 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002594 // We have added one receive stream. We should see empty stats.
2595 EXPECT_EQ(info.receivers.size(), 1u);
2596 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2597 }
solenberg1ac56142015-10-13 03:58:19 -07002598
solenberg566ef242015-11-06 15:34:49 -08002599 // Start sending - this affects some reported stats.
2600 {
2601 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002602 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002603 EXPECT_EQ(true, channel_->GetStats(&info));
2604 VerifyVoiceSenderInfo(info.senders[0], true);
2605 }
2606
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002607 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002608 {
2609 cricket::VoiceMediaInfo info;
2610 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2611 EXPECT_EQ(true, channel_->GetStats(&info));
2612 EXPECT_EQ(1u, info.senders.size());
2613 EXPECT_EQ(0u, info.receivers.size());
2614 }
solenberg1ac56142015-10-13 03:58:19 -07002615
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002616 // Deliver a new packet - a default receive stream should be created and we
2617 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002618 {
2619 cricket::VoiceMediaInfo info;
2620 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2621 SetAudioReceiveStreamStats();
2622 EXPECT_EQ(true, channel_->GetStats(&info));
2623 EXPECT_EQ(1u, info.senders.size());
2624 EXPECT_EQ(1u, info.receivers.size());
2625 VerifyVoiceReceiverInfo(info.receivers[0]);
2626 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627}
2628
2629// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002630// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002631TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002632 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002633 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002634 EXPECT_TRUE(channel_->AddRecvStream(
2635 cricket::StreamParams::CreateLegacy(kSsrc2)));
2636 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002637}
2638
2639// Test that the local SSRC is the same on sending and receiving channels if the
2640// receive channel is created before the send channel.
2641TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002642 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002643 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2644 int receive_channel_num = voe_.GetLastChannel();
2645 EXPECT_TRUE(channel_->AddSendStream(
2646 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647
solenberg3a941542015-11-16 07:34:50 -08002648 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002649 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002650}
2651
2652// Test that we can properly receive packets.
2653TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002654 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002655 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002657
2658 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2659 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660}
2661
2662// Test that we can properly receive packets on multiple streams.
2663TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002664 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002665 const uint32_t ssrc1 = 1;
2666 const uint32_t ssrc2 = 2;
2667 const uint32_t ssrc3 = 3;
2668 EXPECT_TRUE(channel_->AddRecvStream(
2669 cricket::StreamParams::CreateLegacy(ssrc1)));
2670 EXPECT_TRUE(channel_->AddRecvStream(
2671 cricket::StreamParams::CreateLegacy(ssrc2)));
2672 EXPECT_TRUE(channel_->AddRecvStream(
2673 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002675 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002676 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002678 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679 }
mflodman3d7db262016-04-29 00:57:13 -07002680
2681 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2682 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2683 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2684
2685 EXPECT_EQ(s1.received_packets(), 0);
2686 EXPECT_EQ(s2.received_packets(), 0);
2687 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002688
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002690 EXPECT_EQ(s1.received_packets(), 0);
2691 EXPECT_EQ(s2.received_packets(), 0);
2692 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002693
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002694 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002695 EXPECT_EQ(s1.received_packets(), 1);
2696 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2697 EXPECT_EQ(s2.received_packets(), 0);
2698 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002699
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002700 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002701 EXPECT_EQ(s1.received_packets(), 1);
2702 EXPECT_EQ(s2.received_packets(), 1);
2703 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2704 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002705
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002706 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002707 EXPECT_EQ(s1.received_packets(), 1);
2708 EXPECT_EQ(s2.received_packets(), 1);
2709 EXPECT_EQ(s3.received_packets(), 1);
2710 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002711
mflodman3d7db262016-04-29 00:57:13 -07002712 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2713 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2714 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002715}
2716
solenberg7e63ef02015-11-20 00:19:43 -08002717// Test that receiving on an unsignalled stream works (default channel will be
2718// created).
2719TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002720 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002721 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2722
solenberg7e63ef02015-11-20 00:19:43 -08002723 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002724
2725 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2726 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2727 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002728}
2729
2730// Test that receiving on an unsignalled stream works (default channel will be
2731// created), and that packets will be forwarded to the default channel
2732// regardless of their SSRCs.
2733TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002734 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002735 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002736 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2737
mflodman3d7db262016-04-29 00:57:13 -07002738 // Note that ssrc = 0 is not supported.
2739 uint32_t ssrc = 1;
2740 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002741 rtc::SetBE32(&packet[8], ssrc);
2742 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002743
2744 // Verify we only have one default stream.
2745 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2746 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2747 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002748 }
mflodman3d7db262016-04-29 00:57:13 -07002749
2750 // Sending the same ssrc again should not create a new stream.
2751 --ssrc;
2752 DeliverPacket(packet, sizeof(packet));
2753 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2754 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2755 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002756}
2757
2758// Test that a default channel is created even after a signalled stream has been
2759// added, and that this stream will get any packets for unknown SSRCs.
2760TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002761 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002762 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002763 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2764
2765 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002766 const uint32_t signaled_ssrc = 1;
2767 rtc::SetBE32(&packet[8], signaled_ssrc);
2768 EXPECT_TRUE(channel_->AddRecvStream(
2769 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002770 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002771 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2772 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002773
2774 // Note that the first unknown SSRC cannot be 0, because we only support
2775 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002776 const uint32_t unsignaled_ssrc = 7011;
2777 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002778 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002779 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2780 packet, sizeof(packet)));
2781 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2782
2783 DeliverPacket(packet, sizeof(packet));
2784 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2785
2786 rtc::SetBE32(&packet[8], signaled_ssrc);
2787 DeliverPacket(packet, sizeof(packet));
2788 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2789 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002790}
2791
solenberg0a617e22015-10-20 15:49:38 -07002792// Test that we properly handle failures to add a receive stream.
2793TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002794 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002795 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002797}
2798
solenberg0a617e22015-10-20 15:49:38 -07002799// Test that we properly handle failures to add a send stream.
2800TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002801 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002802 voe_.set_fail_create_channel(true);
2803 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2804}
2805
solenberg1ac56142015-10-13 03:58:19 -07002806// Test that AddRecvStream creates new stream.
2807TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002808 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809 int channel_num = voe_.GetLastChannel();
2810 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002811 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002812}
2813
2814// Test that after adding a recv stream, we do not decode more codecs than
2815// those previously passed into SetRecvCodecs.
2816TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002817 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002818 cricket::AudioRecvParameters parameters;
2819 parameters.codecs.push_back(kIsacCodec);
2820 parameters.codecs.push_back(kPcmuCodec);
2821 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822 EXPECT_TRUE(channel_->AddRecvStream(
2823 cricket::StreamParams::CreateLegacy(kSsrc1)));
2824 int channel_num2 = voe_.GetLastChannel();
2825 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002826 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002827 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002828 gcodec.channels = 2;
2829 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2830}
2831
2832// Test that we properly clean up any streams that were added, even if
2833// not explicitly removed.
2834TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002835 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002836 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002837 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2838 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2839 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2840 delete channel_;
2841 channel_ = NULL;
2842 EXPECT_EQ(0, voe_.GetNumChannels());
2843}
2844
wu@webrtc.org78187522013-10-07 23:32:02 +00002845TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002846 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002847 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2848}
2849
2850TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002851 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002852 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002853 // Manually delete channel to simulate a failure.
2854 int channel = voe_.GetLastChannel();
2855 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2856 // Add recv stream 2 should work.
2857 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002858 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002859 EXPECT_NE(channel, new_channel);
2860 // The last created channel is deleted too.
2861 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002862}
2863
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002864// Test the InsertDtmf on default send stream as caller.
2865TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2866 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002867}
2868
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002869// Test the InsertDtmf on default send stream as callee
2870TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2871 TestInsertDtmf(0, false);
2872}
2873
2874// Test the InsertDtmf on specified send stream as caller.
2875TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2876 TestInsertDtmf(kSsrc1, true);
2877}
2878
2879// Test the InsertDtmf on specified send stream as callee.
2880TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2881 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002882}
2883
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002884TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002885 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002886 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002887 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002888 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2889 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2890 EXPECT_TRUE(channel_->SetPlayout(true));
2891 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2892 EXPECT_TRUE(channel_->SetPlayout(false));
2893 EXPECT_FALSE(channel_->SetPlayout(true));
2894}
2895
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002896TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002897 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002898 EXPECT_CALL(adm_,
2899 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2900 EXPECT_CALL(adm_,
2901 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2902 EXPECT_CALL(adm_,
2903 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002904 bool ec_enabled;
2905 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002906 webrtc::AecmModes aecm_mode;
2907 bool cng_enabled;
2908 bool agc_enabled;
2909 webrtc::AgcModes agc_mode;
2910 webrtc::AgcConfig agc_config;
2911 bool ns_enabled;
2912 webrtc::NsModes ns_mode;
2913 bool highpass_filter_enabled;
2914 bool stereo_swapping_enabled;
2915 bool typing_detection_enabled;
2916 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 voe_.GetAecmMode(aecm_mode, cng_enabled);
2918 voe_.GetAgcStatus(agc_enabled, agc_mode);
2919 voe_.GetAgcConfig(agc_config);
2920 voe_.GetNsStatus(ns_enabled, ns_mode);
2921 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2922 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2923 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2924 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002925 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926 EXPECT_FALSE(cng_enabled);
2927 EXPECT_TRUE(agc_enabled);
2928 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2929 EXPECT_TRUE(ns_enabled);
2930 EXPECT_TRUE(highpass_filter_enabled);
2931 EXPECT_FALSE(stereo_swapping_enabled);
2932 EXPECT_TRUE(typing_detection_enabled);
2933 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2934 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002935 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2936 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937
solenberg246b8172015-12-08 09:50:23 -08002938 // Nothing set in AudioOptions, so everything should be as default.
2939 send_parameters_.options = cricket::AudioOptions();
2940 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942 voe_.GetAecmMode(aecm_mode, cng_enabled);
2943 voe_.GetAgcStatus(agc_enabled, agc_mode);
2944 voe_.GetAgcConfig(agc_config);
2945 voe_.GetNsStatus(ns_enabled, ns_mode);
2946 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2947 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2948 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2949 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002950 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002951 EXPECT_FALSE(cng_enabled);
2952 EXPECT_TRUE(agc_enabled);
2953 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2954 EXPECT_TRUE(ns_enabled);
2955 EXPECT_TRUE(highpass_filter_enabled);
2956 EXPECT_FALSE(stereo_swapping_enabled);
2957 EXPECT_TRUE(typing_detection_enabled);
2958 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2959 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002960 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2961 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002962
2963 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002964 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2965 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002966 voe_.GetEcStatus(ec_enabled, ec_mode);
2967 EXPECT_FALSE(ec_enabled);
2968
2969 // Turn echo cancellation back on, with settings, and make sure
2970 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002971 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2972 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002973 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002974 voe_.GetAecmMode(aecm_mode, cng_enabled);
2975 voe_.GetAgcStatus(agc_enabled, agc_mode);
2976 voe_.GetAgcConfig(agc_config);
2977 voe_.GetNsStatus(ns_enabled, ns_mode);
2978 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2979 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2980 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2981 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002982 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002983 EXPECT_TRUE(agc_enabled);
2984 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2985 EXPECT_TRUE(ns_enabled);
2986 EXPECT_TRUE(highpass_filter_enabled);
2987 EXPECT_FALSE(stereo_swapping_enabled);
2988 EXPECT_TRUE(typing_detection_enabled);
2989 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2990 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2991
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002992 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2993 // control.
solenberg246b8172015-12-08 09:50:23 -08002994 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2995 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002996 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002997 voe_.GetAecmMode(aecm_mode, cng_enabled);
2998 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002999 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003000 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3001
3002 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08003003 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
3004 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
3005 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
3006 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003007 voe_.GetEcStatus(ec_enabled, ec_mode);
3008 EXPECT_FALSE(ec_enabled);
3009 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08003010 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3011 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003012 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003013 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003014 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003015 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3016
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003017 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08003018 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
3019 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003020 voe_.GetAgcStatus(agc_enabled, agc_mode);
3021 EXPECT_FALSE(agc_enabled);
3022
3023 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08003024 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
3025 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
3026 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003027 voe_.GetAgcStatus(agc_enabled, agc_mode);
3028 EXPECT_TRUE(agc_enabled);
3029 voe_.GetAgcConfig(agc_config);
3030 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3031
3032 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08003033 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
3034 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
3035 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
3036 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
3037 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003038 voe_.GetNsStatus(ns_enabled, ns_mode);
3039 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3040 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3041 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3042 EXPECT_FALSE(ns_enabled);
3043 EXPECT_FALSE(highpass_filter_enabled);
3044 EXPECT_FALSE(typing_detection_enabled);
3045 EXPECT_TRUE(stereo_swapping_enabled);
3046
solenberg1ac56142015-10-13 03:58:19 -07003047 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08003048 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003049 voe_.GetEcStatus(ec_enabled, ec_mode);
3050 voe_.GetNsStatus(ns_enabled, ns_mode);
3051 EXPECT_TRUE(ec_enabled);
3052 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3053 EXPECT_FALSE(ns_enabled);
3054 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3055}
3056
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003057TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003058 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003059
3060 bool ec_enabled;
3061 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003062 bool agc_enabled;
3063 webrtc::AgcModes agc_mode;
3064 bool ns_enabled;
3065 webrtc::NsModes ns_mode;
3066 bool highpass_filter_enabled;
3067 bool stereo_swapping_enabled;
3068 bool typing_detection_enabled;
3069
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003070 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003071 voe_.GetAgcStatus(agc_enabled, agc_mode);
3072 voe_.GetNsStatus(ns_enabled, ns_mode);
3073 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3074 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3075 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3076 EXPECT_TRUE(ec_enabled);
3077 EXPECT_TRUE(agc_enabled);
3078 EXPECT_TRUE(ns_enabled);
3079 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003080 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003081 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003082}
3083
3084TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3085 webrtc::AgcConfig set_config = {0};
3086 set_config.targetLeveldBOv = 3;
3087 set_config.digitalCompressionGaindB = 9;
3088 set_config.limiterEnable = true;
3089 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003090
3091 webrtc::AgcConfig config = {0};
3092 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3093 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3094 EXPECT_EQ(set_config.digitalCompressionGaindB,
3095 config.digitalCompressionGaindB);
3096 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3097}
3098
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003099TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003100 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003101 EXPECT_CALL(adm_,
3102 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3103 EXPECT_CALL(adm_,
3104 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3105 EXPECT_CALL(adm_,
3106 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3107
kwiberg686a8ef2016-02-26 03:00:35 -08003108 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003109 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003110 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003111 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003112 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003113 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003114
3115 // Have to add a stream to make SetSend work.
3116 cricket::StreamParams stream1;
3117 stream1.ssrcs.push_back(1);
3118 channel1->AddSendStream(stream1);
3119 cricket::StreamParams stream2;
3120 stream2.ssrcs.push_back(2);
3121 channel2->AddSendStream(stream2);
3122
3123 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003124 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003125 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3126 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3127 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003128 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3129 EXPECT_EQ(parameters_options_all.options, channel1->options());
3130 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3131 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003132
3133 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003134 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003135 parameters_options_no_ns.options.noise_suppression =
3136 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003137 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3138 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003139 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3140 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3141 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003142 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003143
3144 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003145 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003146 parameters_options_no_agc.options.auto_gain_control =
3147 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003148 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003149 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3150 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3151 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003152 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003153
solenberg246b8172015-12-08 09:50:23 -08003154 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003155 bool ec_enabled;
3156 webrtc::EcModes ec_mode;
3157 bool agc_enabled;
3158 webrtc::AgcModes agc_mode;
3159 bool ns_enabled;
3160 webrtc::NsModes ns_mode;
3161 voe_.GetEcStatus(ec_enabled, ec_mode);
3162 voe_.GetAgcStatus(agc_enabled, agc_mode);
3163 voe_.GetNsStatus(ns_enabled, ns_mode);
3164 EXPECT_TRUE(ec_enabled);
3165 EXPECT_TRUE(agc_enabled);
3166 EXPECT_TRUE(ns_enabled);
3167
solenbergd53a3f92016-04-14 13:56:37 -07003168 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003169 voe_.GetEcStatus(ec_enabled, ec_mode);
3170 voe_.GetAgcStatus(agc_enabled, agc_mode);
3171 voe_.GetNsStatus(ns_enabled, ns_mode);
3172 EXPECT_TRUE(ec_enabled);
3173 EXPECT_TRUE(agc_enabled);
3174 EXPECT_FALSE(ns_enabled);
3175
solenbergd53a3f92016-04-14 13:56:37 -07003176 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003177 voe_.GetEcStatus(ec_enabled, ec_mode);
3178 voe_.GetAgcStatus(agc_enabled, agc_mode);
3179 voe_.GetNsStatus(ns_enabled, ns_mode);
3180 EXPECT_TRUE(ec_enabled);
3181 EXPECT_FALSE(agc_enabled);
3182 EXPECT_TRUE(ns_enabled);
3183
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003184 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003185 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003186 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3187 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003188 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003189 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003190 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003191 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003192 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003193 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003194 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3195 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3196 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003197 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003198 voe_.GetEcStatus(ec_enabled, ec_mode);
3199 voe_.GetAgcStatus(agc_enabled, agc_mode);
3200 voe_.GetNsStatus(ns_enabled, ns_mode);
3201 EXPECT_TRUE(ec_enabled);
3202 EXPECT_FALSE(agc_enabled);
3203 EXPECT_FALSE(ns_enabled);
3204}
3205
wu@webrtc.orgde305012013-10-31 15:40:38 +00003206// This test verifies DSCP settings are properly applied on voice media channel.
3207TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003208 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003209 cricket::FakeNetworkInterface network_interface;
3210 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003211 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003212
solenbergbc37fc82016-04-04 09:54:44 -07003213 channel.reset(
3214 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003215 channel->SetInterface(&network_interface);
3216 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3217 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3218
3219 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003220 channel.reset(
3221 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003222 channel->SetInterface(&network_interface);
3223 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3224
3225 // Verify that setting the option to false resets the
3226 // DiffServCodePoint.
3227 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003228 channel.reset(
3229 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003230 channel->SetInterface(&network_interface);
3231 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3232 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3233
3234 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003235}
3236
solenberg1ac56142015-10-13 03:58:19 -07003237TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003238 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003239 cricket::WebRtcVoiceMediaChannel* media_channel =
3240 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003241 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3242 EXPECT_TRUE(channel_->AddRecvStream(
3243 cricket::StreamParams::CreateLegacy(kSsrc1)));
3244 int channel_id = voe_.GetLastChannel();
3245 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3246 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3247 EXPECT_TRUE(channel_->AddRecvStream(
3248 cricket::StreamParams::CreateLegacy(kSsrc2)));
3249 int channel_id2 = voe_.GetLastChannel();
3250 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003251}
3252
solenberg1ac56142015-10-13 03:58:19 -07003253TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003254 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003255 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003256 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3257 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3258 EXPECT_TRUE(channel_->AddSendStream(
3259 cricket::StreamParams::CreateLegacy(kSsrc1)));
3260 int channel_id = voe_.GetLastChannel();
3261 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3262 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3263 EXPECT_TRUE(channel_->AddSendStream(
3264 cricket::StreamParams::CreateLegacy(kSsrc2)));
3265 int channel_id2 = voe_.GetLastChannel();
3266 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003267}
3268
solenberg4bac9c52015-10-09 02:32:53 -07003269TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003270 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003271 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003272 cricket::StreamParams stream;
3273 stream.ssrcs.push_back(kSsrc2);
3274 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003275 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003276 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003277 float scale = 0;
3278 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3279 EXPECT_DOUBLE_EQ(3, scale);
3280}
3281
3282TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003283 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003284 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3285 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3286 int channel_id = voe_.GetLastChannel();
3287 float scale = 0;
3288 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3289 EXPECT_DOUBLE_EQ(2, scale);
3290 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003291 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003292 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003293}
3294
pbos8fc7fa72015-07-15 08:02:58 -07003295TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003296 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003297 const std::string kSyncLabel = "AvSyncLabel";
3298
solenbergff976312016-03-30 23:28:51 -07003299 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003300 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3301 sp.sync_label = kSyncLabel;
3302 // Creating two channels to make sure that sync label is set properly for both
3303 // the default voice channel and following ones.
3304 EXPECT_TRUE(channel_->AddRecvStream(sp));
3305 sp.ssrcs[0] += 1;
3306 EXPECT_TRUE(channel_->AddRecvStream(sp));
3307
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003308 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003309 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003310 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003311 << "SyncGroup should be set based on sync_label";
3312 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003313 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003314 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003315}
3316
solenberg3a941542015-11-16 07:34:50 -08003317// TODO(solenberg): Remove, once recv streams are configured through Call.
3318// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003319TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003320 // Test that setting the header extensions results in the expected state
3321 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003322 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003323 ssrcs.push_back(223);
3324 ssrcs.push_back(224);
3325
solenbergff976312016-03-30 23:28:51 -07003326 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003327 cricket::WebRtcVoiceMediaChannel* media_channel =
3328 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003329 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003330 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003331 EXPECT_TRUE(media_channel->AddRecvStream(
3332 cricket::StreamParams::CreateLegacy(ssrc)));
3333 }
3334
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003335 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003336 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003337 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003338 EXPECT_NE(nullptr, s);
3339 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3340 }
3341
3342 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003343 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003344 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003345 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003346 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003347 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003348 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003349 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003350 EXPECT_NE(nullptr, s);
3351 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003352 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3353 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003354 for (const auto& s_ext : s_exts) {
3355 if (e_ext.id == s_ext.id) {
3356 EXPECT_EQ(e_ext.uri, s_ext.name);
3357 }
3358 }
3359 }
3360 }
3361
3362 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003363 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003364 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003365 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003366 EXPECT_NE(nullptr, s);
3367 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3368 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003369}
3370
3371TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3372 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003373 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003374 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003375 static const unsigned char kRtcp[] = {
3376 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3377 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3380 };
jbaucheec21bd2016-03-20 06:15:43 -07003381 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003382
solenbergff976312016-03-30 23:28:51 -07003383 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003384 cricket::WebRtcVoiceMediaChannel* media_channel =
3385 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003386 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003387 EXPECT_TRUE(media_channel->AddRecvStream(
3388 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3389
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003390 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003391 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003392 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003393 EXPECT_EQ(0, s->received_packets());
3394 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3395 EXPECT_EQ(1, s->received_packets());
3396 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3397 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003398}
Minyue2013aec2015-05-13 14:14:42 +02003399
solenberg0a617e22015-10-20 15:49:38 -07003400// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003401// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003402TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003403 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003404 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003405 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003406 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3407 int recv_ch = voe_.GetLastChannel();
3408 EXPECT_NE(recv_ch, default_channel);
3409 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3410 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3411 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003412 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3413 recv_ch = voe_.GetLastChannel();
3414 EXPECT_NE(recv_ch, default_channel);
3415 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003416}
3417
3418TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003419 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003420 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003421
3422 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3423 int recv_ch = voe_.GetLastChannel();
3424
3425 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3426 int send_ch = voe_.GetLastChannel();
3427
3428 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3429 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3430 // channel of |recv_ch|.This is not a common case, since, normally, only the
3431 // default channel can be associated. However, the default is not deletable.
3432 // So we force the |recv_ch| to associate with a non-default channel.
3433 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3434 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3435
3436 EXPECT_TRUE(channel_->RemoveSendStream(2));
3437 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3438}
stefan658910c2015-09-03 05:48:32 -07003439
deadbeef884f5852016-01-15 09:20:04 -08003440TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003441 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003442 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3443 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003444
3445 // Setting the sink before a recv stream exists should do nothing.
3446 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3447 EXPECT_TRUE(
3448 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3449 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3450
3451 // Now try actually setting the sink.
3452 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3453 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3454
3455 // Now try resetting it.
3456 channel_->SetRawAudioSink(kSsrc1, nullptr);
3457 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3458}
3459
3460TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003461 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003462 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3463 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003464
3465 // Should be able to set a default sink even when no stream exists.
3466 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3467
3468 // Create default channel and ensure it's assigned the default sink.
3469 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3470 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3471
3472 // Try resetting the default sink.
3473 channel_->SetRawAudioSink(0, nullptr);
3474 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3475
3476 // Try setting the default sink while the default stream exists.
3477 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3478 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3479
3480 // If we remove and add a default stream, it should get the same sink.
3481 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3482 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3483 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3484}
3485
skvlad7a43d252016-03-22 15:32:27 -07003486// Test that, just like the video channel, the voice channel communicates the
3487// network state to the call.
3488TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003489 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003490
3491 EXPECT_EQ(webrtc::kNetworkUp,
3492 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3493 EXPECT_EQ(webrtc::kNetworkUp,
3494 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3495
3496 channel_->OnReadyToSend(false);
3497 EXPECT_EQ(webrtc::kNetworkDown,
3498 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3499 EXPECT_EQ(webrtc::kNetworkUp,
3500 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3501
3502 channel_->OnReadyToSend(true);
3503 EXPECT_EQ(webrtc::kNetworkUp,
3504 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3505 EXPECT_EQ(webrtc::kNetworkUp,
3506 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3507}
3508
stefan658910c2015-09-03 05:48:32 -07003509// Tests that the library initializes and shuts down properly.
3510TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003511 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003512 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003513 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003514 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3515 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003516 EXPECT_TRUE(channel != nullptr);
3517 delete channel;
solenbergff976312016-03-30 23:28:51 -07003518}
stefan658910c2015-09-03 05:48:32 -07003519
solenbergff976312016-03-30 23:28:51 -07003520// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003521TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3522 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3523 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3524 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003525 {
3526 cricket::WebRtcVoiceEngine engine(&adm);
3527 std::unique_ptr<webrtc::Call> call(
3528 webrtc::Call::Create(webrtc::Call::Config()));
3529 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3530 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3531 EXPECT_TRUE(channel != nullptr);
3532 delete channel;
3533 }
stefan658910c2015-09-03 05:48:32 -07003534}
3535
3536// Tests that the library is configured with the codecs we want.
3537TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003538 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003539 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003540 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003541 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003542 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003543 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003544 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003545 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003546 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003547 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003548 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003549 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003550 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003551 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003552 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003553 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003554 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003555 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003556 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003557 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003558 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003559 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003560 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003561 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003562 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003563 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003564 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003565 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003566 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003567 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003568 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003569 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003570 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003571 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003572 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003573 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003574 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003575 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003576 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003577 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003578 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003579 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003580 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003581 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003582 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003583 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003584 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003585 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003586 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003587 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003588 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003589
stefan658910c2015-09-03 05:48:32 -07003590 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003591 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003592 for (std::vector<cricket::AudioCodec>::const_iterator it =
3593 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3594 if (it->name == "CN" && it->clockrate == 16000) {
3595 EXPECT_EQ(105, it->id);
3596 } else if (it->name == "CN" && it->clockrate == 32000) {
3597 EXPECT_EQ(106, it->id);
3598 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3599 EXPECT_EQ(103, it->id);
3600 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3601 EXPECT_EQ(104, it->id);
3602 } else if (it->name == "G722" && it->clockrate == 8000) {
3603 EXPECT_EQ(9, it->id);
3604 } else if (it->name == "telephone-event") {
3605 EXPECT_EQ(126, it->id);
3606 } else if (it->name == "red") {
3607 EXPECT_EQ(127, it->id);
3608 } else if (it->name == "opus") {
3609 EXPECT_EQ(111, it->id);
3610 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3611 EXPECT_EQ("10", it->params.find("minptime")->second);
3612 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3613 EXPECT_EQ("60", it->params.find("maxptime")->second);
3614 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3615 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3616 }
3617 }
stefan658910c2015-09-03 05:48:32 -07003618}
3619
3620// Tests that VoE supports at least 32 channels
3621TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003622 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003623 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003624 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003625
3626 cricket::VoiceMediaChannel* channels[32];
3627 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003628 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003629 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3630 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003631 if (!channel)
3632 break;
stefan658910c2015-09-03 05:48:32 -07003633 channels[num_channels++] = channel;
3634 }
3635
tfarina5237aaf2015-11-10 23:44:30 -08003636 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003637 EXPECT_EQ(expected, num_channels);
3638
3639 while (num_channels > 0) {
3640 delete channels[--num_channels];
3641 }
stefan658910c2015-09-03 05:48:32 -07003642}
3643
3644// Test that we set our preferred codecs properly.
3645TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003646 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003647 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003648 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003649 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3650 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003651 cricket::AudioRecvParameters parameters;
3652 parameters.codecs = engine.codecs();
3653 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003654}