blob: f88b99ba103960591bdd6b47406e635abf9fcc65 [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
2179// Test that we can create a channel and start playing out on it.
2180TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002181 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002182 int channel_num = voe_.GetLastChannel();
2183 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2184 EXPECT_TRUE(channel_->SetPlayout(true));
2185 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002186 EXPECT_TRUE(channel_->SetPlayout(false));
2187 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2188}
2189
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002190// Test that we can add and remove send streams.
2191TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2192 SetupForMultiSendStream();
2193
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002194 // Set the global state for sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002195 channel_->SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002196
solenbergc96df772015-10-21 13:01:53 -07002197 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002198 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002199 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002200 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002201 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002202 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002203 }
tfarina5237aaf2015-11-10 23:44:30 -08002204 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002205
solenbergc96df772015-10-21 13:01:53 -07002206 // Delete the send streams.
2207 for (uint32_t ssrc : kSsrcs4) {
2208 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002209 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002210 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002211 }
solenbergc96df772015-10-21 13:01:53 -07002212 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213}
2214
2215// Test SetSendCodecs correctly configure the codecs in all send streams.
2216TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2217 SetupForMultiSendStream();
2218
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002219 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002220 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002221 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002222 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002223 }
2224
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002225 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002226 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002227 parameters.codecs.push_back(kIsacCodec);
2228 parameters.codecs.push_back(kCn16000Codec);
2229 parameters.codecs[1].id = 97;
2230 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002231
2232 // Verify ISAC and VAD are corrected configured on all send channels.
2233 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002234 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002235 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002236 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2237 EXPECT_STREQ("ISAC", gcodec.plname);
2238 EXPECT_TRUE(voe_.GetVAD(channel_num));
2239 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2240 }
2241
2242 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002243 parameters.codecs[0] = kPcmuCodec;
2244 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002245 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002246 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002247 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2248 EXPECT_STREQ("PCMU", gcodec.plname);
2249 EXPECT_FALSE(voe_.GetVAD(channel_num));
2250 }
2251}
2252
2253// Test we can SetSend on all send streams correctly.
2254TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2255 SetupForMultiSendStream();
2256
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002257 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002258 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002260 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002261 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2262 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002263 }
2264
2265 // Set the global state for starting sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002266 channel_->SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002267 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002268 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002269 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002270 }
2271
2272 // Set the global state for stopping sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002273 channel_->SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002274 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002275 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002276 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002277 }
2278}
2279
2280// Test we can set the correct statistics on all send streams.
2281TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2282 SetupForMultiSendStream();
2283
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002284 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002285 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002286 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002287 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002288 }
solenberg85a04962015-10-27 03:35:21 -07002289 SetAudioSendStreamStats();
2290
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002291 // Create a receive stream to check that none of the send streams end up in
2292 // the receive stream stats.
2293 EXPECT_TRUE(channel_->AddRecvStream(
2294 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002295 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002296 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2297 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002298
solenberg85a04962015-10-27 03:35:21 -07002299 // Check stats for the added streams.
2300 {
2301 cricket::VoiceMediaInfo info;
2302 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002303
solenberg85a04962015-10-27 03:35:21 -07002304 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002305 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002306 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002307 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002308 }
2309
2310 // We have added one receive stream. We should see empty stats.
2311 EXPECT_EQ(info.receivers.size(), 1u);
2312 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002313 }
solenberg1ac56142015-10-13 03:58:19 -07002314
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002315 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002316 {
2317 cricket::VoiceMediaInfo info;
2318 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2319 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002320 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002321 EXPECT_EQ(0u, info.receivers.size());
2322 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002323
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002324 // Deliver a new packet - a default receive stream should be created and we
2325 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002326 {
2327 cricket::VoiceMediaInfo info;
2328 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2329 SetAudioReceiveStreamStats();
2330 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002331 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002332 EXPECT_EQ(1u, info.receivers.size());
2333 VerifyVoiceReceiverInfo(info.receivers[0]);
2334 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002335}
2336
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002337// Test that we can add and remove receive streams, and do proper send/playout.
2338// We can receive on multiple streams while sending one stream.
2339TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002340 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341 int channel_num1 = voe_.GetLastChannel();
2342
solenberg1ac56142015-10-13 03:58:19 -07002343 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002344 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002345 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002346 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347
solenberg1ac56142015-10-13 03:58:19 -07002348 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002349 EXPECT_TRUE(
2350 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351 int channel_num2 = voe_.GetLastChannel();
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002352 channel_->SetSend(true);
2353 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354
solenberg1ac56142015-10-13 03:58:19 -07002355 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2357 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2358
2359 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002360 EXPECT_TRUE(
2361 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362 int channel_num3 = voe_.GetLastChannel();
2363 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2364 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2365 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366
2367 // Stop sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002368 channel_->SetSend(false);
2369 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370
2371 // Stop playout.
2372 EXPECT_TRUE(channel_->SetPlayout(false));
2373 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2374 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2375 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2376
solenberg1ac56142015-10-13 03:58:19 -07002377 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378 EXPECT_TRUE(channel_->SetPlayout(true));
2379 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2380 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2381 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2382
solenberg1ac56142015-10-13 03:58:19 -07002383 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2385 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002386 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387}
2388
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002390// and start sending on it.
2391TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002392 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002393 cricket::AudioOptions options_adjust_agc;
2394 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395 webrtc::AgcConfig agc_config;
2396 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2397 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002398 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002399 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002400 channel_->SetSend(true);
2401 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002402 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2403 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002404 channel_->SetSend(false);
2405 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002407}
2408
wu@webrtc.org97077a32013-10-25 21:18:33 +00002409TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002410 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002411 EXPECT_CALL(adm_,
2412 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002413 webrtc::AgcConfig agc_config;
2414 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2415 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002416 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2417 send_parameters_.options.tx_agc_digital_compression_gain =
2418 rtc::Optional<uint16_t>(9);
2419 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2420 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2421 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002422 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2423 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2424 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2425 EXPECT_TRUE(agc_config.limiterEnable);
2426
2427 // Check interaction with adjust_agc_delta. Both should be respected, for
2428 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002429 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2430 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002431 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2432 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2433}
2434
wu@webrtc.org97077a32013-10-25 21:18:33 +00002435TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002436 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002437 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2438 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002439 send_parameters_.options.recording_sample_rate =
2440 rtc::Optional<uint32_t>(48000);
2441 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2442 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002443}
2444
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002445// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002446// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002447TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002448 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002449 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450}
2451
2452TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2453 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002454 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002455 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002456 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002457 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002458 EXPECT_TRUE(channel_->AddRecvStream(
2459 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002460 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2461 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462
solenberg85a04962015-10-27 03:35:21 -07002463 // Check stats for the added streams.
2464 {
2465 cricket::VoiceMediaInfo info;
2466 EXPECT_EQ(true, channel_->GetStats(&info));
2467
2468 // We have added one send stream. We should see the stats we've set.
2469 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002470 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002471 // We have added one receive stream. We should see empty stats.
2472 EXPECT_EQ(info.receivers.size(), 1u);
2473 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2474 }
solenberg1ac56142015-10-13 03:58:19 -07002475
solenberg566ef242015-11-06 15:34:49 -08002476 // Start sending - this affects some reported stats.
2477 {
2478 cricket::VoiceMediaInfo info;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002479 channel_->SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002480 EXPECT_EQ(true, channel_->GetStats(&info));
2481 VerifyVoiceSenderInfo(info.senders[0], true);
2482 }
2483
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002484 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002485 {
2486 cricket::VoiceMediaInfo info;
2487 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2488 EXPECT_EQ(true, channel_->GetStats(&info));
2489 EXPECT_EQ(1u, info.senders.size());
2490 EXPECT_EQ(0u, info.receivers.size());
2491 }
solenberg1ac56142015-10-13 03:58:19 -07002492
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002493 // Deliver a new packet - a default receive stream should be created and we
2494 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002495 {
2496 cricket::VoiceMediaInfo info;
2497 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2498 SetAudioReceiveStreamStats();
2499 EXPECT_EQ(true, channel_->GetStats(&info));
2500 EXPECT_EQ(1u, info.senders.size());
2501 EXPECT_EQ(1u, info.receivers.size());
2502 VerifyVoiceReceiverInfo(info.receivers[0]);
2503 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504}
2505
2506// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002507// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002509 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002510 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002511 EXPECT_TRUE(channel_->AddRecvStream(
2512 cricket::StreamParams::CreateLegacy(kSsrc2)));
2513 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514}
2515
2516// Test that the local SSRC is the same on sending and receiving channels if the
2517// receive channel is created before the send channel.
2518TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002519 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2521 int receive_channel_num = voe_.GetLastChannel();
2522 EXPECT_TRUE(channel_->AddSendStream(
2523 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524
solenberg3a941542015-11-16 07:34:50 -08002525 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002526 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002527}
2528
2529// Test that we can properly receive packets.
2530TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002531 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002532 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002533 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002534 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002535 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536}
2537
2538// Test that we can properly receive packets on multiple streams.
2539TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002540 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2542 int channel_num1 = voe_.GetLastChannel();
2543 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2544 int channel_num2 = voe_.GetLastChannel();
2545 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2546 int channel_num3 = voe_.GetLastChannel();
2547 // Create packets with the right SSRCs.
2548 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002549 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002551 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552 }
2553 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2554 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2555 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002556
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557 DeliverPacket(packets[0], sizeof(packets[0]));
2558 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2559 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2560 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002561
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002562 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002563 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002564 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2565 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002566
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002567 DeliverPacket(packets[2], sizeof(packets[2]));
2568 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002569 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002571
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002572 DeliverPacket(packets[3], sizeof(packets[3]));
2573 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2574 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002575 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2576
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002577 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2578 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2579 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2580}
2581
solenberg7e63ef02015-11-20 00:19:43 -08002582// Test that receiving on an unsignalled stream works (default channel will be
2583// created).
2584TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002585 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002586 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2587 int channel_num = voe_.GetLastChannel();
2588 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2589}
2590
2591// Test that receiving on an unsignalled stream works (default channel will be
2592// created), and that packets will be forwarded to the default channel
2593// regardless of their SSRCs.
2594TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002595 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002596 char packet[sizeof(kPcmuFrame)];
2597 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2598
2599 // Note that the first unknown SSRC cannot be 0, because we only support
2600 // creating receive streams for SSRC!=0.
2601 DeliverPacket(packet, sizeof(packet));
2602 int channel_num = voe_.GetLastChannel();
2603 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2604 // Once we have the default channel, SSRC==0 will be ok.
2605 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2606 rtc::SetBE32(&packet[8], ssrc);
2607 DeliverPacket(packet, sizeof(packet));
2608 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2609 }
2610}
2611
2612// Test that a default channel is created even after a signalled stream has been
2613// added, and that this stream will get any packets for unknown SSRCs.
2614TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002615 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002616 char packet[sizeof(kPcmuFrame)];
2617 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2618
2619 // Add a known stream, send packet and verify we got it.
2620 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2621 int signalled_channel_num = voe_.GetLastChannel();
2622 DeliverPacket(packet, sizeof(packet));
2623 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2624
2625 // Note that the first unknown SSRC cannot be 0, because we only support
2626 // creating receive streams for SSRC!=0.
2627 rtc::SetBE32(&packet[8], 7011);
2628 DeliverPacket(packet, sizeof(packet));
2629 int channel_num = voe_.GetLastChannel();
2630 EXPECT_NE(channel_num, signalled_channel_num);
2631 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2632 // Once we have the default channel, SSRC==0 will be ok.
2633 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2634 rtc::SetBE32(&packet[8], ssrc);
2635 DeliverPacket(packet, sizeof(packet));
2636 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2637 }
2638}
2639
solenberg0a617e22015-10-20 15:49:38 -07002640// Test that we properly handle failures to add a receive stream.
2641TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002642 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002643 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645}
2646
solenberg0a617e22015-10-20 15:49:38 -07002647// Test that we properly handle failures to add a send stream.
2648TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002649 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002650 voe_.set_fail_create_channel(true);
2651 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2652}
2653
solenberg1ac56142015-10-13 03:58:19 -07002654// Test that AddRecvStream creates new stream.
2655TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002656 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002657 int channel_num = voe_.GetLastChannel();
2658 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002659 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660}
2661
2662// Test that after adding a recv stream, we do not decode more codecs than
2663// those previously passed into SetRecvCodecs.
2664TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002665 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002666 cricket::AudioRecvParameters parameters;
2667 parameters.codecs.push_back(kIsacCodec);
2668 parameters.codecs.push_back(kPcmuCodec);
2669 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670 EXPECT_TRUE(channel_->AddRecvStream(
2671 cricket::StreamParams::CreateLegacy(kSsrc1)));
2672 int channel_num2 = voe_.GetLastChannel();
2673 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002674 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002675 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 gcodec.channels = 2;
2677 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2678}
2679
2680// Test that we properly clean up any streams that were added, even if
2681// not explicitly removed.
2682TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002683 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002684 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2686 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2687 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2688 delete channel_;
2689 channel_ = NULL;
2690 EXPECT_EQ(0, voe_.GetNumChannels());
2691}
2692
wu@webrtc.org78187522013-10-07 23:32:02 +00002693TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002694 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002695 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2696}
2697
2698TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002699 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002700 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002701 // Manually delete channel to simulate a failure.
2702 int channel = voe_.GetLastChannel();
2703 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2704 // Add recv stream 2 should work.
2705 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002706 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002707 EXPECT_NE(channel, new_channel);
2708 // The last created channel is deleted too.
2709 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002710}
2711
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002712// Test the InsertDtmf on default send stream as caller.
2713TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2714 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002715}
2716
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002717// Test the InsertDtmf on default send stream as callee
2718TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2719 TestInsertDtmf(0, false);
2720}
2721
2722// Test the InsertDtmf on specified send stream as caller.
2723TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2724 TestInsertDtmf(kSsrc1, true);
2725}
2726
2727// Test the InsertDtmf on specified send stream as callee.
2728TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2729 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002730}
2731
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002733 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002734 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002735 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002736 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2737 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2738 EXPECT_TRUE(channel_->SetPlayout(true));
2739 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2740 EXPECT_TRUE(channel_->SetPlayout(false));
2741 EXPECT_FALSE(channel_->SetPlayout(true));
2742}
2743
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002744TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002745 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002746 EXPECT_CALL(adm_,
2747 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2748 EXPECT_CALL(adm_,
2749 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2750 EXPECT_CALL(adm_,
2751 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002752 bool ec_enabled;
2753 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002754 webrtc::AecmModes aecm_mode;
2755 bool cng_enabled;
2756 bool agc_enabled;
2757 webrtc::AgcModes agc_mode;
2758 webrtc::AgcConfig agc_config;
2759 bool ns_enabled;
2760 webrtc::NsModes ns_mode;
2761 bool highpass_filter_enabled;
2762 bool stereo_swapping_enabled;
2763 bool typing_detection_enabled;
2764 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765 voe_.GetAecmMode(aecm_mode, cng_enabled);
2766 voe_.GetAgcStatus(agc_enabled, agc_mode);
2767 voe_.GetAgcConfig(agc_config);
2768 voe_.GetNsStatus(ns_enabled, ns_mode);
2769 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2770 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2771 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2772 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002773 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002774 EXPECT_FALSE(cng_enabled);
2775 EXPECT_TRUE(agc_enabled);
2776 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2777 EXPECT_TRUE(ns_enabled);
2778 EXPECT_TRUE(highpass_filter_enabled);
2779 EXPECT_FALSE(stereo_swapping_enabled);
2780 EXPECT_TRUE(typing_detection_enabled);
2781 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2782 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002783 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2784 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785
solenberg246b8172015-12-08 09:50:23 -08002786 // Nothing set in AudioOptions, so everything should be as default.
2787 send_parameters_.options = cricket::AudioOptions();
2788 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789 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
2811 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002812 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2813 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814 voe_.GetEcStatus(ec_enabled, ec_mode);
2815 EXPECT_FALSE(ec_enabled);
2816
2817 // Turn echo cancellation back on, with settings, and make sure
2818 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002819 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2820 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002821 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822 voe_.GetAecmMode(aecm_mode, cng_enabled);
2823 voe_.GetAgcStatus(agc_enabled, agc_mode);
2824 voe_.GetAgcConfig(agc_config);
2825 voe_.GetNsStatus(ns_enabled, ns_mode);
2826 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2827 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2828 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2829 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002830 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002831 EXPECT_TRUE(agc_enabled);
2832 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2833 EXPECT_TRUE(ns_enabled);
2834 EXPECT_TRUE(highpass_filter_enabled);
2835 EXPECT_FALSE(stereo_swapping_enabled);
2836 EXPECT_TRUE(typing_detection_enabled);
2837 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2838 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2839
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002840 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2841 // control.
solenberg246b8172015-12-08 09:50:23 -08002842 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2843 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002844 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002845 voe_.GetAecmMode(aecm_mode, cng_enabled);
2846 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002847 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002848 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2849
2850 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002851 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2852 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2853 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2854 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002855 voe_.GetEcStatus(ec_enabled, ec_mode);
2856 EXPECT_FALSE(ec_enabled);
2857 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002858 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2859 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002860 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002861 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002862 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002863 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2864
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002865 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002866 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2867 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002868 voe_.GetAgcStatus(agc_enabled, agc_mode);
2869 EXPECT_FALSE(agc_enabled);
2870
2871 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002872 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2873 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2874 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002875 voe_.GetAgcStatus(agc_enabled, agc_mode);
2876 EXPECT_TRUE(agc_enabled);
2877 voe_.GetAgcConfig(agc_config);
2878 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2879
2880 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002881 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2882 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2883 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2884 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2885 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002886 voe_.GetNsStatus(ns_enabled, ns_mode);
2887 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2888 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2889 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2890 EXPECT_FALSE(ns_enabled);
2891 EXPECT_FALSE(highpass_filter_enabled);
2892 EXPECT_FALSE(typing_detection_enabled);
2893 EXPECT_TRUE(stereo_swapping_enabled);
2894
solenberg1ac56142015-10-13 03:58:19 -07002895 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002896 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897 voe_.GetEcStatus(ec_enabled, ec_mode);
2898 voe_.GetNsStatus(ns_enabled, ns_mode);
2899 EXPECT_TRUE(ec_enabled);
2900 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2901 EXPECT_FALSE(ns_enabled);
2902 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2903}
2904
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002905TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002906 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907
2908 bool ec_enabled;
2909 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002910 bool agc_enabled;
2911 webrtc::AgcModes agc_mode;
2912 bool ns_enabled;
2913 webrtc::NsModes ns_mode;
2914 bool highpass_filter_enabled;
2915 bool stereo_swapping_enabled;
2916 bool typing_detection_enabled;
2917
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002918 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919 voe_.GetAgcStatus(agc_enabled, agc_mode);
2920 voe_.GetNsStatus(ns_enabled, ns_mode);
2921 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2922 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2923 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2924 EXPECT_TRUE(ec_enabled);
2925 EXPECT_TRUE(agc_enabled);
2926 EXPECT_TRUE(ns_enabled);
2927 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002928 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930}
2931
2932TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2933 webrtc::AgcConfig set_config = {0};
2934 set_config.targetLeveldBOv = 3;
2935 set_config.digitalCompressionGaindB = 9;
2936 set_config.limiterEnable = true;
2937 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002938
2939 webrtc::AgcConfig config = {0};
2940 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2941 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2942 EXPECT_EQ(set_config.digitalCompressionGaindB,
2943 config.digitalCompressionGaindB);
2944 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2945}
2946
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002947TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002948 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002949 EXPECT_CALL(adm_,
2950 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2951 EXPECT_CALL(adm_,
2952 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2953 EXPECT_CALL(adm_,
2954 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2955
kwiberg686a8ef2016-02-26 03:00:35 -08002956 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002957 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002958 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002959 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002960 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002961 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002962
2963 // Have to add a stream to make SetSend work.
2964 cricket::StreamParams stream1;
2965 stream1.ssrcs.push_back(1);
2966 channel1->AddSendStream(stream1);
2967 cricket::StreamParams stream2;
2968 stream2.ssrcs.push_back(2);
2969 channel2->AddSendStream(stream2);
2970
2971 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002972 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002973 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2974 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2975 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002976 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2977 EXPECT_EQ(parameters_options_all.options, channel1->options());
2978 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2979 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002980
2981 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002982 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002983 parameters_options_no_ns.options.noise_suppression =
2984 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002985 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2986 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002987 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2988 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2989 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002990 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002991
2992 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002993 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002994 parameters_options_no_agc.options.auto_gain_control =
2995 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002996 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002997 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2998 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2999 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003000 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003001
solenberg246b8172015-12-08 09:50:23 -08003002 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003 bool ec_enabled;
3004 webrtc::EcModes ec_mode;
3005 bool agc_enabled;
3006 webrtc::AgcModes agc_mode;
3007 bool ns_enabled;
3008 webrtc::NsModes ns_mode;
3009 voe_.GetEcStatus(ec_enabled, ec_mode);
3010 voe_.GetAgcStatus(agc_enabled, agc_mode);
3011 voe_.GetNsStatus(ns_enabled, ns_mode);
3012 EXPECT_TRUE(ec_enabled);
3013 EXPECT_TRUE(agc_enabled);
3014 EXPECT_TRUE(ns_enabled);
3015
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003016 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003017 voe_.GetEcStatus(ec_enabled, ec_mode);
3018 voe_.GetAgcStatus(agc_enabled, agc_mode);
3019 voe_.GetNsStatus(ns_enabled, ns_mode);
3020 EXPECT_TRUE(ec_enabled);
3021 EXPECT_TRUE(agc_enabled);
3022 EXPECT_FALSE(ns_enabled);
3023
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003024 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003025 voe_.GetEcStatus(ec_enabled, ec_mode);
3026 voe_.GetAgcStatus(agc_enabled, agc_mode);
3027 voe_.GetNsStatus(ns_enabled, ns_mode);
3028 EXPECT_TRUE(ec_enabled);
3029 EXPECT_FALSE(agc_enabled);
3030 EXPECT_TRUE(ns_enabled);
3031
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003032 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003033 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003034 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3035 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003036 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003037 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003038 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003039 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003040 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003041 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003042 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3043 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3044 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003045 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003046 voe_.GetEcStatus(ec_enabled, ec_mode);
3047 voe_.GetAgcStatus(agc_enabled, agc_mode);
3048 voe_.GetNsStatus(ns_enabled, ns_mode);
3049 EXPECT_TRUE(ec_enabled);
3050 EXPECT_FALSE(agc_enabled);
3051 EXPECT_FALSE(ns_enabled);
3052}
3053
wu@webrtc.orgde305012013-10-31 15:40:38 +00003054// This test verifies DSCP settings are properly applied on voice media channel.
3055TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003056 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003057 cricket::FakeNetworkInterface network_interface;
3058 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003059 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003060
solenbergbc37fc82016-04-04 09:54:44 -07003061 channel.reset(
3062 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003063 channel->SetInterface(&network_interface);
3064 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3065 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3066
3067 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003068 channel.reset(
3069 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003070 channel->SetInterface(&network_interface);
3071 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3072
3073 // Verify that setting the option to false resets the
3074 // DiffServCodePoint.
3075 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003076 channel.reset(
3077 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003078 channel->SetInterface(&network_interface);
3079 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3080 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3081
3082 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003083}
3084
solenberg1ac56142015-10-13 03:58:19 -07003085TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003086 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003087 cricket::WebRtcVoiceMediaChannel* media_channel =
3088 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003089 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3090 EXPECT_TRUE(channel_->AddRecvStream(
3091 cricket::StreamParams::CreateLegacy(kSsrc1)));
3092 int channel_id = voe_.GetLastChannel();
3093 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3094 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3095 EXPECT_TRUE(channel_->AddRecvStream(
3096 cricket::StreamParams::CreateLegacy(kSsrc2)));
3097 int channel_id2 = voe_.GetLastChannel();
3098 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003099}
3100
solenberg1ac56142015-10-13 03:58:19 -07003101TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003102 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003103 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003104 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3105 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3106 EXPECT_TRUE(channel_->AddSendStream(
3107 cricket::StreamParams::CreateLegacy(kSsrc1)));
3108 int channel_id = voe_.GetLastChannel();
3109 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3110 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3111 EXPECT_TRUE(channel_->AddSendStream(
3112 cricket::StreamParams::CreateLegacy(kSsrc2)));
3113 int channel_id2 = voe_.GetLastChannel();
3114 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003115}
3116
solenberg4bac9c52015-10-09 02:32:53 -07003117TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003118 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003119 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003120 cricket::StreamParams stream;
3121 stream.ssrcs.push_back(kSsrc2);
3122 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003123 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003124 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003125 float scale = 0;
3126 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3127 EXPECT_DOUBLE_EQ(3, scale);
3128}
3129
3130TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003131 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003132 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3133 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3134 int channel_id = voe_.GetLastChannel();
3135 float scale = 0;
3136 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3137 EXPECT_DOUBLE_EQ(2, scale);
3138 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003139 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003140 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003141}
3142
pbos8fc7fa72015-07-15 08:02:58 -07003143TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003144 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003145 const std::string kSyncLabel = "AvSyncLabel";
3146
solenbergff976312016-03-30 23:28:51 -07003147 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003148 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3149 sp.sync_label = kSyncLabel;
3150 // Creating two channels to make sure that sync label is set properly for both
3151 // the default voice channel and following ones.
3152 EXPECT_TRUE(channel_->AddRecvStream(sp));
3153 sp.ssrcs[0] += 1;
3154 EXPECT_TRUE(channel_->AddRecvStream(sp));
3155
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003156 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003157 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003158 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003159 << "SyncGroup should be set based on sync_label";
3160 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003161 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003162 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003163}
3164
solenberg3a941542015-11-16 07:34:50 -08003165// TODO(solenberg): Remove, once recv streams are configured through Call.
3166// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003167TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003168 // Test that setting the header extensions results in the expected state
3169 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003170 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003171 ssrcs.push_back(223);
3172 ssrcs.push_back(224);
3173
solenbergff976312016-03-30 23:28:51 -07003174 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003175 cricket::WebRtcVoiceMediaChannel* media_channel =
3176 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003177 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003178 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003179 EXPECT_TRUE(media_channel->AddRecvStream(
3180 cricket::StreamParams::CreateLegacy(ssrc)));
3181 }
3182
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003183 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003184 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003185 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003186 EXPECT_NE(nullptr, s);
3187 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3188 }
3189
3190 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003191 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003192 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003193 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003194 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003195 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003196 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003197 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003198 EXPECT_NE(nullptr, s);
3199 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003200 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3201 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003202 for (const auto& s_ext : s_exts) {
3203 if (e_ext.id == s_ext.id) {
3204 EXPECT_EQ(e_ext.uri, s_ext.name);
3205 }
3206 }
3207 }
3208 }
3209
3210 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003211 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003212 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003213 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003214 EXPECT_NE(nullptr, s);
3215 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3216 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003217}
3218
3219TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3220 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003221 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003222 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003223 static const unsigned char kRtcp[] = {
3224 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3225 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3228 };
jbaucheec21bd2016-03-20 06:15:43 -07003229 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003230
solenbergff976312016-03-30 23:28:51 -07003231 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003232 cricket::WebRtcVoiceMediaChannel* media_channel =
3233 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003234 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003235 EXPECT_TRUE(media_channel->AddRecvStream(
3236 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3237
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003238 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003239 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003240 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003241 EXPECT_EQ(0, s->received_packets());
3242 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3243 EXPECT_EQ(1, s->received_packets());
3244 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3245 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003246}
Minyue2013aec2015-05-13 14:14:42 +02003247
solenberg0a617e22015-10-20 15:49:38 -07003248// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003249// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003250TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003251 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003252 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003253 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003254 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3255 int recv_ch = voe_.GetLastChannel();
3256 EXPECT_NE(recv_ch, default_channel);
3257 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3258 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3259 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003260 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3261 recv_ch = voe_.GetLastChannel();
3262 EXPECT_NE(recv_ch, default_channel);
3263 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003264}
3265
3266TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003267 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003268 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003269
3270 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3271 int recv_ch = voe_.GetLastChannel();
3272
3273 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3274 int send_ch = voe_.GetLastChannel();
3275
3276 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3277 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3278 // channel of |recv_ch|.This is not a common case, since, normally, only the
3279 // default channel can be associated. However, the default is not deletable.
3280 // So we force the |recv_ch| to associate with a non-default channel.
3281 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3282 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3283
3284 EXPECT_TRUE(channel_->RemoveSendStream(2));
3285 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3286}
stefan658910c2015-09-03 05:48:32 -07003287
deadbeef884f5852016-01-15 09:20:04 -08003288TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003289 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003290 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3291 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003292
3293 // Setting the sink before a recv stream exists should do nothing.
3294 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3295 EXPECT_TRUE(
3296 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3297 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3298
3299 // Now try actually setting the sink.
3300 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3301 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3302
3303 // Now try resetting it.
3304 channel_->SetRawAudioSink(kSsrc1, nullptr);
3305 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3306}
3307
3308TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003309 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003310 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3311 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003312
3313 // Should be able to set a default sink even when no stream exists.
3314 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3315
3316 // Create default channel and ensure it's assigned the default sink.
3317 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3318 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3319
3320 // Try resetting the default sink.
3321 channel_->SetRawAudioSink(0, nullptr);
3322 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3323
3324 // Try setting the default sink while the default stream exists.
3325 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3326 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3327
3328 // If we remove and add a default stream, it should get the same sink.
3329 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3330 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3331 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3332}
3333
skvlad7a43d252016-03-22 15:32:27 -07003334// Test that, just like the video channel, the voice channel communicates the
3335// network state to the call.
3336TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003337 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003338
3339 EXPECT_EQ(webrtc::kNetworkUp,
3340 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3341 EXPECT_EQ(webrtc::kNetworkUp,
3342 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3343
3344 channel_->OnReadyToSend(false);
3345 EXPECT_EQ(webrtc::kNetworkDown,
3346 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3347 EXPECT_EQ(webrtc::kNetworkUp,
3348 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3349
3350 channel_->OnReadyToSend(true);
3351 EXPECT_EQ(webrtc::kNetworkUp,
3352 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3353 EXPECT_EQ(webrtc::kNetworkUp,
3354 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3355}
3356
stefan658910c2015-09-03 05:48:32 -07003357// Tests that the library initializes and shuts down properly.
3358TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003359 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003360 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003361 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003362 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3363 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003364 EXPECT_TRUE(channel != nullptr);
3365 delete channel;
solenbergff976312016-03-30 23:28:51 -07003366}
stefan658910c2015-09-03 05:48:32 -07003367
solenbergff976312016-03-30 23:28:51 -07003368// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003369TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3370 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3371 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3372 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003373 {
3374 cricket::WebRtcVoiceEngine engine(&adm);
3375 std::unique_ptr<webrtc::Call> call(
3376 webrtc::Call::Create(webrtc::Call::Config()));
3377 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3378 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3379 EXPECT_TRUE(channel != nullptr);
3380 delete channel;
3381 }
stefan658910c2015-09-03 05:48:32 -07003382}
3383
3384// Tests that the library is configured with the codecs we want.
3385TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003386 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003387 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3388 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3389 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3390 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3391 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3392 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003393 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003394 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3395 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3396 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3397 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3398 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3399 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3400 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3401 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3402 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3403 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3404 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3405 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3406 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3407 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3408 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3409 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3410 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3411 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3412 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3413 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003414 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003415 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3416 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3417 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3418 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3419 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3420 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3421 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3422 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003423 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003424 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3425 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003426 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003427 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3428 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3429 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3430 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3431 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3432 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3433 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3434 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3435 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3436 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3437
stefan658910c2015-09-03 05:48:32 -07003438 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003439 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003440 for (std::vector<cricket::AudioCodec>::const_iterator it =
3441 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3442 if (it->name == "CN" && it->clockrate == 16000) {
3443 EXPECT_EQ(105, it->id);
3444 } else if (it->name == "CN" && it->clockrate == 32000) {
3445 EXPECT_EQ(106, it->id);
3446 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3447 EXPECT_EQ(103, it->id);
3448 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3449 EXPECT_EQ(104, it->id);
3450 } else if (it->name == "G722" && it->clockrate == 8000) {
3451 EXPECT_EQ(9, it->id);
3452 } else if (it->name == "telephone-event") {
3453 EXPECT_EQ(126, it->id);
3454 } else if (it->name == "red") {
3455 EXPECT_EQ(127, it->id);
3456 } else if (it->name == "opus") {
3457 EXPECT_EQ(111, it->id);
3458 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3459 EXPECT_EQ("10", it->params.find("minptime")->second);
3460 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3461 EXPECT_EQ("60", it->params.find("maxptime")->second);
3462 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3463 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3464 }
3465 }
stefan658910c2015-09-03 05:48:32 -07003466}
3467
3468// Tests that VoE supports at least 32 channels
3469TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003470 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003471 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003472 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003473
3474 cricket::VoiceMediaChannel* channels[32];
3475 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003476 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003477 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3478 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003479 if (!channel)
3480 break;
stefan658910c2015-09-03 05:48:32 -07003481 channels[num_channels++] = channel;
3482 }
3483
tfarina5237aaf2015-11-10 23:44:30 -08003484 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003485 EXPECT_EQ(expected, num_channels);
3486
3487 while (num_channels > 0) {
3488 delete channels[--num_channels];
3489 }
stefan658910c2015-09-03 05:48:32 -07003490}
3491
3492// Test that we set our preferred codecs properly.
3493TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003494 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003495 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003496 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003497 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3498 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003499 cricket::AudioRecvParameters parameters;
3500 parameters.codecs = engine.codecs();
3501 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003502}