blob: 1ed493b6d0f5918cc1ac74a496e55061974b2f06 [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
36const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
44const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
45 1, 0);
solenberg85a04962015-10-27 03:35:21 -070046const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080047const uint32_t kSsrc2 = 2;
48const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
51class FakeVoEWrapper : public cricket::VoEWrapper {
52 public:
53 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
54 : cricket::VoEWrapper(engine, // processing
55 engine, // base
56 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 engine, // network
59 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine) { // volume
61 }
62};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020063} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
solenbergff976312016-03-30 23:28:51 -070065// Tests that our stub library "works".
66TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070067 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
68 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
69 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070070 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
71 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
72 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070073 cricket::FakeWebRtcVoiceEngine voe;
74 EXPECT_FALSE(voe.IsInited());
75 {
solenbergbc37fc82016-04-04 09:54:44 -070076 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070077 EXPECT_TRUE(voe.IsInited());
78 }
79 EXPECT_FALSE(voe.IsInited());
80}
81
deadbeef884f5852016-01-15 09:20:04 -080082class FakeAudioSink : public webrtc::AudioSinkInterface {
83 public:
84 void OnData(const Data& audio) override {}
85};
86
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080087class FakeAudioSource : public cricket::AudioSource {
88 void SetSink(Sink* sink) override {}
89};
90
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091class WebRtcVoiceEngineTestFake : public testing::Test {
92 public:
stefanba4c0e42016-02-04 04:12:24 -080093 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
94
95 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070096 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
97 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
98 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070099 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
100 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
101 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergbc37fc82016-04-04 09:54:44 -0700102 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
103 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200104 send_parameters_.codecs.push_back(kPcmuCodec);
105 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 }
solenbergff976312016-03-30 23:28:51 -0700107 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700108 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
109 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200110 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000111 }
solenbergff976312016-03-30 23:28:51 -0700112 bool SetupRecvStream() {
113 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700114 return false;
115 }
116 return channel_->AddRecvStream(
117 cricket::StreamParams::CreateLegacy(kSsrc1));
118 }
solenbergff976312016-03-30 23:28:51 -0700119 bool SetupSendStream() {
120 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000121 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800123 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
124 return false;
125 }
126 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000128 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700129 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700130 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800131 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700132 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700133 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800134 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000135 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700137 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000138 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200140 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
143
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100144 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
145 const auto* send_stream = call_.GetAudioSendStream(ssrc);
146 EXPECT_TRUE(send_stream);
147 return *send_stream;
148 }
149
deadbeef884f5852016-01-15 09:20:04 -0800150 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
151 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
152 EXPECT_TRUE(recv_stream);
153 return *recv_stream;
154 }
155
solenberg3a941542015-11-16 07:34:50 -0800156 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800157 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800158 }
159
solenberg7add0582015-11-20 09:59:34 -0800160 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800161 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800162 }
163
Peter Boström0c4e06b2015-10-07 12:23:21 +0200164 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700165 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000166 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700167 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000168 // send stream.
169 EXPECT_TRUE(channel_->AddSendStream(
170 cricket::StreamParams::CreateLegacy(kSsrc1)));
171 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000172
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000173 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200174 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800175 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800177 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200178 send_parameters_.codecs.push_back(kTelephoneEventCodec);
179 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000180 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000181
182 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700183 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800184 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000185 EXPECT_TRUE(channel_->AddSendStream(
186 cricket::StreamParams::CreateLegacy(kSsrc1)));
187 }
188
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800190 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000191
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100192 // Test send.
193 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
194 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
195 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800196 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100197 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
198 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
199 EXPECT_EQ(2, telephone_event.event_code);
200 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 }
202
203 // Test that send bandwidth is set correctly.
204 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000205 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
206 // |expected_result| is the expected result from SetMaxSendBandwidth().
207 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000209 int max_bitrate,
210 bool expected_result,
211 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200212 cricket::AudioSendParameters parameters;
213 parameters.codecs.push_back(codec);
214 parameters.max_bandwidth_bps = max_bitrate;
215 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
216
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000217 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000218 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000219 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000220 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000221 }
222
skvlade0d46372016-04-07 22:59:22 -0700223 // Sets the per-stream maximum bitrate limit for the specified SSRC.
224 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
225 webrtc::RtpParameters parameters = channel_->GetRtpParameters(ssrc);
226 EXPECT_EQ(1UL, parameters.encodings.size());
227
228 parameters.encodings[0].max_bitrate_bps = bitrate;
229 return channel_->SetRtpParameters(ssrc, parameters);
230 }
231
232 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
233 cricket::AudioSendParameters send_parameters;
234 send_parameters.codecs.push_back(codec);
235 send_parameters.max_bandwidth_bps = bitrate;
236 return channel_->SetSendParameters(send_parameters);
237 }
238
239 int GetCodecBitrate(int32_t ssrc) {
240 cricket::WebRtcVoiceMediaChannel* media_channel =
241 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
242 int channel = media_channel->GetSendChannelId(ssrc);
243 EXPECT_NE(-1, channel);
244 webrtc::CodecInst codec;
245 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
246 return codec.rate;
247 }
248
249 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
250 int global_max,
251 int stream_max,
252 bool expected_result,
253 int expected_codec_bitrate) {
254 // Clear the bitrate limit from the previous test case.
255 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
256
257 // Attempt to set the requested bitrate limits.
258 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
259 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
260
261 // Verify that reading back the parameters gives results
262 // consistent with the Set() result.
263 webrtc::RtpParameters resulting_parameters =
264 channel_->GetRtpParameters(kSsrc1);
265 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
266 EXPECT_EQ(expected_result ? stream_max : -1,
267 resulting_parameters.encodings[0].max_bitrate_bps);
268
269 // Verify that the codec settings have the expected bitrate.
270 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
271 }
272
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000273 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700274 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000275
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000276 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800277 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000278
279 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200280 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000281 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200282 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800283 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000284
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000285 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200286 send_parameters_.extensions.clear();
287 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800288 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000289
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000290 // Ensure extension is set properly.
291 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200292 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
293 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800294 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
295 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
296 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000297
solenberg7add0582015-11-20 09:59:34 -0800298 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000299 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700300 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800301 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
302 call_.GetAudioSendStream(kSsrc2));
303 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
304 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
305 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000306
307 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200308 send_parameters_.codecs.push_back(kPcmuCodec);
309 send_parameters_.extensions.clear();
310 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800311 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
312 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000313 }
314
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000315 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700316 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000317
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000318 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800319 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000320
321 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800322 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000323 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800324 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
325 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000326
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000327 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800328 recv_parameters_.extensions.clear();
329 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
330 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000331
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000332 // Ensure extension is set properly.
333 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800334 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
335 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
336 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
337 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
338 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000339
solenberg7add0582015-11-20 09:59:34 -0800340 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000341 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700342 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800343 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
344 call_.GetAudioReceiveStream(kSsrc2));
345 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
346 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
347 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000348
349 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800350 recv_parameters_.extensions.clear();
351 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
352 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
353 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000354 }
355
solenberg85a04962015-10-27 03:35:21 -0700356 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
357 webrtc::AudioSendStream::Stats stats;
358 stats.local_ssrc = 12;
359 stats.bytes_sent = 345;
360 stats.packets_sent = 678;
361 stats.packets_lost = 9012;
362 stats.fraction_lost = 34.56f;
363 stats.codec_name = "codec_name_send";
364 stats.ext_seqnum = 789;
365 stats.jitter_ms = 12;
366 stats.rtt_ms = 345;
367 stats.audio_level = 678;
368 stats.aec_quality_min = 9.01f;
369 stats.echo_delay_median_ms = 234;
370 stats.echo_delay_std_ms = 567;
371 stats.echo_return_loss = 890;
372 stats.echo_return_loss_enhancement = 1234;
373 stats.typing_noise_detected = true;
374 return stats;
375 }
376 void SetAudioSendStreamStats() {
377 for (auto* s : call_.GetAudioSendStreams()) {
378 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200379 }
solenberg85a04962015-10-27 03:35:21 -0700380 }
solenberg566ef242015-11-06 15:34:49 -0800381 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
382 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700383 const auto stats = GetAudioSendStreamStats();
384 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
385 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
386 EXPECT_EQ(info.packets_sent, stats.packets_sent);
387 EXPECT_EQ(info.packets_lost, stats.packets_lost);
388 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
389 EXPECT_EQ(info.codec_name, stats.codec_name);
390 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
391 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
392 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
393 EXPECT_EQ(info.audio_level, stats.audio_level);
394 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
395 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
396 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
397 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
398 EXPECT_EQ(info.echo_return_loss_enhancement,
399 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800400 EXPECT_EQ(info.typing_noise_detected,
401 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700402 }
403
404 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
405 webrtc::AudioReceiveStream::Stats stats;
406 stats.remote_ssrc = 123;
407 stats.bytes_rcvd = 456;
408 stats.packets_rcvd = 768;
409 stats.packets_lost = 101;
410 stats.fraction_lost = 23.45f;
411 stats.codec_name = "codec_name_recv";
412 stats.ext_seqnum = 678;
413 stats.jitter_ms = 901;
414 stats.jitter_buffer_ms = 234;
415 stats.jitter_buffer_preferred_ms = 567;
416 stats.delay_estimate_ms = 890;
417 stats.audio_level = 1234;
418 stats.expand_rate = 5.67f;
419 stats.speech_expand_rate = 8.90f;
420 stats.secondary_decoded_rate = 1.23f;
421 stats.accelerate_rate = 4.56f;
422 stats.preemptive_expand_rate = 7.89f;
423 stats.decoding_calls_to_silence_generator = 12;
424 stats.decoding_calls_to_neteq = 345;
425 stats.decoding_normal = 67890;
426 stats.decoding_plc = 1234;
427 stats.decoding_cng = 5678;
428 stats.decoding_plc_cng = 9012;
429 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200430 return stats;
431 }
432 void SetAudioReceiveStreamStats() {
433 for (auto* s : call_.GetAudioReceiveStreams()) {
434 s->SetStats(GetAudioReceiveStreamStats());
435 }
436 }
437 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700438 const auto stats = GetAudioReceiveStreamStats();
439 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
440 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
441 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
442 EXPECT_EQ(info.packets_lost, stats.packets_lost);
443 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
444 EXPECT_EQ(info.codec_name, stats.codec_name);
445 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
446 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
447 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200448 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700449 stats.jitter_buffer_preferred_ms);
450 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
451 EXPECT_EQ(info.audio_level, stats.audio_level);
452 EXPECT_EQ(info.expand_rate, stats.expand_rate);
453 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
454 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
455 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
456 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200457 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700458 stats.decoding_calls_to_silence_generator);
459 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
460 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
461 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
462 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
463 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
464 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200465 }
466
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700468 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200469 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700471 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700472 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200473 cricket::AudioSendParameters send_parameters_;
474 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800475 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800476 private:
477 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478};
479
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480// Tests that we can create and destroy a channel.
481TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700482 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483}
484
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485// Tests that the list of supported codecs is created properly and ordered
486// correctly
487TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
solenbergbc37fc82016-04-04 09:54:44 -0700488 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489 ASSERT_FALSE(codecs.empty());
490 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
491 EXPECT_EQ(48000, codecs[0].clockrate);
492 EXPECT_EQ(2, codecs[0].channels);
493 EXPECT_EQ(64000, codecs[0].bitrate);
494 int pref = codecs[0].preference;
495 for (size_t i = 1; i < codecs.size(); ++i) {
496 EXPECT_GT(pref, codecs[i].preference);
497 pref = codecs[i].preference;
498 }
499}
500
stefanba4c0e42016-02-04 04:12:24 -0800501TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700502 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800503 bool opus_found = false;
504 for (cricket::AudioCodec codec : codecs) {
505 if (codec.name == "opus") {
506 EXPECT_TRUE(HasTransportCc(codec));
507 opus_found = true;
508 }
509 }
510 EXPECT_TRUE(opus_found);
511}
512
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513// Tests that we can find codecs by name or id, and that we interpret the
514// clockrate and bitrate fields properly.
515TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
516 cricket::AudioCodec codec;
517 webrtc::CodecInst codec_inst;
518 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800519 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800521 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000522 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800523 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
524 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000525 // Find ISAC with a different payload id.
526 codec = kIsacCodec;
527 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800528 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000529 EXPECT_EQ(codec.id, codec_inst.pltype);
530 // Find PCMU with a 0 clockrate.
531 codec = kPcmuCodec;
532 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800533 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534 EXPECT_EQ(codec.id, codec_inst.pltype);
535 EXPECT_EQ(8000, codec_inst.plfreq);
536 // Find PCMU with a 0 bitrate.
537 codec = kPcmuCodec;
538 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800539 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 EXPECT_EQ(codec.id, codec_inst.pltype);
541 EXPECT_EQ(64000, codec_inst.rate);
542 // Find ISAC with an explicit bitrate.
543 codec = kIsacCodec;
544 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800545 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000546 EXPECT_EQ(codec.id, codec_inst.pltype);
547 EXPECT_EQ(32000, codec_inst.rate);
548}
549
550// Test that we set our inbound codecs properly, including changing PT.
551TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700552 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200553 cricket::AudioRecvParameters parameters;
554 parameters.codecs.push_back(kIsacCodec);
555 parameters.codecs.push_back(kPcmuCodec);
556 parameters.codecs.push_back(kTelephoneEventCodec);
557 parameters.codecs[0].id = 106; // collide with existing telephone-event
558 parameters.codecs[2].id = 126;
559 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700560 EXPECT_TRUE(channel_->AddRecvStream(
561 cricket::StreamParams::CreateLegacy(kSsrc1)));
562 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800564 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000565 gcodec.plfreq = 16000;
566 gcodec.channels = 1;
567 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
568 EXPECT_EQ(106, gcodec.pltype);
569 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800570 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 gcodec.plfreq = 8000;
572 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
573 EXPECT_EQ(126, gcodec.pltype);
574 EXPECT_STREQ("telephone-event", gcodec.plname);
575}
576
577// Test that we fail to set an unknown inbound codec.
578TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700579 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200580 cricket::AudioRecvParameters parameters;
581 parameters.codecs.push_back(kIsacCodec);
582 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
583 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584}
585
586// Test that we fail if we have duplicate types in the inbound list.
587TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
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(kCn16000Codec);
592 parameters.codecs[1].id = kIsacCodec.id;
593 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594}
595
596// Test that we can decode OPUS without stereo parameters.
597TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700598 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200599 cricket::AudioRecvParameters parameters;
600 parameters.codecs.push_back(kIsacCodec);
601 parameters.codecs.push_back(kPcmuCodec);
602 parameters.codecs.push_back(kOpusCodec);
603 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 EXPECT_TRUE(channel_->AddRecvStream(
605 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700606 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800608 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 // Even without stereo parameters, recv codecs still specify channels = 2.
610 EXPECT_EQ(2, opus.channels);
611 EXPECT_EQ(111, opus.pltype);
612 EXPECT_STREQ("opus", opus.plname);
613 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700614 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 EXPECT_EQ(111, opus.pltype);
616}
617
618// Test that we can decode OPUS with stereo = 0.
619TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700620 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200621 cricket::AudioRecvParameters parameters;
622 parameters.codecs.push_back(kIsacCodec);
623 parameters.codecs.push_back(kPcmuCodec);
624 parameters.codecs.push_back(kOpusCodec);
625 parameters.codecs[2].params["stereo"] = "0";
626 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 EXPECT_TRUE(channel_->AddRecvStream(
628 cricket::StreamParams::CreateLegacy(kSsrc1)));
629 int channel_num2 = voe_.GetLastChannel();
630 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800631 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632 // Even when stereo is off, recv codecs still specify channels = 2.
633 EXPECT_EQ(2, opus.channels);
634 EXPECT_EQ(111, opus.pltype);
635 EXPECT_STREQ("opus", opus.plname);
636 opus.pltype = 0;
637 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
638 EXPECT_EQ(111, opus.pltype);
639}
640
641// Test that we can decode OPUS with stereo = 1.
642TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700643 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200644 cricket::AudioRecvParameters parameters;
645 parameters.codecs.push_back(kIsacCodec);
646 parameters.codecs.push_back(kPcmuCodec);
647 parameters.codecs.push_back(kOpusCodec);
648 parameters.codecs[2].params["stereo"] = "1";
649 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 EXPECT_TRUE(channel_->AddRecvStream(
651 cricket::StreamParams::CreateLegacy(kSsrc1)));
652 int channel_num2 = voe_.GetLastChannel();
653 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800654 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_EQ(2, opus.channels);
656 EXPECT_EQ(111, opus.pltype);
657 EXPECT_STREQ("opus", opus.plname);
658 opus.pltype = 0;
659 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
660 EXPECT_EQ(111, opus.pltype);
661}
662
663// Test that changes to recv codecs are applied to all streams.
664TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700665 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200666 cricket::AudioRecvParameters parameters;
667 parameters.codecs.push_back(kIsacCodec);
668 parameters.codecs.push_back(kPcmuCodec);
669 parameters.codecs.push_back(kTelephoneEventCodec);
670 parameters.codecs[0].id = 106; // collide with existing telephone-event
671 parameters.codecs[2].id = 126;
672 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 EXPECT_TRUE(channel_->AddRecvStream(
674 cricket::StreamParams::CreateLegacy(kSsrc1)));
675 int channel_num2 = voe_.GetLastChannel();
676 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800677 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 gcodec.plfreq = 16000;
679 gcodec.channels = 1;
680 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
681 EXPECT_EQ(106, gcodec.pltype);
682 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800683 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 gcodec.plfreq = 8000;
685 gcodec.channels = 1;
686 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
687 EXPECT_EQ(126, gcodec.pltype);
688 EXPECT_STREQ("telephone-event", gcodec.plname);
689}
690
691TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700692 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200693 cricket::AudioRecvParameters parameters;
694 parameters.codecs.push_back(kIsacCodec);
695 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200696 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697
698 int channel_num2 = voe_.GetLastChannel();
699 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800700 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 gcodec.plfreq = 16000;
702 gcodec.channels = 1;
703 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
704 EXPECT_EQ(106, gcodec.pltype);
705 EXPECT_STREQ("ISAC", gcodec.plname);
706}
707
708// Test that we can apply the same set of codecs again while playing.
709TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700710 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200711 cricket::AudioRecvParameters parameters;
712 parameters.codecs.push_back(kIsacCodec);
713 parameters.codecs.push_back(kCn16000Codec);
714 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200716 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717
718 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200719 parameters.codecs[0].id = 127;
720 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
721 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_TRUE(voe_.GetPlayout(channel_num));
723}
724
725// Test that we can add a codec while playing.
726TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700727 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200728 cricket::AudioRecvParameters parameters;
729 parameters.codecs.push_back(kIsacCodec);
730 parameters.codecs.push_back(kCn16000Codec);
731 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000732 EXPECT_TRUE(channel_->SetPlayout(true));
733
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200734 parameters.codecs.push_back(kOpusCodec);
735 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
736 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 EXPECT_TRUE(voe_.GetPlayout(channel_num));
738 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800739 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
741}
742
743TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700744 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000746 // Test that when autobw is enabled, bitrate is kept as the default
747 // value. autobw is enabled for the following tests because the target
748 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749
750 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000751 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752
753 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000754 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000757 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758}
759
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000760TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700761 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000763 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764
765 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000766 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
767 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000770 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
771 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772}
773
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000774TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700775 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000776
777 // Test that we can only set a maximum bitrate for a fixed-rate codec
778 // if it's bigger than the fixed rate.
779
780 // PCMU, fixed bitrate == 64000.
781 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
782 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
783 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
784 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
785 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
786 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
787 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
788}
789
790TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700791 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200792 const int kDesiredBitrate = 128000;
793 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700794 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200795 parameters.max_bandwidth_bps = kDesiredBitrate;
796 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000797
798 EXPECT_TRUE(channel_->AddSendStream(
799 cricket::StreamParams::CreateLegacy(kSsrc1)));
800
801 int channel_num = voe_.GetLastChannel();
802 webrtc::CodecInst codec;
803 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200804 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000805}
806
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000807// Test that bitrate cannot be set for CBR codecs.
808// Bitrate is ignored if it is higher than the fixed bitrate.
809// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000810TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700811 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812
813 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200814 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
815 int channel_num = voe_.GetLastChannel();
816 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
818 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200819
820 send_parameters_.max_bandwidth_bps = 128000;
821 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000822 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
823 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200824
825 send_parameters_.max_bandwidth_bps = 128;
826 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
828 EXPECT_EQ(64000, codec.rate);
829}
830
skvlade0d46372016-04-07 22:59:22 -0700831// Test that the per-stream bitrate limit and the global
832// bitrate limit both apply.
833TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
834 EXPECT_TRUE(SetupSendStream());
835
836 // opus, default bitrate == 64000.
837 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
838 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
839 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
840 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
841
842 // CBR codecs allow both maximums to exceed the bitrate.
843 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
844 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
845 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
846 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
847
848 // CBR codecs don't allow per stream maximums to be too low.
849 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
850 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
851}
852
853// Test that an attempt to set RtpParameters for a stream that does not exist
854// fails.
855TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
856 EXPECT_TRUE(SetupChannel());
857 webrtc::RtpParameters nonexistent_parameters =
858 channel_->GetRtpParameters(kSsrc1);
859 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
860
861 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
862 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, nonexistent_parameters));
863}
864
865TEST_F(WebRtcVoiceEngineTestFake,
866 CannotSetRtpParametersWithIncorrectNumberOfEncodings) {
867 // This test verifies that setting RtpParameters succeeds only if
868 // the structure contains exactly one encoding.
869 // TODO(skvlad): Update this test when we start supporting setting parameters
870 // for each encoding individually.
871
872 EXPECT_TRUE(SetupSendStream());
873 // Setting RtpParameters with no encoding is expected to fail.
874 webrtc::RtpParameters parameters;
875 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
876 // Setting RtpParameters with exactly one encoding should succeed.
877 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
878 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
879 // Two or more encodings should result in failure.
880 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
881 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
882}
883
884// Test that SetRtpParameters configures the correct encoding channel for each
885// SSRC.
886TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
887 SetupForMultiSendStream();
888 // Create send streams.
889 for (uint32_t ssrc : kSsrcs4) {
890 EXPECT_TRUE(
891 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
892 }
893 // Configure one stream to be limited by the stream config, another to be
894 // limited by the global max, and the third one with no per-stream limit
895 // (still subject to the global limit).
896 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
897 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
898 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
899 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
900
901 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
902 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
903 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
904
905 // Remove the global cap; the streams should switch to their respective
906 // maximums (or remain unchanged if there was no other limit on them.)
907 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
908 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
909 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
910 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
911}
912
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913// Test that we apply codecs properly.
914TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700915 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200916 cricket::AudioSendParameters parameters;
917 parameters.codecs.push_back(kIsacCodec);
918 parameters.codecs.push_back(kPcmuCodec);
919 parameters.codecs.push_back(kRedCodec);
920 parameters.codecs[0].id = 96;
921 parameters.codecs[0].bitrate = 48000;
922 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000923 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925 webrtc::CodecInst gcodec;
926 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
927 EXPECT_EQ(96, gcodec.pltype);
928 EXPECT_EQ(48000, gcodec.rate);
929 EXPECT_STREQ("ISAC", gcodec.plname);
930 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000931 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
933 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100934 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935}
936
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000937// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
938// to apply.
939TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700940 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200941 cricket::AudioSendParameters parameters;
942 parameters.codecs.push_back(kIsacCodec);
943 parameters.codecs.push_back(kPcmuCodec);
944 parameters.codecs.push_back(kRedCodec);
945 parameters.codecs[0].id = 96;
946 parameters.codecs[0].bitrate = 48000;
947 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000948 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
949 // Calling SetSendCodec again with same codec which is already set.
950 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200951 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000952 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
953}
954
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000955// Verify that G722 is set with 16000 samples per second to WebRTC.
956TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -0700957 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000958 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200959 cricket::AudioSendParameters parameters;
960 parameters.codecs.push_back(kG722CodecSdp);
961 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000962 webrtc::CodecInst gcodec;
963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
964 EXPECT_STREQ("G722", gcodec.plname);
965 EXPECT_EQ(1, gcodec.channels);
966 EXPECT_EQ(16000, gcodec.plfreq);
967}
968
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000969// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000970TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -0700971 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200972 cricket::AudioSendParameters parameters;
973 parameters.codecs.push_back(kOpusCodec);
974 parameters.codecs[0].bitrate = 0;
975 parameters.codecs[0].clockrate = 50000;
976 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000977}
978
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000979// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700981 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200982 cricket::AudioSendParameters parameters;
983 parameters.codecs.push_back(kOpusCodec);
984 parameters.codecs[0].bitrate = 0;
985 parameters.codecs[0].channels = 0;
986 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000987}
988
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000989// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000990TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700991 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200992 cricket::AudioSendParameters parameters;
993 parameters.codecs.push_back(kOpusCodec);
994 parameters.codecs[0].bitrate = 0;
995 parameters.codecs[0].channels = 0;
996 parameters.codecs[0].params["stereo"] = "1";
997 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998}
999
1000// Test that if channel is 1 for opus and there's no stereo, we fail.
1001TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001002 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001003 cricket::AudioSendParameters parameters;
1004 parameters.codecs.push_back(kOpusCodec);
1005 parameters.codecs[0].bitrate = 0;
1006 parameters.codecs[0].channels = 1;
1007 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008}
1009
1010// Test that if channel is 1 for opus and stereo=0, we fail.
1011TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001012 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001013 cricket::AudioSendParameters parameters;
1014 parameters.codecs.push_back(kOpusCodec);
1015 parameters.codecs[0].bitrate = 0;
1016 parameters.codecs[0].channels = 1;
1017 parameters.codecs[0].params["stereo"] = "0";
1018 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019}
1020
1021// Test that if channel is 1 for opus and stereo=1, we fail.
1022TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001023 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001024 cricket::AudioSendParameters parameters;
1025 parameters.codecs.push_back(kOpusCodec);
1026 parameters.codecs[0].bitrate = 0;
1027 parameters.codecs[0].channels = 1;
1028 parameters.codecs[0].params["stereo"] = "1";
1029 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030}
1031
1032// Test that with bitrate=0 and no stereo,
1033// channels and bitrate are 1 and 32000.
1034TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001035 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001037 cricket::AudioSendParameters parameters;
1038 parameters.codecs.push_back(kOpusCodec);
1039 parameters.codecs[0].bitrate = 0;
1040 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001041 webrtc::CodecInst gcodec;
1042 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1043 EXPECT_STREQ("opus", gcodec.plname);
1044 EXPECT_EQ(1, gcodec.channels);
1045 EXPECT_EQ(32000, gcodec.rate);
1046}
1047
1048// Test that with bitrate=0 and stereo=0,
1049// channels and bitrate are 1 and 32000.
1050TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001051 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001053 cricket::AudioSendParameters parameters;
1054 parameters.codecs.push_back(kOpusCodec);
1055 parameters.codecs[0].bitrate = 0;
1056 parameters.codecs[0].params["stereo"] = "0";
1057 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001058 webrtc::CodecInst gcodec;
1059 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1060 EXPECT_STREQ("opus", gcodec.plname);
1061 EXPECT_EQ(1, gcodec.channels);
1062 EXPECT_EQ(32000, gcodec.rate);
1063}
1064
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001065// Test that with bitrate=invalid and stereo=0,
1066// channels and bitrate are 1 and 32000.
1067TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001068 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001069 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 cricket::AudioSendParameters parameters;
1071 parameters.codecs.push_back(kOpusCodec);
1072 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001073 webrtc::CodecInst gcodec;
1074
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001075 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 parameters.codecs[0].bitrate = 5999;
1077 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001078 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1079 EXPECT_STREQ("opus", gcodec.plname);
1080 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001081 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001082
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001083 parameters.codecs[0].bitrate = 510001;
1084 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001085 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1086 EXPECT_STREQ("opus", gcodec.plname);
1087 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001088 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001089}
1090
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091// Test that with bitrate=0 and stereo=1,
1092// channels and bitrate are 2 and 64000.
1093TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001094 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001096 cricket::AudioSendParameters parameters;
1097 parameters.codecs.push_back(kOpusCodec);
1098 parameters.codecs[0].bitrate = 0;
1099 parameters.codecs[0].params["stereo"] = "1";
1100 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 webrtc::CodecInst gcodec;
1102 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1103 EXPECT_STREQ("opus", gcodec.plname);
1104 EXPECT_EQ(2, gcodec.channels);
1105 EXPECT_EQ(64000, gcodec.rate);
1106}
1107
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001108// Test that with bitrate=invalid and stereo=1,
1109// channels and bitrate are 2 and 64000.
1110TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001111 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001112 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001113 cricket::AudioSendParameters parameters;
1114 parameters.codecs.push_back(kOpusCodec);
1115 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001116 webrtc::CodecInst gcodec;
1117
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001118 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001119 parameters.codecs[0].bitrate = 5999;
1120 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001121 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1122 EXPECT_STREQ("opus", gcodec.plname);
1123 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001124 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001125
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001126 parameters.codecs[0].bitrate = 510001;
1127 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001128 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1129 EXPECT_STREQ("opus", gcodec.plname);
1130 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001131 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001132}
1133
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134// Test that with bitrate=N and stereo unset,
1135// channels and bitrate are 1 and N.
1136TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001137 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001139 cricket::AudioSendParameters parameters;
1140 parameters.codecs.push_back(kOpusCodec);
1141 parameters.codecs[0].bitrate = 96000;
1142 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001143 webrtc::CodecInst gcodec;
1144 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1145 EXPECT_EQ(111, gcodec.pltype);
1146 EXPECT_EQ(96000, gcodec.rate);
1147 EXPECT_STREQ("opus", gcodec.plname);
1148 EXPECT_EQ(1, gcodec.channels);
1149 EXPECT_EQ(48000, gcodec.plfreq);
1150}
1151
1152// Test that with bitrate=N and stereo=0,
1153// channels and bitrate are 1 and N.
1154TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001155 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001157 cricket::AudioSendParameters parameters;
1158 parameters.codecs.push_back(kOpusCodec);
1159 parameters.codecs[0].bitrate = 30000;
1160 parameters.codecs[0].params["stereo"] = "0";
1161 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 webrtc::CodecInst gcodec;
1163 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1164 EXPECT_EQ(1, gcodec.channels);
1165 EXPECT_EQ(30000, gcodec.rate);
1166 EXPECT_STREQ("opus", gcodec.plname);
1167}
1168
1169// Test that with bitrate=N and without any parameters,
1170// channels and bitrate are 1 and N.
1171TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001172 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001173 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001174 cricket::AudioSendParameters parameters;
1175 parameters.codecs.push_back(kOpusCodec);
1176 parameters.codecs[0].bitrate = 30000;
1177 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178 webrtc::CodecInst gcodec;
1179 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1180 EXPECT_EQ(1, gcodec.channels);
1181 EXPECT_EQ(30000, gcodec.rate);
1182 EXPECT_STREQ("opus", gcodec.plname);
1183}
1184
1185// Test that with bitrate=N and stereo=1,
1186// channels and bitrate are 2 and N.
1187TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001188 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001190 cricket::AudioSendParameters parameters;
1191 parameters.codecs.push_back(kOpusCodec);
1192 parameters.codecs[0].bitrate = 30000;
1193 parameters.codecs[0].params["stereo"] = "1";
1194 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195 webrtc::CodecInst gcodec;
1196 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1197 EXPECT_EQ(2, gcodec.channels);
1198 EXPECT_EQ(30000, gcodec.rate);
1199 EXPECT_STREQ("opus", gcodec.plname);
1200}
1201
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001202// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1203// Also test that the "maxaveragebitrate" can't be set to values outside the
1204// range of 6000 and 510000
1205TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001206 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001207 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001211 webrtc::CodecInst gcodec;
1212
1213 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001214 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1215 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001217 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001218
1219 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001220 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1221 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001222 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001223 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001224
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1226 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001227 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1228 EXPECT_EQ(200000, gcodec.rate);
1229}
1230
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001231// Test that we can enable NACK with opus as caller.
1232TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001233 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001235 cricket::AudioSendParameters parameters;
1236 parameters.codecs.push_back(kOpusCodec);
1237 parameters.codecs[0].AddFeedbackParam(
1238 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1239 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001241 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001242 EXPECT_TRUE(voe_.GetNACK(channel_num));
1243}
1244
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001245// Test that we can enable NACK with opus as callee.
1246TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001247 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001248 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001249 cricket::AudioSendParameters parameters;
1250 parameters.codecs.push_back(kOpusCodec);
1251 parameters.codecs[0].AddFeedbackParam(
1252 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1253 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001254 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001255 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001256 EXPECT_FALSE(voe_.GetNACK(channel_num));
1257
1258 EXPECT_TRUE(channel_->AddSendStream(
1259 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001260 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001261}
1262
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263// Test that we can enable NACK on receive streams.
1264TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001265 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001266 int channel_num1 = voe_.GetLastChannel();
1267 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1268 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001269 cricket::AudioSendParameters parameters;
1270 parameters.codecs.push_back(kOpusCodec);
1271 parameters.codecs[0].AddFeedbackParam(
1272 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1273 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001274 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1275 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001276 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001277 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1278 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1279}
1280
1281// Test that we can disable NACK.
1282TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001283 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001284 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001285 cricket::AudioSendParameters parameters;
1286 parameters.codecs.push_back(kOpusCodec);
1287 parameters.codecs[0].AddFeedbackParam(
1288 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1289 cricket::kParamValueEmpty));
1290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 EXPECT_TRUE(voe_.GetNACK(channel_num));
1292
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001293 parameters.codecs.clear();
1294 parameters.codecs.push_back(kOpusCodec);
1295 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001296 EXPECT_FALSE(voe_.GetNACK(channel_num));
1297}
1298
1299// Test that we can disable NACK on receive streams.
1300TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001301 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001302 int channel_num1 = voe_.GetLastChannel();
1303 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1304 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001305 cricket::AudioSendParameters parameters;
1306 parameters.codecs.push_back(kOpusCodec);
1307 parameters.codecs[0].AddFeedbackParam(
1308 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1309 cricket::kParamValueEmpty));
1310 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001311 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1312 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1313
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001314 parameters.codecs.clear();
1315 parameters.codecs.push_back(kOpusCodec);
1316 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001317 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1318 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1319}
1320
1321// Test that NACK is enabled on a new receive stream.
1322TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001323 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001325 cricket::AudioSendParameters parameters;
1326 parameters.codecs.push_back(kIsacCodec);
1327 parameters.codecs.push_back(kCn16000Codec);
1328 parameters.codecs[0].AddFeedbackParam(
1329 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1330 cricket::kParamValueEmpty));
1331 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001332 EXPECT_TRUE(voe_.GetNACK(channel_num));
1333
1334 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1335 channel_num = voe_.GetLastChannel();
1336 EXPECT_TRUE(voe_.GetNACK(channel_num));
1337 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1338 channel_num = voe_.GetLastChannel();
1339 EXPECT_TRUE(voe_.GetNACK(channel_num));
1340}
1341
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001342// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001343TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001344 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001345 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001346 cricket::AudioSendParameters parameters;
1347 parameters.codecs.push_back(kOpusCodec);
1348 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001349 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1350}
1351
1352// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001353TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001354 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001355 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001356 cricket::AudioSendParameters parameters;
1357 parameters.codecs.push_back(kOpusCodec);
1358 parameters.codecs[0].bitrate = 0;
1359 parameters.codecs[0].params["useinbandfec"] = "0";
1360 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001361 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1362 webrtc::CodecInst gcodec;
1363 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1364 EXPECT_STREQ("opus", gcodec.plname);
1365 EXPECT_EQ(1, gcodec.channels);
1366 EXPECT_EQ(32000, gcodec.rate);
1367}
1368
1369// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001370TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001371 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001372 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001373 cricket::AudioSendParameters parameters;
1374 parameters.codecs.push_back(kOpusCodec);
1375 parameters.codecs[0].bitrate = 0;
1376 parameters.codecs[0].params["useinbandfec"] = "1";
1377 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001378 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1379 webrtc::CodecInst gcodec;
1380 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1381 EXPECT_STREQ("opus", gcodec.plname);
1382 EXPECT_EQ(1, gcodec.channels);
1383 EXPECT_EQ(32000, gcodec.rate);
1384}
1385
1386// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001387TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001388 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001389 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001390 cricket::AudioSendParameters parameters;
1391 parameters.codecs.push_back(kOpusCodec);
1392 parameters.codecs[0].bitrate = 0;
1393 parameters.codecs[0].params["stereo"] = "1";
1394 parameters.codecs[0].params["useinbandfec"] = "1";
1395 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001396 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1397 webrtc::CodecInst gcodec;
1398 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1399 EXPECT_STREQ("opus", gcodec.plname);
1400 EXPECT_EQ(2, gcodec.channels);
1401 EXPECT_EQ(64000, gcodec.rate);
1402}
1403
1404// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001405TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001406 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001407 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001408 cricket::AudioSendParameters parameters;
1409 parameters.codecs.push_back(kIsacCodec);
1410 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001411 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1412}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001413
1414// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1415TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001416 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001417 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001418 cricket::AudioSendParameters parameters;
1419 parameters.codecs.push_back(kIsacCodec);
1420 parameters.codecs[0].params["useinbandfec"] = "1";
1421 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001422 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1423}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001424
1425// Test that Opus FEC status can be changed.
1426TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001427 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001428 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001429 cricket::AudioSendParameters parameters;
1430 parameters.codecs.push_back(kOpusCodec);
1431 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001432 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 parameters.codecs[0].params["useinbandfec"] = "1";
1434 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001435 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1436}
1437
stefanba4c0e42016-02-04 04:12:24 -08001438TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001439 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001440 cricket::AudioSendParameters send_parameters;
1441 send_parameters.codecs.push_back(kOpusCodec);
1442 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1443 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1444
1445 cricket::AudioRecvParameters recv_parameters;
1446 recv_parameters.codecs.push_back(kIsacCodec);
1447 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1448 EXPECT_TRUE(
1449 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1450 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1451 EXPECT_FALSE(
1452 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1453
solenbergbc37fc82016-04-04 09:54:44 -07001454 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001455 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1456 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1457 EXPECT_TRUE(
1458 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1459}
1460
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001461// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1462TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001463 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001464 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001465 cricket::AudioSendParameters parameters;
1466 parameters.codecs.push_back(kOpusCodec);
1467 parameters.codecs[0].bitrate = 0;
1468 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1469 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001470 EXPECT_EQ(cricket::kOpusBandwidthNb,
1471 voe_.GetMaxEncodingBandwidth(channel_num));
1472 webrtc::CodecInst gcodec;
1473 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1474 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001475
1476 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001477 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1478 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001479 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1480 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001481}
1482
1483// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1484TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001485 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001486 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001487 cricket::AudioSendParameters parameters;
1488 parameters.codecs.push_back(kOpusCodec);
1489 parameters.codecs[0].bitrate = 0;
1490 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1491 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001492 EXPECT_EQ(cricket::kOpusBandwidthMb,
1493 voe_.GetMaxEncodingBandwidth(channel_num));
1494 webrtc::CodecInst gcodec;
1495 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1496 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001497
1498 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001499 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1500 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001501 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1502 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001503}
1504
1505// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1506TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001507 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001508 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001509 cricket::AudioSendParameters parameters;
1510 parameters.codecs.push_back(kOpusCodec);
1511 parameters.codecs[0].bitrate = 0;
1512 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1513 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001514 EXPECT_EQ(cricket::kOpusBandwidthWb,
1515 voe_.GetMaxEncodingBandwidth(channel_num));
1516 webrtc::CodecInst gcodec;
1517 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1518 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001519
1520 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001521 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1522 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001523 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1524 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001525}
1526
1527// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1528TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001529 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001530 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001531 cricket::AudioSendParameters parameters;
1532 parameters.codecs.push_back(kOpusCodec);
1533 parameters.codecs[0].bitrate = 0;
1534 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1535 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001536 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1537 voe_.GetMaxEncodingBandwidth(channel_num));
1538 webrtc::CodecInst gcodec;
1539 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1540 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001541
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001542 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001543 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1544 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001545 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1546 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001547}
1548
1549// Test 24000 < maxplaybackrate triggers Opus full band mode.
1550TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001551 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001552 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001553 cricket::AudioSendParameters parameters;
1554 parameters.codecs.push_back(kOpusCodec);
1555 parameters.codecs[0].bitrate = 0;
1556 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1557 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001558 EXPECT_EQ(cricket::kOpusBandwidthFb,
1559 voe_.GetMaxEncodingBandwidth(channel_num));
1560 webrtc::CodecInst gcodec;
1561 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1562 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001563
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001564 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001565 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1566 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001567 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1568 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001569}
1570
1571// Test Opus that without maxplaybackrate, default playback rate is used.
1572TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001573 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001574 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001575 cricket::AudioSendParameters parameters;
1576 parameters.codecs.push_back(kOpusCodec);
1577 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001578 EXPECT_EQ(cricket::kOpusBandwidthFb,
1579 voe_.GetMaxEncodingBandwidth(channel_num));
1580}
1581
1582// Test the with non-Opus, maxplaybackrate has no effect.
1583TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001584 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001585 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 cricket::AudioSendParameters parameters;
1587 parameters.codecs.push_back(kIsacCodec);
1588 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1589 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001590 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1591}
1592
1593// Test maxplaybackrate can be set on two streams.
1594TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001595 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001596 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001597 cricket::AudioSendParameters parameters;
1598 parameters.codecs.push_back(kOpusCodec);
1599 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001600 // Default bandwidth is 24000.
1601 EXPECT_EQ(cricket::kOpusBandwidthFb,
1602 voe_.GetMaxEncodingBandwidth(channel_num));
1603
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001604 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001605
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001607 EXPECT_EQ(cricket::kOpusBandwidthNb,
1608 voe_.GetMaxEncodingBandwidth(channel_num));
1609
1610 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1611 channel_num = voe_.GetLastChannel();
1612 EXPECT_EQ(cricket::kOpusBandwidthNb,
1613 voe_.GetMaxEncodingBandwidth(channel_num));
1614}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001615
Minyue Li7100dcd2015-03-27 05:05:59 +01001616// Test that with usedtx=0, Opus DTX is off.
1617TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001618 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001619 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001620 cricket::AudioSendParameters parameters;
1621 parameters.codecs.push_back(kOpusCodec);
1622 parameters.codecs[0].params["usedtx"] = "0";
1623 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001624 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1625}
1626
1627// Test that with usedtx=1, Opus DTX is on.
1628TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001629 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001630 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001631 cricket::AudioSendParameters parameters;
1632 parameters.codecs.push_back(kOpusCodec);
1633 parameters.codecs[0].params["usedtx"] = "1";
1634 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001635 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1636 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1637}
1638
1639// Test that usedtx=1 works with stereo Opus.
1640TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001641 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001642 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001643 cricket::AudioSendParameters parameters;
1644 parameters.codecs.push_back(kOpusCodec);
1645 parameters.codecs[0].params["usedtx"] = "1";
1646 parameters.codecs[0].params["stereo"] = "1";
1647 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001648 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1649 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1650}
1651
1652// Test that usedtx=1 does not work with non Opus.
1653TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001654 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001655 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001656 cricket::AudioSendParameters parameters;
1657 parameters.codecs.push_back(kIsacCodec);
1658 parameters.codecs[0].params["usedtx"] = "1";
1659 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001660 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1661}
1662
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001663// Test that we can switch back and forth between Opus and ISAC with CN.
1664TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001665 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001667 cricket::AudioSendParameters opus_parameters;
1668 opus_parameters.codecs.push_back(kOpusCodec);
1669 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 webrtc::CodecInst gcodec;
1671 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001672 EXPECT_EQ(111, gcodec.pltype);
1673 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001675 cricket::AudioSendParameters isac_parameters;
1676 isac_parameters.codecs.push_back(kIsacCodec);
1677 isac_parameters.codecs.push_back(kCn16000Codec);
1678 isac_parameters.codecs.push_back(kOpusCodec);
1679 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001680 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1681 EXPECT_EQ(103, gcodec.pltype);
1682 EXPECT_STREQ("ISAC", gcodec.plname);
1683
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001684 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001685 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001686 EXPECT_EQ(111, gcodec.pltype);
1687 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688}
1689
1690// Test that we handle various ways of specifying bitrate.
1691TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001692 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001694 cricket::AudioSendParameters parameters;
1695 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1696 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001697 webrtc::CodecInst gcodec;
1698 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1699 EXPECT_EQ(103, gcodec.pltype);
1700 EXPECT_STREQ("ISAC", gcodec.plname);
1701 EXPECT_EQ(32000, gcodec.rate);
1702
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 parameters.codecs[0].bitrate = 0; // bitrate == default
1704 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1706 EXPECT_EQ(103, gcodec.pltype);
1707 EXPECT_STREQ("ISAC", gcodec.plname);
1708 EXPECT_EQ(-1, gcodec.rate);
1709
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001710 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1711 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1713 EXPECT_EQ(103, gcodec.pltype);
1714 EXPECT_STREQ("ISAC", gcodec.plname);
1715 EXPECT_EQ(28000, gcodec.rate);
1716
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001717 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1718 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1720 EXPECT_EQ(0, gcodec.pltype);
1721 EXPECT_STREQ("PCMU", gcodec.plname);
1722 EXPECT_EQ(64000, gcodec.rate);
1723
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001724 parameters.codecs[0].bitrate = 0; // bitrate == default
1725 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1727 EXPECT_EQ(0, gcodec.pltype);
1728 EXPECT_STREQ("PCMU", gcodec.plname);
1729 EXPECT_EQ(64000, gcodec.rate);
1730
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001731 parameters.codecs[0] = kOpusCodec;
1732 parameters.codecs[0].bitrate = 0; // bitrate == default
1733 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1735 EXPECT_EQ(111, gcodec.pltype);
1736 EXPECT_STREQ("opus", gcodec.plname);
1737 EXPECT_EQ(32000, gcodec.rate);
1738}
1739
Brave Yao5225dd82015-03-26 07:39:19 +08001740// Test that we could set packet size specified in kCodecParamPTime.
1741TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001742 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001743 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001744 cricket::AudioSendParameters parameters;
1745 parameters.codecs.push_back(kOpusCodec);
1746 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1747 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001748 webrtc::CodecInst gcodec;
1749 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1750 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1751
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001752 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1753 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001754 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1755 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1756
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001757 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1758 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001759 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1760 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1761
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001762 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1763 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1764 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001765 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1766 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1767
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001768 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1769 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1770 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001771 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1772 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1773}
1774
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001775// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001777 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001778 cricket::AudioSendParameters parameters;
1779 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001780}
1781
1782// Test that we can set send codecs even with telephone-event codec as the first
1783// one on the list.
1784TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001785 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001786 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001787 cricket::AudioSendParameters parameters;
1788 parameters.codecs.push_back(kTelephoneEventCodec);
1789 parameters.codecs.push_back(kIsacCodec);
1790 parameters.codecs.push_back(kPcmuCodec);
1791 parameters.codecs[0].id = 98; // DTMF
1792 parameters.codecs[1].id = 96;
1793 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 webrtc::CodecInst gcodec;
1795 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001796 EXPECT_EQ(96, gcodec.pltype);
1797 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001798 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001799}
1800
solenberg31642aa2016-03-14 08:00:37 -07001801// Test that payload type range is limited for telephone-event codec.
1802TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001803 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001804 cricket::AudioSendParameters parameters;
1805 parameters.codecs.push_back(kTelephoneEventCodec);
1806 parameters.codecs.push_back(kIsacCodec);
1807 parameters.codecs[0].id = 0; // DTMF
1808 parameters.codecs[1].id = 96;
1809 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1810 EXPECT_TRUE(channel_->CanInsertDtmf());
1811 parameters.codecs[0].id = 128; // DTMF
1812 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1813 EXPECT_FALSE(channel_->CanInsertDtmf());
1814 parameters.codecs[0].id = 127;
1815 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1816 EXPECT_TRUE(channel_->CanInsertDtmf());
1817 parameters.codecs[0].id = -1; // DTMF
1818 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1819 EXPECT_FALSE(channel_->CanInsertDtmf());
1820}
1821
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001822// Test that we can set send codecs even with CN codec as the first
1823// one on the list.
1824TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001825 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001826 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001827 cricket::AudioSendParameters parameters;
1828 parameters.codecs.push_back(kCn16000Codec);
1829 parameters.codecs.push_back(kIsacCodec);
1830 parameters.codecs.push_back(kPcmuCodec);
1831 parameters.codecs[0].id = 98; // wideband CN
1832 parameters.codecs[1].id = 96;
1833 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001834 webrtc::CodecInst gcodec;
1835 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1836 EXPECT_EQ(96, gcodec.pltype);
1837 EXPECT_STREQ("ISAC", gcodec.plname);
1838 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839}
1840
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001841// Test that we set VAD and DTMF types correctly as caller.
1842TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001843 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001844 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001845 cricket::AudioSendParameters parameters;
1846 parameters.codecs.push_back(kIsacCodec);
1847 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001849 parameters.codecs.push_back(kCn16000Codec);
1850 parameters.codecs.push_back(kCn8000Codec);
1851 parameters.codecs.push_back(kTelephoneEventCodec);
1852 parameters.codecs.push_back(kRedCodec);
1853 parameters.codecs[0].id = 96;
1854 parameters.codecs[2].id = 97; // wideband CN
1855 parameters.codecs[4].id = 98; // DTMF
1856 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 webrtc::CodecInst gcodec;
1858 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1859 EXPECT_EQ(96, gcodec.pltype);
1860 EXPECT_STREQ("ISAC", gcodec.plname);
1861 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001862 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001863 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1864 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001865 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001866}
1867
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001868// Test that we set VAD and DTMF types correctly as callee.
1869TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001870 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001871 cricket::AudioSendParameters parameters;
1872 parameters.codecs.push_back(kIsacCodec);
1873 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001874 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001875 parameters.codecs.push_back(kCn16000Codec);
1876 parameters.codecs.push_back(kCn8000Codec);
1877 parameters.codecs.push_back(kTelephoneEventCodec);
1878 parameters.codecs.push_back(kRedCodec);
1879 parameters.codecs[0].id = 96;
1880 parameters.codecs[2].id = 97; // wideband CN
1881 parameters.codecs[4].id = 98; // DTMF
1882 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001883 EXPECT_TRUE(channel_->AddSendStream(
1884 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001885 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001886
1887 webrtc::CodecInst gcodec;
1888 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1889 EXPECT_EQ(96, gcodec.pltype);
1890 EXPECT_STREQ("ISAC", gcodec.plname);
1891 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001892 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001893 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1894 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001895 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001896}
1897
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898// Test that we only apply VAD if we have a CN codec that matches the
1899// send codec clockrate.
1900TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001901 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001902 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001903 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001905 parameters.codecs.push_back(kIsacCodec);
1906 parameters.codecs.push_back(kCn16000Codec);
1907 parameters.codecs[1].id = 97;
1908 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001909 webrtc::CodecInst gcodec;
1910 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1911 EXPECT_STREQ("ISAC", gcodec.plname);
1912 EXPECT_TRUE(voe_.GetVAD(channel_num));
1913 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1914 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001915 parameters.codecs[0] = kPcmuCodec;
1916 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1918 EXPECT_STREQ("PCMU", gcodec.plname);
1919 EXPECT_FALSE(voe_.GetVAD(channel_num));
1920 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001921 parameters.codecs[1] = kCn8000Codec;
1922 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001923 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1924 EXPECT_STREQ("PCMU", gcodec.plname);
1925 EXPECT_TRUE(voe_.GetVAD(channel_num));
1926 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001927 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001928 parameters.codecs[0] = kIsacCodec;
1929 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001930 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1931 EXPECT_STREQ("ISAC", gcodec.plname);
1932 EXPECT_FALSE(voe_.GetVAD(channel_num));
1933}
1934
1935// Test that we perform case-insensitive matching of codec names.
1936TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001937 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001939 cricket::AudioSendParameters parameters;
1940 parameters.codecs.push_back(kIsacCodec);
1941 parameters.codecs.push_back(kPcmuCodec);
1942 parameters.codecs.push_back(kCn16000Codec);
1943 parameters.codecs.push_back(kCn8000Codec);
1944 parameters.codecs.push_back(kTelephoneEventCodec);
1945 parameters.codecs.push_back(kRedCodec);
1946 parameters.codecs[0].name = "iSaC";
1947 parameters.codecs[0].id = 96;
1948 parameters.codecs[2].id = 97; // wideband CN
1949 parameters.codecs[4].id = 98; // DTMF
1950 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 webrtc::CodecInst gcodec;
1952 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1953 EXPECT_EQ(96, gcodec.pltype);
1954 EXPECT_STREQ("ISAC", gcodec.plname);
1955 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001956 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001957 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1958 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001959 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960}
1961
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001962// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001963TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001964 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001966 cricket::AudioSendParameters parameters;
1967 parameters.codecs.push_back(kRedCodec);
1968 parameters.codecs.push_back(kIsacCodec);
1969 parameters.codecs.push_back(kPcmuCodec);
1970 parameters.codecs[0].id = 127;
1971 parameters.codecs[0].params[""] = "96/96";
1972 parameters.codecs[1].id = 96;
1973 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974 webrtc::CodecInst gcodec;
1975 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1976 EXPECT_EQ(96, gcodec.pltype);
1977 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001978 EXPECT_TRUE(voe_.GetRED(channel_num));
1979 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980}
1981
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001982// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001983TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001984 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001985 cricket::AudioSendParameters parameters;
1986 parameters.codecs.push_back(kRedCodec);
1987 parameters.codecs.push_back(kIsacCodec);
1988 parameters.codecs.push_back(kPcmuCodec);
1989 parameters.codecs[0].id = 127;
1990 parameters.codecs[0].params[""] = "96/96";
1991 parameters.codecs[1].id = 96;
1992 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001993 EXPECT_TRUE(channel_->AddSendStream(
1994 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001995 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001996 webrtc::CodecInst gcodec;
1997 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1998 EXPECT_EQ(96, gcodec.pltype);
1999 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002000 EXPECT_TRUE(voe_.GetRED(channel_num));
2001 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002002}
2003
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002004// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002005TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002006 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002008 cricket::AudioSendParameters parameters;
2009 parameters.codecs.push_back(kRedCodec);
2010 parameters.codecs.push_back(kIsacCodec);
2011 parameters.codecs.push_back(kPcmuCodec);
2012 parameters.codecs[0].id = 127;
2013 parameters.codecs[1].id = 96;
2014 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015 webrtc::CodecInst gcodec;
2016 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2017 EXPECT_EQ(96, gcodec.pltype);
2018 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002019 EXPECT_TRUE(voe_.GetRED(channel_num));
2020 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002021}
2022
2023// Test that we ignore RED if the parameters aren't named the way we expect.
2024TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002025 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002027 cricket::AudioSendParameters parameters;
2028 parameters.codecs.push_back(kRedCodec);
2029 parameters.codecs.push_back(kIsacCodec);
2030 parameters.codecs.push_back(kPcmuCodec);
2031 parameters.codecs[0].id = 127;
2032 parameters.codecs[0].params["ABC"] = "96/96";
2033 parameters.codecs[1].id = 96;
2034 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035 webrtc::CodecInst gcodec;
2036 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2037 EXPECT_EQ(96, gcodec.pltype);
2038 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002039 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002040}
2041
2042// Test that we ignore RED if it uses different primary/secondary encoding.
2043TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002044 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002045 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002046 cricket::AudioSendParameters parameters;
2047 parameters.codecs.push_back(kRedCodec);
2048 parameters.codecs.push_back(kIsacCodec);
2049 parameters.codecs.push_back(kPcmuCodec);
2050 parameters.codecs[0].id = 127;
2051 parameters.codecs[0].params[""] = "96/0";
2052 parameters.codecs[1].id = 96;
2053 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002054 webrtc::CodecInst gcodec;
2055 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2056 EXPECT_EQ(96, gcodec.pltype);
2057 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002058 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002059}
2060
2061// Test that we ignore RED if it uses more than 2 encodings.
2062TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002063 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002065 cricket::AudioSendParameters parameters;
2066 parameters.codecs.push_back(kRedCodec);
2067 parameters.codecs.push_back(kIsacCodec);
2068 parameters.codecs.push_back(kPcmuCodec);
2069 parameters.codecs[0].id = 127;
2070 parameters.codecs[0].params[""] = "96/96/96";
2071 parameters.codecs[1].id = 96;
2072 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002073 webrtc::CodecInst gcodec;
2074 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2075 EXPECT_EQ(96, gcodec.pltype);
2076 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002077 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002078}
2079
2080// Test that we ignore RED if it has bogus codec ids.
2081TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002082 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002083 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002084 cricket::AudioSendParameters parameters;
2085 parameters.codecs.push_back(kRedCodec);
2086 parameters.codecs.push_back(kIsacCodec);
2087 parameters.codecs.push_back(kPcmuCodec);
2088 parameters.codecs[0].id = 127;
2089 parameters.codecs[0].params[""] = "ABC/ABC";
2090 parameters.codecs[1].id = 96;
2091 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002092 webrtc::CodecInst gcodec;
2093 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2094 EXPECT_EQ(96, gcodec.pltype);
2095 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002096 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002097}
2098
2099// Test that we ignore RED if it refers to a codec that is not present.
2100TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002101 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002103 cricket::AudioSendParameters parameters;
2104 parameters.codecs.push_back(kRedCodec);
2105 parameters.codecs.push_back(kIsacCodec);
2106 parameters.codecs.push_back(kPcmuCodec);
2107 parameters.codecs[0].id = 127;
2108 parameters.codecs[0].params[""] = "97/97";
2109 parameters.codecs[1].id = 96;
2110 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002111 webrtc::CodecInst gcodec;
2112 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2113 EXPECT_EQ(96, gcodec.pltype);
2114 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002115 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002116}
2117
stefanba4c0e42016-02-04 04:12:24 -08002118class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2119 public:
2120 WebRtcVoiceEngineWithSendSideBweTest()
2121 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2122};
2123
2124TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2125 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002126 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002127 ASSERT_FALSE(capabilities.header_extensions.empty());
2128 for (const cricket::RtpHeaderExtension& extension :
2129 capabilities.header_extensions) {
2130 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2131 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2132 extension.id);
2133 return;
2134 }
2135 }
2136 FAIL() << "Transport sequence number extension not in header-extension list.";
2137}
2138
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002139// Test support for audio level header extension.
2140TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2141 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002142}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002143TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2144 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2145}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002146
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002147// Test support for absolute send time header extension.
2148TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2149 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2150}
2151TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2152 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153}
2154
solenberg1ac56142015-10-13 03:58:19 -07002155// Test that we can create a channel and start sending on it.
2156TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002157 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002158 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002159 channel_->SetSend(true);
2160 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2161 channel_->SetSend(false);
2162 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2163}
2164
2165// Test that a channel will send if and only if it has a source and is enabled
2166// for sending.
2167TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002168 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002169 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2170 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2171 channel_->SetSend(true);
2172 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2173 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2174 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2175 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2176 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002177}
2178
solenberg6d6e7c52016-04-13 09:07:30 -07002179// Test that SetSendParameters() does not alter a stream's send state.
2180TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2181 EXPECT_TRUE(SetupSendStream());
2182 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2183
2184 // Turn on sending.
2185 channel_->SetSend(true);
2186 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2187
2188 // Changing RTP header extensions will recreate the AudioSendStream.
2189 send_parameters_.extensions.push_back(
2190 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2191 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2192 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2193
2194 // Turn off sending.
2195 channel_->SetSend(false);
2196 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2197
2198 // Changing RTP header extensions will recreate the AudioSendStream.
2199 send_parameters_.extensions.clear();
2200 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2201 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2202}
2203
solenberg1ac56142015-10-13 03:58:19 -07002204// Test that we can create a channel and start playing out on it.
2205TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002206 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002207 int channel_num = voe_.GetLastChannel();
2208 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2209 EXPECT_TRUE(channel_->SetPlayout(true));
2210 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002211 EXPECT_TRUE(channel_->SetPlayout(false));
2212 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2213}
2214
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002215// Test that we can add and remove send streams.
2216TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2217 SetupForMultiSendStream();
2218
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002219 // Set the global state for sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002220 channel_->SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002221
solenbergc96df772015-10-21 13:01:53 -07002222 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002223 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002224 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002225 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002226 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002227 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002228 }
tfarina5237aaf2015-11-10 23:44:30 -08002229 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002230
solenbergc96df772015-10-21 13:01:53 -07002231 // Delete the send streams.
2232 for (uint32_t ssrc : kSsrcs4) {
2233 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002234 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002235 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002236 }
solenbergc96df772015-10-21 13:01:53 -07002237 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002238}
2239
2240// Test SetSendCodecs correctly configure the codecs in all send streams.
2241TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2242 SetupForMultiSendStream();
2243
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002244 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002245 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002246 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002247 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002248 }
2249
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002250 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002251 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002252 parameters.codecs.push_back(kIsacCodec);
2253 parameters.codecs.push_back(kCn16000Codec);
2254 parameters.codecs[1].id = 97;
2255 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002256
2257 // Verify ISAC and VAD are corrected configured on all send channels.
2258 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002259 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002260 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002261 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2262 EXPECT_STREQ("ISAC", gcodec.plname);
2263 EXPECT_TRUE(voe_.GetVAD(channel_num));
2264 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2265 }
2266
2267 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002268 parameters.codecs[0] = kPcmuCodec;
2269 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002270 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002271 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002272 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2273 EXPECT_STREQ("PCMU", gcodec.plname);
2274 EXPECT_FALSE(voe_.GetVAD(channel_num));
2275 }
2276}
2277
2278// Test we can SetSend on all send streams correctly.
2279TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2280 SetupForMultiSendStream();
2281
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002282 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002283 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002284 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002285 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002286 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2287 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002288 }
2289
2290 // Set the global state for starting sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002291 channel_->SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002292 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002293 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002294 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002295 }
2296
2297 // Set the global state for stopping sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002298 channel_->SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002299 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002300 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002301 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002302 }
2303}
2304
2305// Test we can set the correct statistics on all send streams.
2306TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2307 SetupForMultiSendStream();
2308
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002309 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002310 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002311 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002312 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002313 }
solenberg85a04962015-10-27 03:35:21 -07002314 SetAudioSendStreamStats();
2315
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002316 // Create a receive stream to check that none of the send streams end up in
2317 // the receive stream stats.
2318 EXPECT_TRUE(channel_->AddRecvStream(
2319 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002320 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002321 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2322 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002323
solenberg85a04962015-10-27 03:35:21 -07002324 // Check stats for the added streams.
2325 {
2326 cricket::VoiceMediaInfo info;
2327 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002328
solenberg85a04962015-10-27 03:35:21 -07002329 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002330 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002331 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002332 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002333 }
2334
2335 // We have added one receive stream. We should see empty stats.
2336 EXPECT_EQ(info.receivers.size(), 1u);
2337 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002338 }
solenberg1ac56142015-10-13 03:58:19 -07002339
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002340 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002341 {
2342 cricket::VoiceMediaInfo info;
2343 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2344 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002345 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002346 EXPECT_EQ(0u, info.receivers.size());
2347 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002348
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002349 // Deliver a new packet - a default receive stream should be created and we
2350 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002351 {
2352 cricket::VoiceMediaInfo info;
2353 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2354 SetAudioReceiveStreamStats();
2355 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002356 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002357 EXPECT_EQ(1u, info.receivers.size());
2358 VerifyVoiceReceiverInfo(info.receivers[0]);
2359 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002360}
2361
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002362// Test that we can add and remove receive streams, and do proper send/playout.
2363// We can receive on multiple streams while sending one stream.
2364TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002365 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366 int channel_num1 = voe_.GetLastChannel();
2367
solenberg1ac56142015-10-13 03:58:19 -07002368 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002369 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002371 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372
solenberg1ac56142015-10-13 03:58:19 -07002373 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002374 EXPECT_TRUE(
2375 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376 int channel_num2 = voe_.GetLastChannel();
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002377 channel_->SetSend(true);
2378 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379
solenberg1ac56142015-10-13 03:58:19 -07002380 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2382 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2383
2384 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002385 EXPECT_TRUE(
2386 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387 int channel_num3 = voe_.GetLastChannel();
2388 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2389 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2390 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391
2392 // Stop sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002393 channel_->SetSend(false);
2394 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395
2396 // Stop playout.
2397 EXPECT_TRUE(channel_->SetPlayout(false));
2398 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2399 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2400 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2401
solenberg1ac56142015-10-13 03:58:19 -07002402 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403 EXPECT_TRUE(channel_->SetPlayout(true));
2404 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2405 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2406 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2407
solenberg1ac56142015-10-13 03:58:19 -07002408 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002409 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2410 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002411 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412}
2413
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002415// and start sending on it.
2416TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002417 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002418 cricket::AudioOptions options_adjust_agc;
2419 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420 webrtc::AgcConfig agc_config;
2421 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2422 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002423 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002424 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002425 channel_->SetSend(true);
2426 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2428 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002429 channel_->SetSend(false);
2430 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432}
2433
wu@webrtc.org97077a32013-10-25 21:18:33 +00002434TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002435 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002436 EXPECT_CALL(adm_,
2437 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002438 webrtc::AgcConfig agc_config;
2439 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2440 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002441 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2442 send_parameters_.options.tx_agc_digital_compression_gain =
2443 rtc::Optional<uint16_t>(9);
2444 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2445 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2446 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002447 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2448 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2449 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2450 EXPECT_TRUE(agc_config.limiterEnable);
2451
2452 // Check interaction with adjust_agc_delta. Both should be respected, for
2453 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002454 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2455 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002456 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2457 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2458}
2459
wu@webrtc.org97077a32013-10-25 21:18:33 +00002460TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002461 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002462 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2463 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002464 send_parameters_.options.recording_sample_rate =
2465 rtc::Optional<uint32_t>(48000);
2466 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2467 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002468}
2469
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002471// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002472TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002473 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002474 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002475}
2476
2477TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2478 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002479 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002480 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002481 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002482 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002483 EXPECT_TRUE(channel_->AddRecvStream(
2484 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002485 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2486 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002487
solenberg85a04962015-10-27 03:35:21 -07002488 // Check stats for the added streams.
2489 {
2490 cricket::VoiceMediaInfo info;
2491 EXPECT_EQ(true, channel_->GetStats(&info));
2492
2493 // We have added one send stream. We should see the stats we've set.
2494 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002495 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002496 // We have added one receive stream. We should see empty stats.
2497 EXPECT_EQ(info.receivers.size(), 1u);
2498 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2499 }
solenberg1ac56142015-10-13 03:58:19 -07002500
solenberg566ef242015-11-06 15:34:49 -08002501 // Start sending - this affects some reported stats.
2502 {
2503 cricket::VoiceMediaInfo info;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002504 channel_->SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002505 EXPECT_EQ(true, channel_->GetStats(&info));
2506 VerifyVoiceSenderInfo(info.senders[0], true);
2507 }
2508
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002509 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002510 {
2511 cricket::VoiceMediaInfo info;
2512 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2513 EXPECT_EQ(true, channel_->GetStats(&info));
2514 EXPECT_EQ(1u, info.senders.size());
2515 EXPECT_EQ(0u, info.receivers.size());
2516 }
solenberg1ac56142015-10-13 03:58:19 -07002517
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002518 // Deliver a new packet - a default receive stream should be created and we
2519 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002520 {
2521 cricket::VoiceMediaInfo info;
2522 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2523 SetAudioReceiveStreamStats();
2524 EXPECT_EQ(true, channel_->GetStats(&info));
2525 EXPECT_EQ(1u, info.senders.size());
2526 EXPECT_EQ(1u, info.receivers.size());
2527 VerifyVoiceReceiverInfo(info.receivers[0]);
2528 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529}
2530
2531// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002532// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002533TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002534 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002535 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002536 EXPECT_TRUE(channel_->AddRecvStream(
2537 cricket::StreamParams::CreateLegacy(kSsrc2)));
2538 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539}
2540
2541// Test that the local SSRC is the same on sending and receiving channels if the
2542// receive channel is created before the send channel.
2543TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002544 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002545 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2546 int receive_channel_num = voe_.GetLastChannel();
2547 EXPECT_TRUE(channel_->AddSendStream(
2548 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002549
solenberg3a941542015-11-16 07:34:50 -08002550 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002551 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552}
2553
2554// Test that we can properly receive packets.
2555TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002556 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002557 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002558 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002559 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002560 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561}
2562
2563// Test that we can properly receive packets on multiple streams.
2564TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002565 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2567 int channel_num1 = voe_.GetLastChannel();
2568 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2569 int channel_num2 = voe_.GetLastChannel();
2570 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2571 int channel_num3 = voe_.GetLastChannel();
2572 // Create packets with the right SSRCs.
2573 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002574 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002575 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002576 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002577 }
2578 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2579 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2580 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002581
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002582 DeliverPacket(packets[0], sizeof(packets[0]));
2583 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2584 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2585 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002586
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002587 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002588 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002589 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2590 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002591
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002592 DeliverPacket(packets[2], sizeof(packets[2]));
2593 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002594 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002596
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597 DeliverPacket(packets[3], sizeof(packets[3]));
2598 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2599 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002600 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2601
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002602 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2603 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2604 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2605}
2606
solenberg7e63ef02015-11-20 00:19:43 -08002607// Test that receiving on an unsignalled stream works (default channel will be
2608// created).
2609TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002610 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002611 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2612 int channel_num = voe_.GetLastChannel();
2613 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2614}
2615
2616// Test that receiving on an unsignalled stream works (default channel will be
2617// created), and that packets will be forwarded to the default channel
2618// regardless of their SSRCs.
2619TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002620 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002621 char packet[sizeof(kPcmuFrame)];
2622 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2623
2624 // Note that the first unknown SSRC cannot be 0, because we only support
2625 // creating receive streams for SSRC!=0.
2626 DeliverPacket(packet, sizeof(packet));
2627 int channel_num = voe_.GetLastChannel();
2628 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2629 // Once we have the default channel, SSRC==0 will be ok.
2630 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2631 rtc::SetBE32(&packet[8], ssrc);
2632 DeliverPacket(packet, sizeof(packet));
2633 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2634 }
2635}
2636
2637// Test that a default channel is created even after a signalled stream has been
2638// added, and that this stream will get any packets for unknown SSRCs.
2639TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002640 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002641 char packet[sizeof(kPcmuFrame)];
2642 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2643
2644 // Add a known stream, send packet and verify we got it.
2645 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2646 int signalled_channel_num = voe_.GetLastChannel();
2647 DeliverPacket(packet, sizeof(packet));
2648 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2649
2650 // Note that the first unknown SSRC cannot be 0, because we only support
2651 // creating receive streams for SSRC!=0.
2652 rtc::SetBE32(&packet[8], 7011);
2653 DeliverPacket(packet, sizeof(packet));
2654 int channel_num = voe_.GetLastChannel();
2655 EXPECT_NE(channel_num, signalled_channel_num);
2656 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2657 // Once we have the default channel, SSRC==0 will be ok.
2658 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2659 rtc::SetBE32(&packet[8], ssrc);
2660 DeliverPacket(packet, sizeof(packet));
2661 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2662 }
2663}
2664
solenberg0a617e22015-10-20 15:49:38 -07002665// Test that we properly handle failures to add a receive stream.
2666TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002667 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002668 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670}
2671
solenberg0a617e22015-10-20 15:49:38 -07002672// Test that we properly handle failures to add a send stream.
2673TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002674 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002675 voe_.set_fail_create_channel(true);
2676 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2677}
2678
solenberg1ac56142015-10-13 03:58:19 -07002679// Test that AddRecvStream creates new stream.
2680TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002681 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002682 int channel_num = voe_.GetLastChannel();
2683 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002684 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685}
2686
2687// Test that after adding a recv stream, we do not decode more codecs than
2688// those previously passed into SetRecvCodecs.
2689TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002690 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002691 cricket::AudioRecvParameters parameters;
2692 parameters.codecs.push_back(kIsacCodec);
2693 parameters.codecs.push_back(kPcmuCodec);
2694 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002695 EXPECT_TRUE(channel_->AddRecvStream(
2696 cricket::StreamParams::CreateLegacy(kSsrc1)));
2697 int channel_num2 = voe_.GetLastChannel();
2698 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002699 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002700 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002701 gcodec.channels = 2;
2702 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2703}
2704
2705// Test that we properly clean up any streams that were added, even if
2706// not explicitly removed.
2707TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002708 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002709 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002710 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2711 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2712 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2713 delete channel_;
2714 channel_ = NULL;
2715 EXPECT_EQ(0, voe_.GetNumChannels());
2716}
2717
wu@webrtc.org78187522013-10-07 23:32:02 +00002718TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002719 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002720 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2721}
2722
2723TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002724 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002725 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002726 // Manually delete channel to simulate a failure.
2727 int channel = voe_.GetLastChannel();
2728 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2729 // Add recv stream 2 should work.
2730 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002731 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002732 EXPECT_NE(channel, new_channel);
2733 // The last created channel is deleted too.
2734 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002735}
2736
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002737// Test the InsertDtmf on default send stream as caller.
2738TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2739 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740}
2741
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002742// Test the InsertDtmf on default send stream as callee
2743TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2744 TestInsertDtmf(0, false);
2745}
2746
2747// Test the InsertDtmf on specified send stream as caller.
2748TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2749 TestInsertDtmf(kSsrc1, true);
2750}
2751
2752// Test the InsertDtmf on specified send stream as callee.
2753TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2754 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755}
2756
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002757TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002758 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002759 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002760 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002761 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2762 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2763 EXPECT_TRUE(channel_->SetPlayout(true));
2764 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2765 EXPECT_TRUE(channel_->SetPlayout(false));
2766 EXPECT_FALSE(channel_->SetPlayout(true));
2767}
2768
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002770 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002771 EXPECT_CALL(adm_,
2772 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2773 EXPECT_CALL(adm_,
2774 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2775 EXPECT_CALL(adm_,
2776 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777 bool ec_enabled;
2778 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002779 webrtc::AecmModes aecm_mode;
2780 bool cng_enabled;
2781 bool agc_enabled;
2782 webrtc::AgcModes agc_mode;
2783 webrtc::AgcConfig agc_config;
2784 bool ns_enabled;
2785 webrtc::NsModes ns_mode;
2786 bool highpass_filter_enabled;
2787 bool stereo_swapping_enabled;
2788 bool typing_detection_enabled;
2789 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002790 voe_.GetAecmMode(aecm_mode, cng_enabled);
2791 voe_.GetAgcStatus(agc_enabled, agc_mode);
2792 voe_.GetAgcConfig(agc_config);
2793 voe_.GetNsStatus(ns_enabled, ns_mode);
2794 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2795 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2796 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2797 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002798 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002799 EXPECT_FALSE(cng_enabled);
2800 EXPECT_TRUE(agc_enabled);
2801 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2802 EXPECT_TRUE(ns_enabled);
2803 EXPECT_TRUE(highpass_filter_enabled);
2804 EXPECT_FALSE(stereo_swapping_enabled);
2805 EXPECT_TRUE(typing_detection_enabled);
2806 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2807 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002808 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2809 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002810
solenberg246b8172015-12-08 09:50:23 -08002811 // Nothing set in AudioOptions, so everything should be as default.
2812 send_parameters_.options = cricket::AudioOptions();
2813 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002815 voe_.GetAecmMode(aecm_mode, cng_enabled);
2816 voe_.GetAgcStatus(agc_enabled, agc_mode);
2817 voe_.GetAgcConfig(agc_config);
2818 voe_.GetNsStatus(ns_enabled, ns_mode);
2819 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2820 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2821 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2822 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002823 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824 EXPECT_FALSE(cng_enabled);
2825 EXPECT_TRUE(agc_enabled);
2826 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2827 EXPECT_TRUE(ns_enabled);
2828 EXPECT_TRUE(highpass_filter_enabled);
2829 EXPECT_FALSE(stereo_swapping_enabled);
2830 EXPECT_TRUE(typing_detection_enabled);
2831 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2832 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002833 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2834 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002835
2836 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002837 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2838 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002839 voe_.GetEcStatus(ec_enabled, ec_mode);
2840 EXPECT_FALSE(ec_enabled);
2841
2842 // Turn echo cancellation back on, with settings, and make sure
2843 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002844 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2845 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002846 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 voe_.GetAecmMode(aecm_mode, cng_enabled);
2848 voe_.GetAgcStatus(agc_enabled, agc_mode);
2849 voe_.GetAgcConfig(agc_config);
2850 voe_.GetNsStatus(ns_enabled, ns_mode);
2851 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2852 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2853 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2854 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002855 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856 EXPECT_TRUE(agc_enabled);
2857 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2858 EXPECT_TRUE(ns_enabled);
2859 EXPECT_TRUE(highpass_filter_enabled);
2860 EXPECT_FALSE(stereo_swapping_enabled);
2861 EXPECT_TRUE(typing_detection_enabled);
2862 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2863 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2864
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002865 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2866 // control.
solenberg246b8172015-12-08 09:50:23 -08002867 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2868 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002869 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002870 voe_.GetAecmMode(aecm_mode, cng_enabled);
2871 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002872 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002873 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2874
2875 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002876 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2877 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2878 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2879 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002880 voe_.GetEcStatus(ec_enabled, ec_mode);
2881 EXPECT_FALSE(ec_enabled);
2882 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002883 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2884 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002885 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002886 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002887 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002888 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2889
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002890 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002891 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2892 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002893 voe_.GetAgcStatus(agc_enabled, agc_mode);
2894 EXPECT_FALSE(agc_enabled);
2895
2896 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002897 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2898 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2899 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002900 voe_.GetAgcStatus(agc_enabled, agc_mode);
2901 EXPECT_TRUE(agc_enabled);
2902 voe_.GetAgcConfig(agc_config);
2903 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2904
2905 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002906 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2907 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2908 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2909 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2910 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 voe_.GetNsStatus(ns_enabled, ns_mode);
2912 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2913 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2914 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2915 EXPECT_FALSE(ns_enabled);
2916 EXPECT_FALSE(highpass_filter_enabled);
2917 EXPECT_FALSE(typing_detection_enabled);
2918 EXPECT_TRUE(stereo_swapping_enabled);
2919
solenberg1ac56142015-10-13 03:58:19 -07002920 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002921 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002922 voe_.GetEcStatus(ec_enabled, ec_mode);
2923 voe_.GetNsStatus(ns_enabled, ns_mode);
2924 EXPECT_TRUE(ec_enabled);
2925 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2926 EXPECT_FALSE(ns_enabled);
2927 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2928}
2929
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002930TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002931 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002932
2933 bool ec_enabled;
2934 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935 bool agc_enabled;
2936 webrtc::AgcModes agc_mode;
2937 bool ns_enabled;
2938 webrtc::NsModes ns_mode;
2939 bool highpass_filter_enabled;
2940 bool stereo_swapping_enabled;
2941 bool typing_detection_enabled;
2942
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 voe_.GetAgcStatus(agc_enabled, agc_mode);
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);
2950 EXPECT_TRUE(agc_enabled);
2951 EXPECT_TRUE(ns_enabled);
2952 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002953 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002954 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002955}
2956
2957TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2958 webrtc::AgcConfig set_config = {0};
2959 set_config.targetLeveldBOv = 3;
2960 set_config.digitalCompressionGaindB = 9;
2961 set_config.limiterEnable = true;
2962 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002963
2964 webrtc::AgcConfig config = {0};
2965 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2966 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2967 EXPECT_EQ(set_config.digitalCompressionGaindB,
2968 config.digitalCompressionGaindB);
2969 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2970}
2971
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002972TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002973 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002974 EXPECT_CALL(adm_,
2975 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2976 EXPECT_CALL(adm_,
2977 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2978 EXPECT_CALL(adm_,
2979 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2980
kwiberg686a8ef2016-02-26 03:00:35 -08002981 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002982 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002983 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002984 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002985 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002986 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002987
2988 // Have to add a stream to make SetSend work.
2989 cricket::StreamParams stream1;
2990 stream1.ssrcs.push_back(1);
2991 channel1->AddSendStream(stream1);
2992 cricket::StreamParams stream2;
2993 stream2.ssrcs.push_back(2);
2994 channel2->AddSendStream(stream2);
2995
2996 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002997 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002998 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2999 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3000 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003001 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3002 EXPECT_EQ(parameters_options_all.options, channel1->options());
3003 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3004 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003005
3006 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003007 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003008 parameters_options_no_ns.options.noise_suppression =
3009 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003010 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3011 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003012 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3013 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3014 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003015 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003016
3017 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003018 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003019 parameters_options_no_agc.options.auto_gain_control =
3020 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003021 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003022 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3023 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3024 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003025 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003026
solenberg246b8172015-12-08 09:50:23 -08003027 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003028 bool ec_enabled;
3029 webrtc::EcModes ec_mode;
3030 bool agc_enabled;
3031 webrtc::AgcModes agc_mode;
3032 bool ns_enabled;
3033 webrtc::NsModes ns_mode;
3034 voe_.GetEcStatus(ec_enabled, ec_mode);
3035 voe_.GetAgcStatus(agc_enabled, agc_mode);
3036 voe_.GetNsStatus(ns_enabled, ns_mode);
3037 EXPECT_TRUE(ec_enabled);
3038 EXPECT_TRUE(agc_enabled);
3039 EXPECT_TRUE(ns_enabled);
3040
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003041 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003042 voe_.GetEcStatus(ec_enabled, ec_mode);
3043 voe_.GetAgcStatus(agc_enabled, agc_mode);
3044 voe_.GetNsStatus(ns_enabled, ns_mode);
3045 EXPECT_TRUE(ec_enabled);
3046 EXPECT_TRUE(agc_enabled);
3047 EXPECT_FALSE(ns_enabled);
3048
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003049 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003050 voe_.GetEcStatus(ec_enabled, ec_mode);
3051 voe_.GetAgcStatus(agc_enabled, agc_mode);
3052 voe_.GetNsStatus(ns_enabled, ns_mode);
3053 EXPECT_TRUE(ec_enabled);
3054 EXPECT_FALSE(agc_enabled);
3055 EXPECT_TRUE(ns_enabled);
3056
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003057 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003058 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003059 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3060 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003061 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003062 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003063 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003064 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003065 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003066 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003067 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3068 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3069 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003070 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003071 voe_.GetEcStatus(ec_enabled, ec_mode);
3072 voe_.GetAgcStatus(agc_enabled, agc_mode);
3073 voe_.GetNsStatus(ns_enabled, ns_mode);
3074 EXPECT_TRUE(ec_enabled);
3075 EXPECT_FALSE(agc_enabled);
3076 EXPECT_FALSE(ns_enabled);
3077}
3078
wu@webrtc.orgde305012013-10-31 15:40:38 +00003079// This test verifies DSCP settings are properly applied on voice media channel.
3080TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003081 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003082 cricket::FakeNetworkInterface network_interface;
3083 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003084 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003085
solenbergbc37fc82016-04-04 09:54:44 -07003086 channel.reset(
3087 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003088 channel->SetInterface(&network_interface);
3089 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3090 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3091
3092 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003093 channel.reset(
3094 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003095 channel->SetInterface(&network_interface);
3096 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3097
3098 // Verify that setting the option to false resets the
3099 // DiffServCodePoint.
3100 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003101 channel.reset(
3102 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003103 channel->SetInterface(&network_interface);
3104 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3105 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3106
3107 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003108}
3109
solenberg1ac56142015-10-13 03:58:19 -07003110TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003111 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003112 cricket::WebRtcVoiceMediaChannel* media_channel =
3113 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003114 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3115 EXPECT_TRUE(channel_->AddRecvStream(
3116 cricket::StreamParams::CreateLegacy(kSsrc1)));
3117 int channel_id = voe_.GetLastChannel();
3118 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3119 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3120 EXPECT_TRUE(channel_->AddRecvStream(
3121 cricket::StreamParams::CreateLegacy(kSsrc2)));
3122 int channel_id2 = voe_.GetLastChannel();
3123 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003124}
3125
solenberg1ac56142015-10-13 03:58:19 -07003126TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003127 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003129 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3130 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3131 EXPECT_TRUE(channel_->AddSendStream(
3132 cricket::StreamParams::CreateLegacy(kSsrc1)));
3133 int channel_id = voe_.GetLastChannel();
3134 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3135 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3136 EXPECT_TRUE(channel_->AddSendStream(
3137 cricket::StreamParams::CreateLegacy(kSsrc2)));
3138 int channel_id2 = voe_.GetLastChannel();
3139 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003140}
3141
solenberg4bac9c52015-10-09 02:32:53 -07003142TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003143 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003144 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003145 cricket::StreamParams stream;
3146 stream.ssrcs.push_back(kSsrc2);
3147 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003148 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003149 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003150 float scale = 0;
3151 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3152 EXPECT_DOUBLE_EQ(3, scale);
3153}
3154
3155TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003156 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003157 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3158 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3159 int channel_id = voe_.GetLastChannel();
3160 float scale = 0;
3161 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3162 EXPECT_DOUBLE_EQ(2, scale);
3163 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003164 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003165 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003166}
3167
pbos8fc7fa72015-07-15 08:02:58 -07003168TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003169 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003170 const std::string kSyncLabel = "AvSyncLabel";
3171
solenbergff976312016-03-30 23:28:51 -07003172 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003173 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3174 sp.sync_label = kSyncLabel;
3175 // Creating two channels to make sure that sync label is set properly for both
3176 // the default voice channel and following ones.
3177 EXPECT_TRUE(channel_->AddRecvStream(sp));
3178 sp.ssrcs[0] += 1;
3179 EXPECT_TRUE(channel_->AddRecvStream(sp));
3180
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003181 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003182 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003183 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003184 << "SyncGroup should be set based on sync_label";
3185 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003186 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003187 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003188}
3189
solenberg3a941542015-11-16 07:34:50 -08003190// TODO(solenberg): Remove, once recv streams are configured through Call.
3191// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003192TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003193 // Test that setting the header extensions results in the expected state
3194 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003195 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003196 ssrcs.push_back(223);
3197 ssrcs.push_back(224);
3198
solenbergff976312016-03-30 23:28:51 -07003199 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003200 cricket::WebRtcVoiceMediaChannel* media_channel =
3201 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003202 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003203 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003204 EXPECT_TRUE(media_channel->AddRecvStream(
3205 cricket::StreamParams::CreateLegacy(ssrc)));
3206 }
3207
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003208 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003209 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003210 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003211 EXPECT_NE(nullptr, s);
3212 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3213 }
3214
3215 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003216 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003217 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003218 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003219 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003220 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003221 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003222 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003223 EXPECT_NE(nullptr, s);
3224 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003225 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3226 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003227 for (const auto& s_ext : s_exts) {
3228 if (e_ext.id == s_ext.id) {
3229 EXPECT_EQ(e_ext.uri, s_ext.name);
3230 }
3231 }
3232 }
3233 }
3234
3235 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003236 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003237 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003238 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003239 EXPECT_NE(nullptr, s);
3240 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3241 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003242}
3243
3244TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3245 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003246 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003247 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003248 static const unsigned char kRtcp[] = {
3249 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3250 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3253 };
jbaucheec21bd2016-03-20 06:15:43 -07003254 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003255
solenbergff976312016-03-30 23:28:51 -07003256 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003257 cricket::WebRtcVoiceMediaChannel* media_channel =
3258 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003259 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003260 EXPECT_TRUE(media_channel->AddRecvStream(
3261 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3262
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003263 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003264 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003265 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003266 EXPECT_EQ(0, s->received_packets());
3267 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3268 EXPECT_EQ(1, s->received_packets());
3269 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3270 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003271}
Minyue2013aec2015-05-13 14:14:42 +02003272
solenberg0a617e22015-10-20 15:49:38 -07003273// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003274// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003275TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003276 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003277 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003278 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003279 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3280 int recv_ch = voe_.GetLastChannel();
3281 EXPECT_NE(recv_ch, default_channel);
3282 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3283 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3284 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003285 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3286 recv_ch = voe_.GetLastChannel();
3287 EXPECT_NE(recv_ch, default_channel);
3288 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003289}
3290
3291TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003292 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003293 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003294
3295 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3296 int recv_ch = voe_.GetLastChannel();
3297
3298 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3299 int send_ch = voe_.GetLastChannel();
3300
3301 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3302 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3303 // channel of |recv_ch|.This is not a common case, since, normally, only the
3304 // default channel can be associated. However, the default is not deletable.
3305 // So we force the |recv_ch| to associate with a non-default channel.
3306 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3307 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3308
3309 EXPECT_TRUE(channel_->RemoveSendStream(2));
3310 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3311}
stefan658910c2015-09-03 05:48:32 -07003312
deadbeef884f5852016-01-15 09:20:04 -08003313TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003314 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003315 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3316 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003317
3318 // Setting the sink before a recv stream exists should do nothing.
3319 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3320 EXPECT_TRUE(
3321 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3322 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3323
3324 // Now try actually setting the sink.
3325 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3326 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3327
3328 // Now try resetting it.
3329 channel_->SetRawAudioSink(kSsrc1, nullptr);
3330 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3331}
3332
3333TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003334 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003335 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3336 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003337
3338 // Should be able to set a default sink even when no stream exists.
3339 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3340
3341 // Create default channel and ensure it's assigned the default sink.
3342 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3343 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3344
3345 // Try resetting the default sink.
3346 channel_->SetRawAudioSink(0, nullptr);
3347 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3348
3349 // Try setting the default sink while the default stream exists.
3350 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3351 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3352
3353 // If we remove and add a default stream, it should get the same sink.
3354 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3355 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3356 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3357}
3358
skvlad7a43d252016-03-22 15:32:27 -07003359// Test that, just like the video channel, the voice channel communicates the
3360// network state to the call.
3361TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003362 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003363
3364 EXPECT_EQ(webrtc::kNetworkUp,
3365 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3366 EXPECT_EQ(webrtc::kNetworkUp,
3367 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3368
3369 channel_->OnReadyToSend(false);
3370 EXPECT_EQ(webrtc::kNetworkDown,
3371 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3372 EXPECT_EQ(webrtc::kNetworkUp,
3373 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3374
3375 channel_->OnReadyToSend(true);
3376 EXPECT_EQ(webrtc::kNetworkUp,
3377 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3378 EXPECT_EQ(webrtc::kNetworkUp,
3379 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3380}
3381
stefan658910c2015-09-03 05:48:32 -07003382// Tests that the library initializes and shuts down properly.
3383TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003384 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003385 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003386 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003387 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3388 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003389 EXPECT_TRUE(channel != nullptr);
3390 delete channel;
solenbergff976312016-03-30 23:28:51 -07003391}
stefan658910c2015-09-03 05:48:32 -07003392
solenbergff976312016-03-30 23:28:51 -07003393// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003394TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3395 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3396 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3397 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003398 {
3399 cricket::WebRtcVoiceEngine engine(&adm);
3400 std::unique_ptr<webrtc::Call> call(
3401 webrtc::Call::Create(webrtc::Call::Config()));
3402 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3403 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3404 EXPECT_TRUE(channel != nullptr);
3405 delete channel;
3406 }
stefan658910c2015-09-03 05:48:32 -07003407}
3408
3409// Tests that the library is configured with the codecs we want.
3410TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003411 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003412 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3413 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3414 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3415 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3416 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3417 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003418 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003419 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3420 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3421 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3422 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3423 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3424 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3425 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3426 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3427 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3428 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3429 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3430 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3431 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3432 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3433 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3434 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3435 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3436 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3437 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3438 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003439 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003440 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3441 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3442 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3443 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3444 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3445 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3446 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3447 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003448 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003449 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3450 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003451 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003452 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3453 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3454 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3455 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3456 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3457 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3458 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3459 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3460 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3461 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3462
stefan658910c2015-09-03 05:48:32 -07003463 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003464 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003465 for (std::vector<cricket::AudioCodec>::const_iterator it =
3466 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3467 if (it->name == "CN" && it->clockrate == 16000) {
3468 EXPECT_EQ(105, it->id);
3469 } else if (it->name == "CN" && it->clockrate == 32000) {
3470 EXPECT_EQ(106, it->id);
3471 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3472 EXPECT_EQ(103, it->id);
3473 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3474 EXPECT_EQ(104, it->id);
3475 } else if (it->name == "G722" && it->clockrate == 8000) {
3476 EXPECT_EQ(9, it->id);
3477 } else if (it->name == "telephone-event") {
3478 EXPECT_EQ(126, it->id);
3479 } else if (it->name == "red") {
3480 EXPECT_EQ(127, it->id);
3481 } else if (it->name == "opus") {
3482 EXPECT_EQ(111, it->id);
3483 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3484 EXPECT_EQ("10", it->params.find("minptime")->second);
3485 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3486 EXPECT_EQ("60", it->params.find("maxptime")->second);
3487 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3488 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3489 }
3490 }
stefan658910c2015-09-03 05:48:32 -07003491}
3492
3493// Tests that VoE supports at least 32 channels
3494TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003495 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003496 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003497 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003498
3499 cricket::VoiceMediaChannel* channels[32];
3500 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003501 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003502 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3503 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003504 if (!channel)
3505 break;
stefan658910c2015-09-03 05:48:32 -07003506 channels[num_channels++] = channel;
3507 }
3508
tfarina5237aaf2015-11-10 23:44:30 -08003509 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003510 EXPECT_EQ(expected, num_channels);
3511
3512 while (num_channels > 0) {
3513 delete channels[--num_channels];
3514 }
stefan658910c2015-09-03 05:48:32 -07003515}
3516
3517// Test that we set our preferred codecs properly.
3518TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003519 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003520 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003521 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003522 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3523 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003524 cricket::AudioRecvParameters parameters;
3525 parameters.codecs = engine.codecs();
3526 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003527}