blob: 9f9ab47242df5f784e6926cac4862c1f035a699d [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakenetworkinterface.h"
22#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080023#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
solenbergbc37fc82016-04-04 09:54:44 -070027#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000029using cricket::kRtpAudioLevelHeaderExtension;
30using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
deadbeef67cf2c12016-04-13 10:07:16 -070036const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
44const cricket::AudioCodec kTelephoneEventCodec(106,
45 "telephone-event",
46 8000,
47 0,
48 1);
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080050const uint32_t kSsrc2 = 2;
51const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070052const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053
54class FakeVoEWrapper : public cricket::VoEWrapper {
55 public:
56 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
57 : cricket::VoEWrapper(engine, // processing
58 engine, // base
59 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine, // network
62 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 engine) { // volume
64 }
65};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020066} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067
solenbergff976312016-03-30 23:28:51 -070068// Tests that our stub library "works".
69TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070070 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
71 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
72 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070073 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
75 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070076 cricket::FakeWebRtcVoiceEngine voe;
77 EXPECT_FALSE(voe.IsInited());
78 {
solenbergbc37fc82016-04-04 09:54:44 -070079 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070080 EXPECT_TRUE(voe.IsInited());
81 }
82 EXPECT_FALSE(voe.IsInited());
83}
84
deadbeef884f5852016-01-15 09:20:04 -080085class FakeAudioSink : public webrtc::AudioSinkInterface {
86 public:
87 void OnData(const Data& audio) override {}
88};
89
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080090class FakeAudioSource : public cricket::AudioSource {
91 void SetSink(Sink* sink) override {}
92};
93
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094class WebRtcVoiceEngineTestFake : public testing::Test {
95 public:
stefanba4c0e42016-02-04 04:12:24 -080096 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
97
98 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070099 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
100 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
101 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700102 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
103 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
104 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergbc37fc82016-04-04 09:54:44 -0700105 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
106 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200107 send_parameters_.codecs.push_back(kPcmuCodec);
108 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109 }
solenbergff976312016-03-30 23:28:51 -0700110 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700111 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
112 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200113 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000114 }
solenbergff976312016-03-30 23:28:51 -0700115 bool SetupRecvStream() {
116 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700117 return false;
118 }
119 return channel_->AddRecvStream(
120 cricket::StreamParams::CreateLegacy(kSsrc1));
121 }
solenbergff976312016-03-30 23:28:51 -0700122 bool SetupSendStream() {
123 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000124 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800126 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
127 return false;
128 }
129 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000131 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700132 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700133 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800134 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700135 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700136 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800137 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000138 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700140 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000141 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200143 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000145 }
146
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100147 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
148 const auto* send_stream = call_.GetAudioSendStream(ssrc);
149 EXPECT_TRUE(send_stream);
150 return *send_stream;
151 }
152
deadbeef884f5852016-01-15 09:20:04 -0800153 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
154 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
155 EXPECT_TRUE(recv_stream);
156 return *recv_stream;
157 }
158
solenberg3a941542015-11-16 07:34:50 -0800159 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800160 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800161 }
162
solenberg7add0582015-11-20 09:59:34 -0800163 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800164 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800165 }
166
solenbergd53a3f92016-04-14 13:56:37 -0700167 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
168 ASSERT_TRUE(channel);
169 if (enable) {
170 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
171 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
172 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
173 }
174 channel->SetSend(enable);
175 }
176
Peter Boström0c4e06b2015-10-07 12:23:21 +0200177 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700178 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000179 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700180 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000181 // send stream.
182 EXPECT_TRUE(channel_->AddSendStream(
183 cricket::StreamParams::CreateLegacy(kSsrc1)));
184 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000185
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200187 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700188 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800190 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200191 send_parameters_.codecs.push_back(kTelephoneEventCodec);
192 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000193 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000194
195 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700196 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800197 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000198 EXPECT_TRUE(channel_->AddSendStream(
199 cricket::StreamParams::CreateLegacy(kSsrc1)));
200 }
201
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800203 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100205 // Test send.
206 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
207 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
208 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800209 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100210 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
211 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
212 EXPECT_EQ(2, telephone_event.event_code);
213 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000214 }
215
216 // Test that send bandwidth is set correctly.
217 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000218 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
219 // |expected_result| is the expected result from SetMaxSendBandwidth().
220 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700221 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
222 int max_bitrate,
223 bool expected_result,
224 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200225 cricket::AudioSendParameters parameters;
226 parameters.codecs.push_back(codec);
227 parameters.max_bandwidth_bps = max_bitrate;
228 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
229
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000231 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000233 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 }
235
skvlade0d46372016-04-07 22:59:22 -0700236 // Sets the per-stream maximum bitrate limit for the specified SSRC.
237 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
238 webrtc::RtpParameters parameters = channel_->GetRtpParameters(ssrc);
239 EXPECT_EQ(1UL, parameters.encodings.size());
240
241 parameters.encodings[0].max_bitrate_bps = bitrate;
242 return channel_->SetRtpParameters(ssrc, parameters);
243 }
244
245 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
246 cricket::AudioSendParameters send_parameters;
247 send_parameters.codecs.push_back(codec);
248 send_parameters.max_bandwidth_bps = bitrate;
249 return channel_->SetSendParameters(send_parameters);
250 }
251
252 int GetCodecBitrate(int32_t ssrc) {
253 cricket::WebRtcVoiceMediaChannel* media_channel =
254 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
255 int channel = media_channel->GetSendChannelId(ssrc);
256 EXPECT_NE(-1, channel);
257 webrtc::CodecInst codec;
258 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
259 return codec.rate;
260 }
261
262 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
263 int global_max,
264 int stream_max,
265 bool expected_result,
266 int expected_codec_bitrate) {
267 // Clear the bitrate limit from the previous test case.
268 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
269
270 // Attempt to set the requested bitrate limits.
271 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
272 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
273
274 // Verify that reading back the parameters gives results
275 // consistent with the Set() result.
276 webrtc::RtpParameters resulting_parameters =
277 channel_->GetRtpParameters(kSsrc1);
278 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
279 EXPECT_EQ(expected_result ? stream_max : -1,
280 resulting_parameters.encodings[0].max_bitrate_bps);
281
282 // Verify that the codec settings have the expected bitrate.
283 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
284 }
285
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000286 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700287 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000288
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000289 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800290 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000291
292 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200293 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000294 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200295 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800296 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000297
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000298 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200299 send_parameters_.extensions.clear();
300 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800301 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000302
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000303 // Ensure extension is set properly.
304 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200305 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
306 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800307 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
308 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
309 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000310
solenberg7add0582015-11-20 09:59:34 -0800311 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000312 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700313 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800314 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
315 call_.GetAudioSendStream(kSsrc2));
316 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
317 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
318 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000319
320 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200321 send_parameters_.codecs.push_back(kPcmuCodec);
322 send_parameters_.extensions.clear();
323 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800324 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
325 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000326 }
327
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000328 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700329 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000330
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000331 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800332 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000333
334 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800335 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000336 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800337 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
338 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000339
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000340 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800341 recv_parameters_.extensions.clear();
342 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
343 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000344
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000345 // Ensure extension is set properly.
346 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800347 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
348 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
349 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
350 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
351 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000352
solenberg7add0582015-11-20 09:59:34 -0800353 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000354 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700355 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800356 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
357 call_.GetAudioReceiveStream(kSsrc2));
358 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
359 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
360 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000361
362 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800363 recv_parameters_.extensions.clear();
364 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
365 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
366 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000367 }
368
solenberg85a04962015-10-27 03:35:21 -0700369 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
370 webrtc::AudioSendStream::Stats stats;
371 stats.local_ssrc = 12;
372 stats.bytes_sent = 345;
373 stats.packets_sent = 678;
374 stats.packets_lost = 9012;
375 stats.fraction_lost = 34.56f;
376 stats.codec_name = "codec_name_send";
377 stats.ext_seqnum = 789;
378 stats.jitter_ms = 12;
379 stats.rtt_ms = 345;
380 stats.audio_level = 678;
381 stats.aec_quality_min = 9.01f;
382 stats.echo_delay_median_ms = 234;
383 stats.echo_delay_std_ms = 567;
384 stats.echo_return_loss = 890;
385 stats.echo_return_loss_enhancement = 1234;
386 stats.typing_noise_detected = true;
387 return stats;
388 }
389 void SetAudioSendStreamStats() {
390 for (auto* s : call_.GetAudioSendStreams()) {
391 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200392 }
solenberg85a04962015-10-27 03:35:21 -0700393 }
solenberg566ef242015-11-06 15:34:49 -0800394 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
395 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700396 const auto stats = GetAudioSendStreamStats();
397 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
398 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
399 EXPECT_EQ(info.packets_sent, stats.packets_sent);
400 EXPECT_EQ(info.packets_lost, stats.packets_lost);
401 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
402 EXPECT_EQ(info.codec_name, stats.codec_name);
403 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
404 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
405 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
406 EXPECT_EQ(info.audio_level, stats.audio_level);
407 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
408 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
409 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
410 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
411 EXPECT_EQ(info.echo_return_loss_enhancement,
412 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800413 EXPECT_EQ(info.typing_noise_detected,
414 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700415 }
416
417 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
418 webrtc::AudioReceiveStream::Stats stats;
419 stats.remote_ssrc = 123;
420 stats.bytes_rcvd = 456;
421 stats.packets_rcvd = 768;
422 stats.packets_lost = 101;
423 stats.fraction_lost = 23.45f;
424 stats.codec_name = "codec_name_recv";
425 stats.ext_seqnum = 678;
426 stats.jitter_ms = 901;
427 stats.jitter_buffer_ms = 234;
428 stats.jitter_buffer_preferred_ms = 567;
429 stats.delay_estimate_ms = 890;
430 stats.audio_level = 1234;
431 stats.expand_rate = 5.67f;
432 stats.speech_expand_rate = 8.90f;
433 stats.secondary_decoded_rate = 1.23f;
434 stats.accelerate_rate = 4.56f;
435 stats.preemptive_expand_rate = 7.89f;
436 stats.decoding_calls_to_silence_generator = 12;
437 stats.decoding_calls_to_neteq = 345;
438 stats.decoding_normal = 67890;
439 stats.decoding_plc = 1234;
440 stats.decoding_cng = 5678;
441 stats.decoding_plc_cng = 9012;
442 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200443 return stats;
444 }
445 void SetAudioReceiveStreamStats() {
446 for (auto* s : call_.GetAudioReceiveStreams()) {
447 s->SetStats(GetAudioReceiveStreamStats());
448 }
449 }
450 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700451 const auto stats = GetAudioReceiveStreamStats();
452 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
453 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
454 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
455 EXPECT_EQ(info.packets_lost, stats.packets_lost);
456 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
457 EXPECT_EQ(info.codec_name, stats.codec_name);
458 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
459 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
460 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200461 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700462 stats.jitter_buffer_preferred_ms);
463 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
464 EXPECT_EQ(info.audio_level, stats.audio_level);
465 EXPECT_EQ(info.expand_rate, stats.expand_rate);
466 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
467 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
468 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
469 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200470 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700471 stats.decoding_calls_to_silence_generator);
472 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
473 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
474 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
475 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
476 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
477 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200478 }
479
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700481 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200482 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700484 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700485 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200486 cricket::AudioSendParameters send_parameters_;
487 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800488 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800489 private:
490 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491};
492
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493// Tests that we can create and destroy a channel.
494TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700495 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496}
497
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000498// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700499// correctly (such that opus appears first).
500TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700501 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502 ASSERT_FALSE(codecs.empty());
503 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
504 EXPECT_EQ(48000, codecs[0].clockrate);
505 EXPECT_EQ(2, codecs[0].channels);
506 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507}
508
stefanba4c0e42016-02-04 04:12:24 -0800509TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700510 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800511 bool opus_found = false;
512 for (cricket::AudioCodec codec : codecs) {
513 if (codec.name == "opus") {
514 EXPECT_TRUE(HasTransportCc(codec));
515 opus_found = true;
516 }
517 }
518 EXPECT_TRUE(opus_found);
519}
520
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000521// Tests that we can find codecs by name or id, and that we interpret the
522// clockrate and bitrate fields properly.
523TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
524 cricket::AudioCodec codec;
525 webrtc::CodecInst codec_inst;
526 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800527 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800529 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800531 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
532 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000533 // Find ISAC with a different payload id.
534 codec = kIsacCodec;
535 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800536 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 EXPECT_EQ(codec.id, codec_inst.pltype);
538 // Find PCMU with a 0 clockrate.
539 codec = kPcmuCodec;
540 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800541 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000542 EXPECT_EQ(codec.id, codec_inst.pltype);
543 EXPECT_EQ(8000, codec_inst.plfreq);
544 // Find PCMU with a 0 bitrate.
545 codec = kPcmuCodec;
546 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800547 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 EXPECT_EQ(codec.id, codec_inst.pltype);
549 EXPECT_EQ(64000, codec_inst.rate);
550 // Find ISAC with an explicit bitrate.
551 codec = kIsacCodec;
552 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800553 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 EXPECT_EQ(codec.id, codec_inst.pltype);
555 EXPECT_EQ(32000, codec_inst.rate);
556}
557
558// Test that we set our inbound codecs properly, including changing PT.
559TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700560 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200561 cricket::AudioRecvParameters parameters;
562 parameters.codecs.push_back(kIsacCodec);
563 parameters.codecs.push_back(kPcmuCodec);
564 parameters.codecs.push_back(kTelephoneEventCodec);
565 parameters.codecs[0].id = 106; // collide with existing telephone-event
566 parameters.codecs[2].id = 126;
567 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700568 EXPECT_TRUE(channel_->AddRecvStream(
569 cricket::StreamParams::CreateLegacy(kSsrc1)));
570 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800572 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 gcodec.plfreq = 16000;
574 gcodec.channels = 1;
575 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
576 EXPECT_EQ(106, gcodec.pltype);
577 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800578 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 gcodec.plfreq = 8000;
580 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
581 EXPECT_EQ(126, gcodec.pltype);
582 EXPECT_STREQ("telephone-event", gcodec.plname);
583}
584
585// Test that we fail to set an unknown inbound codec.
586TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700587 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200588 cricket::AudioRecvParameters parameters;
589 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700590 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200591 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592}
593
594// Test that we fail if we have duplicate types in the inbound list.
595TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700596 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200597 cricket::AudioRecvParameters parameters;
598 parameters.codecs.push_back(kIsacCodec);
599 parameters.codecs.push_back(kCn16000Codec);
600 parameters.codecs[1].id = kIsacCodec.id;
601 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602}
603
604// Test that we can decode OPUS without stereo parameters.
605TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700606 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200607 cricket::AudioRecvParameters parameters;
608 parameters.codecs.push_back(kIsacCodec);
609 parameters.codecs.push_back(kPcmuCodec);
610 parameters.codecs.push_back(kOpusCodec);
611 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 EXPECT_TRUE(channel_->AddRecvStream(
613 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700614 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800616 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 // Even without stereo parameters, recv codecs still specify channels = 2.
618 EXPECT_EQ(2, opus.channels);
619 EXPECT_EQ(111, opus.pltype);
620 EXPECT_STREQ("opus", opus.plname);
621 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700622 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 EXPECT_EQ(111, opus.pltype);
624}
625
626// Test that we can decode OPUS with stereo = 0.
627TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700628 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200629 cricket::AudioRecvParameters parameters;
630 parameters.codecs.push_back(kIsacCodec);
631 parameters.codecs.push_back(kPcmuCodec);
632 parameters.codecs.push_back(kOpusCodec);
633 parameters.codecs[2].params["stereo"] = "0";
634 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 EXPECT_TRUE(channel_->AddRecvStream(
636 cricket::StreamParams::CreateLegacy(kSsrc1)));
637 int channel_num2 = voe_.GetLastChannel();
638 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800639 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 // Even when stereo is off, recv codecs still specify channels = 2.
641 EXPECT_EQ(2, opus.channels);
642 EXPECT_EQ(111, opus.pltype);
643 EXPECT_STREQ("opus", opus.plname);
644 opus.pltype = 0;
645 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
646 EXPECT_EQ(111, opus.pltype);
647}
648
649// Test that we can decode OPUS with stereo = 1.
650TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700651 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652 cricket::AudioRecvParameters parameters;
653 parameters.codecs.push_back(kIsacCodec);
654 parameters.codecs.push_back(kPcmuCodec);
655 parameters.codecs.push_back(kOpusCodec);
656 parameters.codecs[2].params["stereo"] = "1";
657 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 EXPECT_TRUE(channel_->AddRecvStream(
659 cricket::StreamParams::CreateLegacy(kSsrc1)));
660 int channel_num2 = voe_.GetLastChannel();
661 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800662 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 EXPECT_EQ(2, opus.channels);
664 EXPECT_EQ(111, opus.pltype);
665 EXPECT_STREQ("opus", opus.plname);
666 opus.pltype = 0;
667 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
668 EXPECT_EQ(111, opus.pltype);
669}
670
671// Test that changes to recv codecs are applied to all streams.
672TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700673 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200674 cricket::AudioRecvParameters parameters;
675 parameters.codecs.push_back(kIsacCodec);
676 parameters.codecs.push_back(kPcmuCodec);
677 parameters.codecs.push_back(kTelephoneEventCodec);
678 parameters.codecs[0].id = 106; // collide with existing telephone-event
679 parameters.codecs[2].id = 126;
680 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 EXPECT_TRUE(channel_->AddRecvStream(
682 cricket::StreamParams::CreateLegacy(kSsrc1)));
683 int channel_num2 = voe_.GetLastChannel();
684 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800685 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 gcodec.plfreq = 16000;
687 gcodec.channels = 1;
688 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
689 EXPECT_EQ(106, gcodec.pltype);
690 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800691 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 gcodec.plfreq = 8000;
693 gcodec.channels = 1;
694 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
695 EXPECT_EQ(126, gcodec.pltype);
696 EXPECT_STREQ("telephone-event", gcodec.plname);
697}
698
699TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700700 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200701 cricket::AudioRecvParameters parameters;
702 parameters.codecs.push_back(kIsacCodec);
703 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200704 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705
706 int channel_num2 = voe_.GetLastChannel();
707 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800708 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 gcodec.plfreq = 16000;
710 gcodec.channels = 1;
711 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
712 EXPECT_EQ(106, gcodec.pltype);
713 EXPECT_STREQ("ISAC", gcodec.plname);
714}
715
716// Test that we can apply the same set of codecs again while playing.
717TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700718 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200719 cricket::AudioRecvParameters parameters;
720 parameters.codecs.push_back(kIsacCodec);
721 parameters.codecs.push_back(kCn16000Codec);
722 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200724 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725
726 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200727 parameters.codecs[0].id = 127;
728 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
729 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 EXPECT_TRUE(voe_.GetPlayout(channel_num));
731}
732
733// Test that we can add a codec while playing.
734TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700735 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200736 cricket::AudioRecvParameters parameters;
737 parameters.codecs.push_back(kIsacCodec);
738 parameters.codecs.push_back(kCn16000Codec);
739 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_TRUE(channel_->SetPlayout(true));
741
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200742 parameters.codecs.push_back(kOpusCodec);
743 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
744 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745 EXPECT_TRUE(voe_.GetPlayout(channel_num));
746 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800747 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
749}
750
751TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700752 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000754 // Test that when autobw is enabled, bitrate is kept as the default
755 // value. autobw is enabled for the following tests because the target
756 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757
758 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700759 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760
761 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700762 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700765 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766}
767
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000768TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700769 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000771 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772
773 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700774 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
775 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
776 // Rates above the max (56000) should be capped.
777 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700780 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
781 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
782 // Rates above the max (510000) should be capped.
783 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784}
785
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000786TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700787 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000788
789 // Test that we can only set a maximum bitrate for a fixed-rate codec
790 // if it's bigger than the fixed rate.
791
792 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700793 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
794 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
795 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
796 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
797 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
798 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
799 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000800}
801
802TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700803 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200804 const int kDesiredBitrate = 128000;
805 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700806 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200807 parameters.max_bandwidth_bps = kDesiredBitrate;
808 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000809
810 EXPECT_TRUE(channel_->AddSendStream(
811 cricket::StreamParams::CreateLegacy(kSsrc1)));
812
813 int channel_num = voe_.GetLastChannel();
814 webrtc::CodecInst codec;
815 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200816 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000817}
818
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000819// Test that bitrate cannot be set for CBR codecs.
820// Bitrate is ignored if it is higher than the fixed bitrate.
821// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000822TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700823 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824
825 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200826 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
827 int channel_num = voe_.GetLastChannel();
828 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000829 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
830 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200831
832 send_parameters_.max_bandwidth_bps = 128000;
833 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
835 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200836
837 send_parameters_.max_bandwidth_bps = 128;
838 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
840 EXPECT_EQ(64000, codec.rate);
841}
842
skvlade0d46372016-04-07 22:59:22 -0700843// Test that the per-stream bitrate limit and the global
844// bitrate limit both apply.
845TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
846 EXPECT_TRUE(SetupSendStream());
847
848 // opus, default bitrate == 64000.
849 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
850 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
851 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
852 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
853
854 // CBR codecs allow both maximums to exceed the bitrate.
855 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
856 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
857 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
858 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
859
860 // CBR codecs don't allow per stream maximums to be too low.
861 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
862 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
863}
864
865// Test that an attempt to set RtpParameters for a stream that does not exist
866// fails.
867TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
868 EXPECT_TRUE(SetupChannel());
869 webrtc::RtpParameters nonexistent_parameters =
870 channel_->GetRtpParameters(kSsrc1);
871 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
872
873 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
874 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, nonexistent_parameters));
875}
876
877TEST_F(WebRtcVoiceEngineTestFake,
878 CannotSetRtpParametersWithIncorrectNumberOfEncodings) {
879 // This test verifies that setting RtpParameters succeeds only if
880 // the structure contains exactly one encoding.
881 // TODO(skvlad): Update this test when we start supporting setting parameters
882 // for each encoding individually.
883
884 EXPECT_TRUE(SetupSendStream());
885 // Setting RtpParameters with no encoding is expected to fail.
886 webrtc::RtpParameters parameters;
887 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
888 // Setting RtpParameters with exactly one encoding should succeed.
889 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
890 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
891 // Two or more encodings should result in failure.
892 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
893 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
894}
895
896// Test that SetRtpParameters configures the correct encoding channel for each
897// SSRC.
898TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
899 SetupForMultiSendStream();
900 // Create send streams.
901 for (uint32_t ssrc : kSsrcs4) {
902 EXPECT_TRUE(
903 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
904 }
905 // Configure one stream to be limited by the stream config, another to be
906 // limited by the global max, and the third one with no per-stream limit
907 // (still subject to the global limit).
908 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
909 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
910 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
911 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
912
913 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
914 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
915 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
916
917 // Remove the global cap; the streams should switch to their respective
918 // maximums (or remain unchanged if there was no other limit on them.)
919 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
920 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
921 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
922 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
923}
924
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700925// Test that GetRtpParameters returns the currently configured codecs.
926TEST_F(WebRtcVoiceEngineTestFake, GetRtpParametersCodecs) {
927 EXPECT_TRUE(SetupSendStream());
928 cricket::AudioSendParameters parameters;
929 parameters.codecs.push_back(kIsacCodec);
930 parameters.codecs.push_back(kPcmuCodec);
931 EXPECT_TRUE(channel_->SetSendParameters(parameters));
932
933 webrtc::RtpParameters rtp_parameters = channel_->GetRtpParameters(kSsrc1);
934 ASSERT_EQ(2u, rtp_parameters.codecs.size());
935 EXPECT_EQ(kIsacCodec.id, rtp_parameters.codecs[0].payload_type);
936 EXPECT_EQ(kIsacCodec.name, rtp_parameters.codecs[0].mime_type);
937 EXPECT_EQ(kIsacCodec.clockrate, rtp_parameters.codecs[0].clock_rate);
938 EXPECT_EQ(kIsacCodec.channels, rtp_parameters.codecs[0].channels);
939 EXPECT_EQ(kPcmuCodec.id, rtp_parameters.codecs[1].payload_type);
940 EXPECT_EQ(kPcmuCodec.name, rtp_parameters.codecs[1].mime_type);
941 EXPECT_EQ(kPcmuCodec.clockrate, rtp_parameters.codecs[1].clock_rate);
942 EXPECT_EQ(kPcmuCodec.channels, rtp_parameters.codecs[1].channels);
943}
944
945// Test that if we set/get parameters multiple times, we get the same results.
946TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpParameters) {
947 EXPECT_TRUE(SetupSendStream());
948 cricket::AudioSendParameters parameters;
949 parameters.codecs.push_back(kIsacCodec);
950 parameters.codecs.push_back(kPcmuCodec);
951 EXPECT_TRUE(channel_->SetSendParameters(parameters));
952
953 webrtc::RtpParameters initial_params = channel_->GetRtpParameters(kSsrc1);
954
955 // We should be able to set the params we just got.
956 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, initial_params));
957
958 // ... And this shouldn't change the params returned by GetRtpParameters.
959 webrtc::RtpParameters new_params = channel_->GetRtpParameters(kSsrc1);
960 EXPECT_EQ(initial_params, channel_->GetRtpParameters(kSsrc1));
961}
962
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000963// Test that we apply codecs properly.
964TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700965 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200966 cricket::AudioSendParameters parameters;
967 parameters.codecs.push_back(kIsacCodec);
968 parameters.codecs.push_back(kPcmuCodec);
969 parameters.codecs.push_back(kRedCodec);
970 parameters.codecs[0].id = 96;
971 parameters.codecs[0].bitrate = 48000;
972 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000973 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200974 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975 webrtc::CodecInst gcodec;
976 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
977 EXPECT_EQ(96, gcodec.pltype);
978 EXPECT_EQ(48000, gcodec.rate);
979 EXPECT_STREQ("ISAC", gcodec.plname);
980 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000981 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000982 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
983 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100984 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985}
986
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000987// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
988// to apply.
989TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700990 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200991 cricket::AudioSendParameters parameters;
992 parameters.codecs.push_back(kIsacCodec);
993 parameters.codecs.push_back(kPcmuCodec);
994 parameters.codecs.push_back(kRedCodec);
995 parameters.codecs[0].id = 96;
996 parameters.codecs[0].bitrate = 48000;
997 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000998 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
999 // Calling SetSendCodec again with same codec which is already set.
1000 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001001 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001002 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1003}
1004
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001005// Verify that G722 is set with 16000 samples per second to WebRTC.
1006TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001007 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001008 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001009 cricket::AudioSendParameters parameters;
1010 parameters.codecs.push_back(kG722CodecSdp);
1011 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001012 webrtc::CodecInst gcodec;
1013 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1014 EXPECT_STREQ("G722", gcodec.plname);
1015 EXPECT_EQ(1, gcodec.channels);
1016 EXPECT_EQ(16000, gcodec.plfreq);
1017}
1018
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001019// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001021 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001022 cricket::AudioSendParameters parameters;
1023 parameters.codecs.push_back(kOpusCodec);
1024 parameters.codecs[0].bitrate = 0;
1025 parameters.codecs[0].clockrate = 50000;
1026 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027}
1028
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001029// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001031 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001032 cricket::AudioSendParameters parameters;
1033 parameters.codecs.push_back(kOpusCodec);
1034 parameters.codecs[0].bitrate = 0;
1035 parameters.codecs[0].channels = 0;
1036 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001037}
1038
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001039// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001041 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001042 cricket::AudioSendParameters parameters;
1043 parameters.codecs.push_back(kOpusCodec);
1044 parameters.codecs[0].bitrate = 0;
1045 parameters.codecs[0].channels = 0;
1046 parameters.codecs[0].params["stereo"] = "1";
1047 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001048}
1049
1050// Test that if channel is 1 for opus and there's no stereo, we fail.
1051TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001052 EXPECT_TRUE(SetupSendStream());
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].channels = 1;
1057 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001058}
1059
1060// Test that if channel is 1 for opus and stereo=0, we fail.
1061TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001062 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001063 cricket::AudioSendParameters parameters;
1064 parameters.codecs.push_back(kOpusCodec);
1065 parameters.codecs[0].bitrate = 0;
1066 parameters.codecs[0].channels = 1;
1067 parameters.codecs[0].params["stereo"] = "0";
1068 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001069}
1070
1071// Test that if channel is 1 for opus and stereo=1, we fail.
1072TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001073 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001074 cricket::AudioSendParameters parameters;
1075 parameters.codecs.push_back(kOpusCodec);
1076 parameters.codecs[0].bitrate = 0;
1077 parameters.codecs[0].channels = 1;
1078 parameters.codecs[0].params["stereo"] = "1";
1079 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080}
1081
1082// Test that with bitrate=0 and no stereo,
1083// channels and bitrate are 1 and 32000.
1084TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001085 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001087 cricket::AudioSendParameters parameters;
1088 parameters.codecs.push_back(kOpusCodec);
1089 parameters.codecs[0].bitrate = 0;
1090 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 webrtc::CodecInst gcodec;
1092 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1093 EXPECT_STREQ("opus", gcodec.plname);
1094 EXPECT_EQ(1, gcodec.channels);
1095 EXPECT_EQ(32000, gcodec.rate);
1096}
1097
1098// Test that with bitrate=0 and stereo=0,
1099// channels and bitrate are 1 and 32000.
1100TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001101 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001103 cricket::AudioSendParameters parameters;
1104 parameters.codecs.push_back(kOpusCodec);
1105 parameters.codecs[0].bitrate = 0;
1106 parameters.codecs[0].params["stereo"] = "0";
1107 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 webrtc::CodecInst gcodec;
1109 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1110 EXPECT_STREQ("opus", gcodec.plname);
1111 EXPECT_EQ(1, gcodec.channels);
1112 EXPECT_EQ(32000, gcodec.rate);
1113}
1114
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001115// Test that with bitrate=invalid and stereo=0,
1116// channels and bitrate are 1 and 32000.
1117TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001118 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001119 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001120 cricket::AudioSendParameters parameters;
1121 parameters.codecs.push_back(kOpusCodec);
1122 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001123 webrtc::CodecInst gcodec;
1124
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001125 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001126 parameters.codecs[0].bitrate = 5999;
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(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001131 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001132
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001133 parameters.codecs[0].bitrate = 510001;
1134 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001135 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1136 EXPECT_STREQ("opus", gcodec.plname);
1137 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001138 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001139}
1140
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001141// Test that with bitrate=0 and stereo=1,
1142// channels and bitrate are 2 and 64000.
1143TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001144 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001145 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001146 cricket::AudioSendParameters parameters;
1147 parameters.codecs.push_back(kOpusCodec);
1148 parameters.codecs[0].bitrate = 0;
1149 parameters.codecs[0].params["stereo"] = "1";
1150 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001151 webrtc::CodecInst gcodec;
1152 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1153 EXPECT_STREQ("opus", gcodec.plname);
1154 EXPECT_EQ(2, gcodec.channels);
1155 EXPECT_EQ(64000, gcodec.rate);
1156}
1157
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001158// Test that with bitrate=invalid and stereo=1,
1159// channels and bitrate are 2 and 64000.
1160TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001161 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001162 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001163 cricket::AudioSendParameters parameters;
1164 parameters.codecs.push_back(kOpusCodec);
1165 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001166 webrtc::CodecInst gcodec;
1167
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001168 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001169 parameters.codecs[0].bitrate = 5999;
1170 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001171 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1172 EXPECT_STREQ("opus", gcodec.plname);
1173 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001174 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001175
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001176 parameters.codecs[0].bitrate = 510001;
1177 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001178 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1179 EXPECT_STREQ("opus", gcodec.plname);
1180 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001181 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001182}
1183
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184// Test that with bitrate=N and stereo unset,
1185// channels and bitrate are 1 and N.
1186TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001187 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001189 cricket::AudioSendParameters parameters;
1190 parameters.codecs.push_back(kOpusCodec);
1191 parameters.codecs[0].bitrate = 96000;
1192 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001193 webrtc::CodecInst gcodec;
1194 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1195 EXPECT_EQ(111, gcodec.pltype);
1196 EXPECT_EQ(96000, gcodec.rate);
1197 EXPECT_STREQ("opus", gcodec.plname);
1198 EXPECT_EQ(1, gcodec.channels);
1199 EXPECT_EQ(48000, gcodec.plfreq);
1200}
1201
1202// Test that with bitrate=N and stereo=0,
1203// channels and bitrate are 1 and N.
1204TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001205 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001207 cricket::AudioSendParameters parameters;
1208 parameters.codecs.push_back(kOpusCodec);
1209 parameters.codecs[0].bitrate = 30000;
1210 parameters.codecs[0].params["stereo"] = "0";
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001212 webrtc::CodecInst gcodec;
1213 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1214 EXPECT_EQ(1, gcodec.channels);
1215 EXPECT_EQ(30000, gcodec.rate);
1216 EXPECT_STREQ("opus", gcodec.plname);
1217}
1218
1219// Test that with bitrate=N and without any parameters,
1220// channels and bitrate are 1 and N.
1221TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001222 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001223 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001224 cricket::AudioSendParameters parameters;
1225 parameters.codecs.push_back(kOpusCodec);
1226 parameters.codecs[0].bitrate = 30000;
1227 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 webrtc::CodecInst gcodec;
1229 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1230 EXPECT_EQ(1, gcodec.channels);
1231 EXPECT_EQ(30000, gcodec.rate);
1232 EXPECT_STREQ("opus", gcodec.plname);
1233}
1234
1235// Test that with bitrate=N and stereo=1,
1236// channels and bitrate are 2 and N.
1237TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001238 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001240 cricket::AudioSendParameters parameters;
1241 parameters.codecs.push_back(kOpusCodec);
1242 parameters.codecs[0].bitrate = 30000;
1243 parameters.codecs[0].params["stereo"] = "1";
1244 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001245 webrtc::CodecInst gcodec;
1246 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1247 EXPECT_EQ(2, gcodec.channels);
1248 EXPECT_EQ(30000, gcodec.rate);
1249 EXPECT_STREQ("opus", gcodec.plname);
1250}
1251
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001252// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1253// Also test that the "maxaveragebitrate" can't be set to values outside the
1254// range of 6000 and 510000
1255TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001256 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001257 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001258 cricket::AudioSendParameters parameters;
1259 parameters.codecs.push_back(kOpusCodec);
1260 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001261 webrtc::CodecInst gcodec;
1262
1263 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001264 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1265 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001266 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001267 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001268
1269 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001270 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1271 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001272 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001273 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001274
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001275 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1276 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001277 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1278 EXPECT_EQ(200000, gcodec.rate);
1279}
1280
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001281// Test that we can enable NACK with opus as caller.
1282TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
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));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001290 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001291 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001292 EXPECT_TRUE(voe_.GetNACK(channel_num));
1293}
1294
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001295// Test that we can enable NACK with opus as callee.
1296TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001297 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001298 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001299 cricket::AudioSendParameters parameters;
1300 parameters.codecs.push_back(kOpusCodec);
1301 parameters.codecs[0].AddFeedbackParam(
1302 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1303 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001304 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001305 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001306 EXPECT_FALSE(voe_.GetNACK(channel_num));
1307
1308 EXPECT_TRUE(channel_->AddSendStream(
1309 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001310 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001311}
1312
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001313// Test that we can enable NACK on receive streams.
1314TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001315 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001316 int channel_num1 = voe_.GetLastChannel();
1317 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1318 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 cricket::AudioSendParameters parameters;
1320 parameters.codecs.push_back(kOpusCodec);
1321 parameters.codecs[0].AddFeedbackParam(
1322 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1323 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1325 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001326 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1328 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1329}
1330
1331// Test that we can disable NACK.
1332TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001333 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001334 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 cricket::AudioSendParameters parameters;
1336 parameters.codecs.push_back(kOpusCodec);
1337 parameters.codecs[0].AddFeedbackParam(
1338 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1339 cricket::kParamValueEmpty));
1340 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001341 EXPECT_TRUE(voe_.GetNACK(channel_num));
1342
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 parameters.codecs.clear();
1344 parameters.codecs.push_back(kOpusCodec);
1345 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001346 EXPECT_FALSE(voe_.GetNACK(channel_num));
1347}
1348
1349// Test that we can disable NACK on receive streams.
1350TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001351 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352 int channel_num1 = voe_.GetLastChannel();
1353 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1354 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001355 cricket::AudioSendParameters parameters;
1356 parameters.codecs.push_back(kOpusCodec);
1357 parameters.codecs[0].AddFeedbackParam(
1358 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1359 cricket::kParamValueEmpty));
1360 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1362 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1363
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001364 parameters.codecs.clear();
1365 parameters.codecs.push_back(kOpusCodec);
1366 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1368 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1369}
1370
1371// Test that NACK is enabled on a new receive stream.
1372TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001373 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001374 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001375 cricket::AudioSendParameters parameters;
1376 parameters.codecs.push_back(kIsacCodec);
1377 parameters.codecs.push_back(kCn16000Codec);
1378 parameters.codecs[0].AddFeedbackParam(
1379 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1380 cricket::kParamValueEmpty));
1381 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001382 EXPECT_TRUE(voe_.GetNACK(channel_num));
1383
1384 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1385 channel_num = voe_.GetLastChannel();
1386 EXPECT_TRUE(voe_.GetNACK(channel_num));
1387 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1388 channel_num = voe_.GetLastChannel();
1389 EXPECT_TRUE(voe_.GetNACK(channel_num));
1390}
1391
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001392// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001393TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001394 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001395 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001396 cricket::AudioSendParameters parameters;
1397 parameters.codecs.push_back(kOpusCodec);
1398 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001399 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1400}
1401
1402// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001403TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001404 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001405 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001406 cricket::AudioSendParameters parameters;
1407 parameters.codecs.push_back(kOpusCodec);
1408 parameters.codecs[0].bitrate = 0;
1409 parameters.codecs[0].params["useinbandfec"] = "0";
1410 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001411 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1412 webrtc::CodecInst gcodec;
1413 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1414 EXPECT_STREQ("opus", gcodec.plname);
1415 EXPECT_EQ(1, gcodec.channels);
1416 EXPECT_EQ(32000, gcodec.rate);
1417}
1418
1419// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001420TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001421 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001422 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001423 cricket::AudioSendParameters parameters;
1424 parameters.codecs.push_back(kOpusCodec);
1425 parameters.codecs[0].bitrate = 0;
1426 parameters.codecs[0].params["useinbandfec"] = "1";
1427 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001428 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1429 webrtc::CodecInst gcodec;
1430 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1431 EXPECT_STREQ("opus", gcodec.plname);
1432 EXPECT_EQ(1, gcodec.channels);
1433 EXPECT_EQ(32000, gcodec.rate);
1434}
1435
1436// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001437TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001438 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001439 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001440 cricket::AudioSendParameters parameters;
1441 parameters.codecs.push_back(kOpusCodec);
1442 parameters.codecs[0].bitrate = 0;
1443 parameters.codecs[0].params["stereo"] = "1";
1444 parameters.codecs[0].params["useinbandfec"] = "1";
1445 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001446 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1447 webrtc::CodecInst gcodec;
1448 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1449 EXPECT_STREQ("opus", gcodec.plname);
1450 EXPECT_EQ(2, gcodec.channels);
1451 EXPECT_EQ(64000, gcodec.rate);
1452}
1453
1454// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001455TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001456 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001457 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001458 cricket::AudioSendParameters parameters;
1459 parameters.codecs.push_back(kIsacCodec);
1460 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001461 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1462}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001463
1464// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1465TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001466 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001467 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001468 cricket::AudioSendParameters parameters;
1469 parameters.codecs.push_back(kIsacCodec);
1470 parameters.codecs[0].params["useinbandfec"] = "1";
1471 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001472 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1473}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001474
1475// Test that Opus FEC status can be changed.
1476TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001477 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001478 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001479 cricket::AudioSendParameters parameters;
1480 parameters.codecs.push_back(kOpusCodec);
1481 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001482 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001483 parameters.codecs[0].params["useinbandfec"] = "1";
1484 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001485 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1486}
1487
stefanba4c0e42016-02-04 04:12:24 -08001488TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001489 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001490 cricket::AudioSendParameters send_parameters;
1491 send_parameters.codecs.push_back(kOpusCodec);
1492 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1493 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1494
1495 cricket::AudioRecvParameters recv_parameters;
1496 recv_parameters.codecs.push_back(kIsacCodec);
1497 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1498 EXPECT_TRUE(
1499 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1500 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1501 EXPECT_FALSE(
1502 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1503
solenbergbc37fc82016-04-04 09:54:44 -07001504 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001505 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1506 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1507 EXPECT_TRUE(
1508 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1509}
1510
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001511// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1512TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001513 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001514 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 cricket::AudioSendParameters parameters;
1516 parameters.codecs.push_back(kOpusCodec);
1517 parameters.codecs[0].bitrate = 0;
1518 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1519 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001520 EXPECT_EQ(cricket::kOpusBandwidthNb,
1521 voe_.GetMaxEncodingBandwidth(channel_num));
1522 webrtc::CodecInst gcodec;
1523 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1524 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001525
1526 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001527 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1528 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001529 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1530 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001531}
1532
1533// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1534TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001535 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001536 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001537 cricket::AudioSendParameters parameters;
1538 parameters.codecs.push_back(kOpusCodec);
1539 parameters.codecs[0].bitrate = 0;
1540 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1541 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001542 EXPECT_EQ(cricket::kOpusBandwidthMb,
1543 voe_.GetMaxEncodingBandwidth(channel_num));
1544 webrtc::CodecInst gcodec;
1545 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1546 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001547
1548 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001549 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1550 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001551 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1552 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001553}
1554
1555// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1556TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001557 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001558 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 cricket::AudioSendParameters parameters;
1560 parameters.codecs.push_back(kOpusCodec);
1561 parameters.codecs[0].bitrate = 0;
1562 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1563 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001564 EXPECT_EQ(cricket::kOpusBandwidthWb,
1565 voe_.GetMaxEncodingBandwidth(channel_num));
1566 webrtc::CodecInst gcodec;
1567 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1568 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001569
1570 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001571 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1572 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001573 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1574 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001575}
1576
1577// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1578TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001579 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001580 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 cricket::AudioSendParameters parameters;
1582 parameters.codecs.push_back(kOpusCodec);
1583 parameters.codecs[0].bitrate = 0;
1584 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1585 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001586 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1587 voe_.GetMaxEncodingBandwidth(channel_num));
1588 webrtc::CodecInst gcodec;
1589 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1590 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001591
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001592 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001593 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1594 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001595 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1596 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001597}
1598
1599// Test 24000 < maxplaybackrate triggers Opus full band mode.
1600TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001601 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001602 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001603 cricket::AudioSendParameters parameters;
1604 parameters.codecs.push_back(kOpusCodec);
1605 parameters.codecs[0].bitrate = 0;
1606 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1607 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001608 EXPECT_EQ(cricket::kOpusBandwidthFb,
1609 voe_.GetMaxEncodingBandwidth(channel_num));
1610 webrtc::CodecInst gcodec;
1611 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1612 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001613
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001614 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1616 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001617 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1618 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001619}
1620
1621// Test Opus that without maxplaybackrate, default playback rate is used.
1622TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001623 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001624 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001625 cricket::AudioSendParameters parameters;
1626 parameters.codecs.push_back(kOpusCodec);
1627 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001628 EXPECT_EQ(cricket::kOpusBandwidthFb,
1629 voe_.GetMaxEncodingBandwidth(channel_num));
1630}
1631
1632// Test the with non-Opus, maxplaybackrate has no effect.
1633TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001634 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001635 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001636 cricket::AudioSendParameters parameters;
1637 parameters.codecs.push_back(kIsacCodec);
1638 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1639 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001640 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1641}
1642
1643// Test maxplaybackrate can be set on two streams.
1644TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001645 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001646 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001647 cricket::AudioSendParameters parameters;
1648 parameters.codecs.push_back(kOpusCodec);
1649 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001650 // Default bandwidth is 24000.
1651 EXPECT_EQ(cricket::kOpusBandwidthFb,
1652 voe_.GetMaxEncodingBandwidth(channel_num));
1653
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001654 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001655
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001656 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001657 EXPECT_EQ(cricket::kOpusBandwidthNb,
1658 voe_.GetMaxEncodingBandwidth(channel_num));
1659
1660 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1661 channel_num = voe_.GetLastChannel();
1662 EXPECT_EQ(cricket::kOpusBandwidthNb,
1663 voe_.GetMaxEncodingBandwidth(channel_num));
1664}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001665
Minyue Li7100dcd2015-03-27 05:05:59 +01001666// Test that with usedtx=0, Opus DTX is off.
1667TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001668 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001669 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001670 cricket::AudioSendParameters parameters;
1671 parameters.codecs.push_back(kOpusCodec);
1672 parameters.codecs[0].params["usedtx"] = "0";
1673 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001674 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1675}
1676
1677// Test that with usedtx=1, Opus DTX is on.
1678TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001679 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001680 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kOpusCodec);
1683 parameters.codecs[0].params["usedtx"] = "1";
1684 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001685 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1686 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1687}
1688
1689// Test that usedtx=1 works with stereo Opus.
1690TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001691 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001692 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001693 cricket::AudioSendParameters parameters;
1694 parameters.codecs.push_back(kOpusCodec);
1695 parameters.codecs[0].params["usedtx"] = "1";
1696 parameters.codecs[0].params["stereo"] = "1";
1697 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001698 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1699 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1700}
1701
1702// Test that usedtx=1 does not work with non Opus.
1703TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001704 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001705 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001706 cricket::AudioSendParameters parameters;
1707 parameters.codecs.push_back(kIsacCodec);
1708 parameters.codecs[0].params["usedtx"] = "1";
1709 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001710 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1711}
1712
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001713// Test that we can switch back and forth between Opus and ISAC with CN.
1714TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001715 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001717 cricket::AudioSendParameters opus_parameters;
1718 opus_parameters.codecs.push_back(kOpusCodec);
1719 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 webrtc::CodecInst gcodec;
1721 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001722 EXPECT_EQ(111, gcodec.pltype);
1723 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001724
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 cricket::AudioSendParameters isac_parameters;
1726 isac_parameters.codecs.push_back(kIsacCodec);
1727 isac_parameters.codecs.push_back(kCn16000Codec);
1728 isac_parameters.codecs.push_back(kOpusCodec);
1729 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001730 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1731 EXPECT_EQ(103, gcodec.pltype);
1732 EXPECT_STREQ("ISAC", gcodec.plname);
1733
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001734 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001736 EXPECT_EQ(111, gcodec.pltype);
1737 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738}
1739
1740// Test that we handle various ways of specifying bitrate.
1741TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001742 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001744 cricket::AudioSendParameters parameters;
1745 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1746 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 webrtc::CodecInst gcodec;
1748 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1749 EXPECT_EQ(103, gcodec.pltype);
1750 EXPECT_STREQ("ISAC", gcodec.plname);
1751 EXPECT_EQ(32000, gcodec.rate);
1752
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001753 parameters.codecs[0].bitrate = 0; // bitrate == default
1754 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1756 EXPECT_EQ(103, gcodec.pltype);
1757 EXPECT_STREQ("ISAC", gcodec.plname);
1758 EXPECT_EQ(-1, gcodec.rate);
1759
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001760 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1761 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1763 EXPECT_EQ(103, gcodec.pltype);
1764 EXPECT_STREQ("ISAC", gcodec.plname);
1765 EXPECT_EQ(28000, gcodec.rate);
1766
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001767 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1768 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1770 EXPECT_EQ(0, gcodec.pltype);
1771 EXPECT_STREQ("PCMU", gcodec.plname);
1772 EXPECT_EQ(64000, gcodec.rate);
1773
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001774 parameters.codecs[0].bitrate = 0; // bitrate == default
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1777 EXPECT_EQ(0, gcodec.pltype);
1778 EXPECT_STREQ("PCMU", gcodec.plname);
1779 EXPECT_EQ(64000, gcodec.rate);
1780
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001781 parameters.codecs[0] = kOpusCodec;
1782 parameters.codecs[0].bitrate = 0; // bitrate == default
1783 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1785 EXPECT_EQ(111, gcodec.pltype);
1786 EXPECT_STREQ("opus", gcodec.plname);
1787 EXPECT_EQ(32000, gcodec.rate);
1788}
1789
Brave Yao5225dd82015-03-26 07:39:19 +08001790// Test that we could set packet size specified in kCodecParamPTime.
1791TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001792 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001793 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001794 cricket::AudioSendParameters parameters;
1795 parameters.codecs.push_back(kOpusCodec);
1796 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1797 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001798 webrtc::CodecInst gcodec;
1799 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1800 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1801
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001802 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1803 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001804 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1805 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1806
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001807 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1808 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001809 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1810 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1811
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001812 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1813 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1814 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001815 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1816 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1817
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001818 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1819 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1820 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001821 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1822 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1823}
1824
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001825// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001826TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001827 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001828 cricket::AudioSendParameters parameters;
1829 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001830}
1831
1832// Test that we can set send codecs even with telephone-event codec as the first
1833// one on the list.
1834TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001835 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001837 cricket::AudioSendParameters parameters;
1838 parameters.codecs.push_back(kTelephoneEventCodec);
1839 parameters.codecs.push_back(kIsacCodec);
1840 parameters.codecs.push_back(kPcmuCodec);
1841 parameters.codecs[0].id = 98; // DTMF
1842 parameters.codecs[1].id = 96;
1843 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001844 webrtc::CodecInst gcodec;
1845 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001846 EXPECT_EQ(96, gcodec.pltype);
1847 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001848 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001849}
1850
solenberg31642aa2016-03-14 08:00:37 -07001851// Test that payload type range is limited for telephone-event codec.
1852TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001853 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001854 cricket::AudioSendParameters parameters;
1855 parameters.codecs.push_back(kTelephoneEventCodec);
1856 parameters.codecs.push_back(kIsacCodec);
1857 parameters.codecs[0].id = 0; // DTMF
1858 parameters.codecs[1].id = 96;
1859 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1860 EXPECT_TRUE(channel_->CanInsertDtmf());
1861 parameters.codecs[0].id = 128; // DTMF
1862 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1863 EXPECT_FALSE(channel_->CanInsertDtmf());
1864 parameters.codecs[0].id = 127;
1865 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1866 EXPECT_TRUE(channel_->CanInsertDtmf());
1867 parameters.codecs[0].id = -1; // DTMF
1868 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1869 EXPECT_FALSE(channel_->CanInsertDtmf());
1870}
1871
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001872// Test that we can set send codecs even with CN codec as the first
1873// one on the list.
1874TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001875 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001876 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001877 cricket::AudioSendParameters parameters;
1878 parameters.codecs.push_back(kCn16000Codec);
1879 parameters.codecs.push_back(kIsacCodec);
1880 parameters.codecs.push_back(kPcmuCodec);
1881 parameters.codecs[0].id = 98; // wideband CN
1882 parameters.codecs[1].id = 96;
1883 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001884 webrtc::CodecInst gcodec;
1885 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1886 EXPECT_EQ(96, gcodec.pltype);
1887 EXPECT_STREQ("ISAC", gcodec.plname);
1888 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001889}
1890
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001891// Test that we set VAD and DTMF types correctly as caller.
1892TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001893 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001894 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001895 cricket::AudioSendParameters parameters;
1896 parameters.codecs.push_back(kIsacCodec);
1897 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001899 parameters.codecs.push_back(kCn16000Codec);
1900 parameters.codecs.push_back(kCn8000Codec);
1901 parameters.codecs.push_back(kTelephoneEventCodec);
1902 parameters.codecs.push_back(kRedCodec);
1903 parameters.codecs[0].id = 96;
1904 parameters.codecs[2].id = 97; // wideband CN
1905 parameters.codecs[4].id = 98; // DTMF
1906 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907 webrtc::CodecInst gcodec;
1908 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1909 EXPECT_EQ(96, gcodec.pltype);
1910 EXPECT_STREQ("ISAC", gcodec.plname);
1911 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001912 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001913 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1914 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001915 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916}
1917
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001918// Test that we set VAD and DTMF types correctly as callee.
1919TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001920 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001921 cricket::AudioSendParameters parameters;
1922 parameters.codecs.push_back(kIsacCodec);
1923 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001924 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001925 parameters.codecs.push_back(kCn16000Codec);
1926 parameters.codecs.push_back(kCn8000Codec);
1927 parameters.codecs.push_back(kTelephoneEventCodec);
1928 parameters.codecs.push_back(kRedCodec);
1929 parameters.codecs[0].id = 96;
1930 parameters.codecs[2].id = 97; // wideband CN
1931 parameters.codecs[4].id = 98; // DTMF
1932 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001933 EXPECT_TRUE(channel_->AddSendStream(
1934 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001935 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001936
1937 webrtc::CodecInst gcodec;
1938 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1939 EXPECT_EQ(96, gcodec.pltype);
1940 EXPECT_STREQ("ISAC", gcodec.plname);
1941 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001942 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001943 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1944 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001945 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001946}
1947
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948// Test that we only apply VAD if we have a CN codec that matches the
1949// send codec clockrate.
1950TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001951 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001953 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001955 parameters.codecs.push_back(kIsacCodec);
1956 parameters.codecs.push_back(kCn16000Codec);
1957 parameters.codecs[1].id = 97;
1958 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 webrtc::CodecInst gcodec;
1960 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1961 EXPECT_STREQ("ISAC", gcodec.plname);
1962 EXPECT_TRUE(voe_.GetVAD(channel_num));
1963 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1964 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001965 parameters.codecs[0] = kPcmuCodec;
1966 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1968 EXPECT_STREQ("PCMU", gcodec.plname);
1969 EXPECT_FALSE(voe_.GetVAD(channel_num));
1970 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001971 parameters.codecs[1] = kCn8000Codec;
1972 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1974 EXPECT_STREQ("PCMU", gcodec.plname);
1975 EXPECT_TRUE(voe_.GetVAD(channel_num));
1976 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001977 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001978 parameters.codecs[0] = kIsacCodec;
1979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1981 EXPECT_STREQ("ISAC", gcodec.plname);
1982 EXPECT_FALSE(voe_.GetVAD(channel_num));
1983}
1984
1985// Test that we perform case-insensitive matching of codec names.
1986TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001987 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001988 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001989 cricket::AudioSendParameters parameters;
1990 parameters.codecs.push_back(kIsacCodec);
1991 parameters.codecs.push_back(kPcmuCodec);
1992 parameters.codecs.push_back(kCn16000Codec);
1993 parameters.codecs.push_back(kCn8000Codec);
1994 parameters.codecs.push_back(kTelephoneEventCodec);
1995 parameters.codecs.push_back(kRedCodec);
1996 parameters.codecs[0].name = "iSaC";
1997 parameters.codecs[0].id = 96;
1998 parameters.codecs[2].id = 97; // wideband CN
1999 parameters.codecs[4].id = 98; // DTMF
2000 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002001 webrtc::CodecInst gcodec;
2002 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2003 EXPECT_EQ(96, gcodec.pltype);
2004 EXPECT_STREQ("ISAC", gcodec.plname);
2005 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002006 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2008 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002009 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002010}
2011
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002012// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002013TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002014 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002016 cricket::AudioSendParameters parameters;
2017 parameters.codecs.push_back(kRedCodec);
2018 parameters.codecs.push_back(kIsacCodec);
2019 parameters.codecs.push_back(kPcmuCodec);
2020 parameters.codecs[0].id = 127;
2021 parameters.codecs[0].params[""] = "96/96";
2022 parameters.codecs[1].id = 96;
2023 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002024 webrtc::CodecInst gcodec;
2025 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2026 EXPECT_EQ(96, gcodec.pltype);
2027 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002028 EXPECT_TRUE(voe_.GetRED(channel_num));
2029 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002030}
2031
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002032// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002033TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002034 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002035 cricket::AudioSendParameters parameters;
2036 parameters.codecs.push_back(kRedCodec);
2037 parameters.codecs.push_back(kIsacCodec);
2038 parameters.codecs.push_back(kPcmuCodec);
2039 parameters.codecs[0].id = 127;
2040 parameters.codecs[0].params[""] = "96/96";
2041 parameters.codecs[1].id = 96;
2042 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002043 EXPECT_TRUE(channel_->AddSendStream(
2044 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002045 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002046 webrtc::CodecInst gcodec;
2047 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2048 EXPECT_EQ(96, gcodec.pltype);
2049 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002050 EXPECT_TRUE(voe_.GetRED(channel_num));
2051 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002052}
2053
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002054// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002055TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002056 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002057 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002058 cricket::AudioSendParameters parameters;
2059 parameters.codecs.push_back(kRedCodec);
2060 parameters.codecs.push_back(kIsacCodec);
2061 parameters.codecs.push_back(kPcmuCodec);
2062 parameters.codecs[0].id = 127;
2063 parameters.codecs[1].id = 96;
2064 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002065 webrtc::CodecInst gcodec;
2066 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2067 EXPECT_EQ(96, gcodec.pltype);
2068 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002069 EXPECT_TRUE(voe_.GetRED(channel_num));
2070 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002071}
2072
2073// Test that we ignore RED if the parameters aren't named the way we expect.
2074TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002075 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002076 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002077 cricket::AudioSendParameters parameters;
2078 parameters.codecs.push_back(kRedCodec);
2079 parameters.codecs.push_back(kIsacCodec);
2080 parameters.codecs.push_back(kPcmuCodec);
2081 parameters.codecs[0].id = 127;
2082 parameters.codecs[0].params["ABC"] = "96/96";
2083 parameters.codecs[1].id = 96;
2084 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002085 webrtc::CodecInst gcodec;
2086 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2087 EXPECT_EQ(96, gcodec.pltype);
2088 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002089 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090}
2091
2092// Test that we ignore RED if it uses different primary/secondary encoding.
2093TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002094 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002095 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002096 cricket::AudioSendParameters parameters;
2097 parameters.codecs.push_back(kRedCodec);
2098 parameters.codecs.push_back(kIsacCodec);
2099 parameters.codecs.push_back(kPcmuCodec);
2100 parameters.codecs[0].id = 127;
2101 parameters.codecs[0].params[""] = "96/0";
2102 parameters.codecs[1].id = 96;
2103 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104 webrtc::CodecInst gcodec;
2105 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2106 EXPECT_EQ(96, gcodec.pltype);
2107 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002108 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002109}
2110
2111// Test that we ignore RED if it uses more than 2 encodings.
2112TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002113 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002115 cricket::AudioSendParameters parameters;
2116 parameters.codecs.push_back(kRedCodec);
2117 parameters.codecs.push_back(kIsacCodec);
2118 parameters.codecs.push_back(kPcmuCodec);
2119 parameters.codecs[0].id = 127;
2120 parameters.codecs[0].params[""] = "96/96/96";
2121 parameters.codecs[1].id = 96;
2122 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002123 webrtc::CodecInst gcodec;
2124 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2125 EXPECT_EQ(96, gcodec.pltype);
2126 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002127 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128}
2129
2130// Test that we ignore RED if it has bogus codec ids.
2131TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002132 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002134 cricket::AudioSendParameters parameters;
2135 parameters.codecs.push_back(kRedCodec);
2136 parameters.codecs.push_back(kIsacCodec);
2137 parameters.codecs.push_back(kPcmuCodec);
2138 parameters.codecs[0].id = 127;
2139 parameters.codecs[0].params[""] = "ABC/ABC";
2140 parameters.codecs[1].id = 96;
2141 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002142 webrtc::CodecInst gcodec;
2143 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2144 EXPECT_EQ(96, gcodec.pltype);
2145 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002146 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147}
2148
2149// Test that we ignore RED if it refers to a codec that is not present.
2150TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002151 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002153 cricket::AudioSendParameters parameters;
2154 parameters.codecs.push_back(kRedCodec);
2155 parameters.codecs.push_back(kIsacCodec);
2156 parameters.codecs.push_back(kPcmuCodec);
2157 parameters.codecs[0].id = 127;
2158 parameters.codecs[0].params[""] = "97/97";
2159 parameters.codecs[1].id = 96;
2160 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002161 webrtc::CodecInst gcodec;
2162 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2163 EXPECT_EQ(96, gcodec.pltype);
2164 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002165 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166}
2167
stefanba4c0e42016-02-04 04:12:24 -08002168class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2169 public:
2170 WebRtcVoiceEngineWithSendSideBweTest()
2171 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2172};
2173
2174TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2175 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002176 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002177 ASSERT_FALSE(capabilities.header_extensions.empty());
2178 for (const cricket::RtpHeaderExtension& extension :
2179 capabilities.header_extensions) {
2180 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2181 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2182 extension.id);
2183 return;
2184 }
2185 }
2186 FAIL() << "Transport sequence number extension not in header-extension list.";
2187}
2188
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002189// Test support for audio level header extension.
2190TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2191 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002192}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002193TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2194 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2195}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002196
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002197// Test support for absolute send time header extension.
2198TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2199 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2200}
2201TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2202 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002203}
2204
solenberg1ac56142015-10-13 03:58:19 -07002205// Test that we can create a channel and start sending on it.
2206TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002207 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002208 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002209 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002210 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002211 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002212 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2213}
2214
2215// Test that a channel will send if and only if it has a source and is enabled
2216// for sending.
2217TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002218 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002219 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2220 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002221 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002222 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2223 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2224 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2225 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2226 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002227}
2228
solenberg6d6e7c52016-04-13 09:07:30 -07002229// Test that SetSendParameters() does not alter a stream's send state.
2230TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2231 EXPECT_TRUE(SetupSendStream());
2232 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2233
2234 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002235 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002236 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2237
2238 // Changing RTP header extensions will recreate the AudioSendStream.
2239 send_parameters_.extensions.push_back(
2240 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2241 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2242 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2243
2244 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002245 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002246 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2247
2248 // Changing RTP header extensions will recreate the AudioSendStream.
2249 send_parameters_.extensions.clear();
2250 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2251 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2252}
2253
solenberg1ac56142015-10-13 03:58:19 -07002254// Test that we can create a channel and start playing out on it.
2255TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002256 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002257 int channel_num = voe_.GetLastChannel();
2258 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2259 EXPECT_TRUE(channel_->SetPlayout(true));
2260 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261 EXPECT_TRUE(channel_->SetPlayout(false));
2262 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2263}
2264
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002265// Test that we can add and remove send streams.
2266TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2267 SetupForMultiSendStream();
2268
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002269 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002270 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271
solenbergc96df772015-10-21 13:01:53 -07002272 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002273 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002274 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002275 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002276 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002277 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002278 }
tfarina5237aaf2015-11-10 23:44:30 -08002279 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002280
solenbergc96df772015-10-21 13:01:53 -07002281 // Delete the send streams.
2282 for (uint32_t ssrc : kSsrcs4) {
2283 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002284 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002285 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002286 }
solenbergc96df772015-10-21 13:01:53 -07002287 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002288}
2289
2290// Test SetSendCodecs correctly configure the codecs in all send streams.
2291TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2292 SetupForMultiSendStream();
2293
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002294 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002295 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002296 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002297 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002298 }
2299
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002300 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002301 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002302 parameters.codecs.push_back(kIsacCodec);
2303 parameters.codecs.push_back(kCn16000Codec);
2304 parameters.codecs[1].id = 97;
2305 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002306
2307 // Verify ISAC and VAD are corrected configured on all send channels.
2308 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002309 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002310 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002311 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2312 EXPECT_STREQ("ISAC", gcodec.plname);
2313 EXPECT_TRUE(voe_.GetVAD(channel_num));
2314 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2315 }
2316
2317 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002318 parameters.codecs[0] = kPcmuCodec;
2319 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002320 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002321 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002322 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2323 EXPECT_STREQ("PCMU", gcodec.plname);
2324 EXPECT_FALSE(voe_.GetVAD(channel_num));
2325 }
2326}
2327
2328// Test we can SetSend on all send streams correctly.
2329TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2330 SetupForMultiSendStream();
2331
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002332 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002333 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002334 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002335 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002336 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2337 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002338 }
2339
2340 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002341 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002342 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002343 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002344 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002345 }
2346
2347 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002348 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002349 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002350 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002351 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002352 }
2353}
2354
2355// Test we can set the correct statistics on all send streams.
2356TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2357 SetupForMultiSendStream();
2358
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002359 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002360 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002361 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002362 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002363 }
solenberg85a04962015-10-27 03:35:21 -07002364 SetAudioSendStreamStats();
2365
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002366 // Create a receive stream to check that none of the send streams end up in
2367 // the receive stream stats.
2368 EXPECT_TRUE(channel_->AddRecvStream(
2369 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002370 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002371 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2372 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002373
solenberg85a04962015-10-27 03:35:21 -07002374 // Check stats for the added streams.
2375 {
2376 cricket::VoiceMediaInfo info;
2377 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002378
solenberg85a04962015-10-27 03:35:21 -07002379 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002380 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002381 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002382 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002383 }
2384
2385 // We have added one receive stream. We should see empty stats.
2386 EXPECT_EQ(info.receivers.size(), 1u);
2387 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002388 }
solenberg1ac56142015-10-13 03:58:19 -07002389
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002390 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002391 {
2392 cricket::VoiceMediaInfo info;
2393 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2394 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002395 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002396 EXPECT_EQ(0u, info.receivers.size());
2397 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002398
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002399 // Deliver a new packet - a default receive stream should be created and we
2400 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002401 {
2402 cricket::VoiceMediaInfo info;
2403 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2404 SetAudioReceiveStreamStats();
2405 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002406 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002407 EXPECT_EQ(1u, info.receivers.size());
2408 VerifyVoiceReceiverInfo(info.receivers[0]);
2409 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002410}
2411
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002412// Test that we can add and remove receive streams, and do proper send/playout.
2413// We can receive on multiple streams while sending one stream.
2414TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002415 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002416 int channel_num1 = voe_.GetLastChannel();
2417
solenberg1ac56142015-10-13 03:58:19 -07002418 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002419 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002421 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422
solenberg1ac56142015-10-13 03:58:19 -07002423 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002424 EXPECT_TRUE(
2425 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002427 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002428 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429
solenberg1ac56142015-10-13 03:58:19 -07002430 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2432 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2433
2434 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002435 EXPECT_TRUE(
2436 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437 int channel_num3 = voe_.GetLastChannel();
2438 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2439 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2440 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441
2442 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002443 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002444 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002445
2446 // Stop playout.
2447 EXPECT_TRUE(channel_->SetPlayout(false));
2448 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2449 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2450 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2451
solenberg1ac56142015-10-13 03:58:19 -07002452 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453 EXPECT_TRUE(channel_->SetPlayout(true));
2454 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2455 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2456 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2457
solenberg1ac56142015-10-13 03:58:19 -07002458 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002459 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2460 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002461 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462}
2463
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002465// and start sending on it.
2466TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002467 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002468 cricket::AudioOptions options_adjust_agc;
2469 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 webrtc::AgcConfig agc_config;
2471 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2472 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002473 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002474 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002475 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002476 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2478 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002479 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002480 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002482}
2483
wu@webrtc.org97077a32013-10-25 21:18:33 +00002484TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002485 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002486 EXPECT_CALL(adm_,
2487 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002488 webrtc::AgcConfig agc_config;
2489 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2490 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002491 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2492 send_parameters_.options.tx_agc_digital_compression_gain =
2493 rtc::Optional<uint16_t>(9);
2494 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2495 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2496 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002497 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2498 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2499 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2500 EXPECT_TRUE(agc_config.limiterEnable);
2501
2502 // Check interaction with adjust_agc_delta. Both should be respected, for
2503 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002504 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2505 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002506 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2507 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2508}
2509
wu@webrtc.org97077a32013-10-25 21:18:33 +00002510TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002511 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002512 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2513 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002514 send_parameters_.options.recording_sample_rate =
2515 rtc::Optional<uint32_t>(48000);
2516 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2517 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002518}
2519
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002521// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002522TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002523 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002524 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002525}
2526
2527TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2528 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002529 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002530 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002531 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002532 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002533 EXPECT_TRUE(channel_->AddRecvStream(
2534 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002535 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2536 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537
solenberg85a04962015-10-27 03:35:21 -07002538 // Check stats for the added streams.
2539 {
2540 cricket::VoiceMediaInfo info;
2541 EXPECT_EQ(true, channel_->GetStats(&info));
2542
2543 // We have added one send stream. We should see the stats we've set.
2544 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002545 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002546 // We have added one receive stream. We should see empty stats.
2547 EXPECT_EQ(info.receivers.size(), 1u);
2548 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2549 }
solenberg1ac56142015-10-13 03:58:19 -07002550
solenberg566ef242015-11-06 15:34:49 -08002551 // Start sending - this affects some reported stats.
2552 {
2553 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002554 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002555 EXPECT_EQ(true, channel_->GetStats(&info));
2556 VerifyVoiceSenderInfo(info.senders[0], true);
2557 }
2558
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002559 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002560 {
2561 cricket::VoiceMediaInfo info;
2562 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2563 EXPECT_EQ(true, channel_->GetStats(&info));
2564 EXPECT_EQ(1u, info.senders.size());
2565 EXPECT_EQ(0u, info.receivers.size());
2566 }
solenberg1ac56142015-10-13 03:58:19 -07002567
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002568 // Deliver a new packet - a default receive stream should be created and we
2569 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002570 {
2571 cricket::VoiceMediaInfo info;
2572 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2573 SetAudioReceiveStreamStats();
2574 EXPECT_EQ(true, channel_->GetStats(&info));
2575 EXPECT_EQ(1u, info.senders.size());
2576 EXPECT_EQ(1u, info.receivers.size());
2577 VerifyVoiceReceiverInfo(info.receivers[0]);
2578 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002579}
2580
2581// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002582// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002583TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002584 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002585 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002586 EXPECT_TRUE(channel_->AddRecvStream(
2587 cricket::StreamParams::CreateLegacy(kSsrc2)));
2588 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002589}
2590
2591// Test that the local SSRC is the same on sending and receiving channels if the
2592// receive channel is created before the send channel.
2593TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002594 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2596 int receive_channel_num = voe_.GetLastChannel();
2597 EXPECT_TRUE(channel_->AddSendStream(
2598 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002599
solenberg3a941542015-11-16 07:34:50 -08002600 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002601 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002602}
2603
2604// Test that we can properly receive packets.
2605TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002606 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002607 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002608 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002609 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002610 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002611}
2612
2613// Test that we can properly receive packets on multiple streams.
2614TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002615 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002616 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2617 int channel_num1 = voe_.GetLastChannel();
2618 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2619 int channel_num2 = voe_.GetLastChannel();
2620 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2621 int channel_num3 = voe_.GetLastChannel();
2622 // Create packets with the right SSRCs.
2623 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002624 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002625 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002626 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627 }
2628 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2629 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2630 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002631
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002632 DeliverPacket(packets[0], sizeof(packets[0]));
2633 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2634 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2635 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002636
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002637 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002638 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002639 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2640 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002641
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002642 DeliverPacket(packets[2], sizeof(packets[2]));
2643 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002644 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002646
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647 DeliverPacket(packets[3], sizeof(packets[3]));
2648 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2649 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002650 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2651
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002652 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2653 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2654 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2655}
2656
solenberg7e63ef02015-11-20 00:19:43 -08002657// Test that receiving on an unsignalled stream works (default channel will be
2658// created).
2659TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002660 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002661 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2662 int channel_num = voe_.GetLastChannel();
2663 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2664}
2665
2666// Test that receiving on an unsignalled stream works (default channel will be
2667// created), and that packets will be forwarded to the default channel
2668// regardless of their SSRCs.
2669TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002670 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002671 char packet[sizeof(kPcmuFrame)];
2672 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2673
2674 // Note that the first unknown SSRC cannot be 0, because we only support
2675 // creating receive streams for SSRC!=0.
2676 DeliverPacket(packet, sizeof(packet));
2677 int channel_num = voe_.GetLastChannel();
2678 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2679 // Once we have the default channel, SSRC==0 will be ok.
2680 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2681 rtc::SetBE32(&packet[8], ssrc);
2682 DeliverPacket(packet, sizeof(packet));
2683 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2684 }
2685}
2686
2687// Test that a default channel is created even after a signalled stream has been
2688// added, and that this stream will get any packets for unknown SSRCs.
2689TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002690 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002691 char packet[sizeof(kPcmuFrame)];
2692 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2693
2694 // Add a known stream, send packet and verify we got it.
2695 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2696 int signalled_channel_num = voe_.GetLastChannel();
2697 DeliverPacket(packet, sizeof(packet));
2698 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2699
2700 // Note that the first unknown SSRC cannot be 0, because we only support
2701 // creating receive streams for SSRC!=0.
2702 rtc::SetBE32(&packet[8], 7011);
2703 DeliverPacket(packet, sizeof(packet));
2704 int channel_num = voe_.GetLastChannel();
2705 EXPECT_NE(channel_num, signalled_channel_num);
2706 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2707 // Once we have the default channel, SSRC==0 will be ok.
2708 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2709 rtc::SetBE32(&packet[8], ssrc);
2710 DeliverPacket(packet, sizeof(packet));
2711 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2712 }
2713}
2714
solenberg0a617e22015-10-20 15:49:38 -07002715// Test that we properly handle failures to add a receive stream.
2716TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002717 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002719 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002720}
2721
solenberg0a617e22015-10-20 15:49:38 -07002722// Test that we properly handle failures to add a send stream.
2723TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002724 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002725 voe_.set_fail_create_channel(true);
2726 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2727}
2728
solenberg1ac56142015-10-13 03:58:19 -07002729// Test that AddRecvStream creates new stream.
2730TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002731 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732 int channel_num = voe_.GetLastChannel();
2733 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002734 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002735}
2736
2737// Test that after adding a recv stream, we do not decode more codecs than
2738// those previously passed into SetRecvCodecs.
2739TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002740 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002741 cricket::AudioRecvParameters parameters;
2742 parameters.codecs.push_back(kIsacCodec);
2743 parameters.codecs.push_back(kPcmuCodec);
2744 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745 EXPECT_TRUE(channel_->AddRecvStream(
2746 cricket::StreamParams::CreateLegacy(kSsrc1)));
2747 int channel_num2 = voe_.GetLastChannel();
2748 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002749 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002750 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002751 gcodec.channels = 2;
2752 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2753}
2754
2755// Test that we properly clean up any streams that were added, even if
2756// not explicitly removed.
2757TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002758 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002759 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002760 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2761 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2762 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2763 delete channel_;
2764 channel_ = NULL;
2765 EXPECT_EQ(0, voe_.GetNumChannels());
2766}
2767
wu@webrtc.org78187522013-10-07 23:32:02 +00002768TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002769 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002770 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2771}
2772
2773TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002774 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002775 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002776 // Manually delete channel to simulate a failure.
2777 int channel = voe_.GetLastChannel();
2778 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2779 // Add recv stream 2 should work.
2780 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002781 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002782 EXPECT_NE(channel, new_channel);
2783 // The last created channel is deleted too.
2784 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002785}
2786
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002787// Test the InsertDtmf on default send stream as caller.
2788TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2789 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002790}
2791
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002792// Test the InsertDtmf on default send stream as callee
2793TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2794 TestInsertDtmf(0, false);
2795}
2796
2797// Test the InsertDtmf on specified send stream as caller.
2798TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2799 TestInsertDtmf(kSsrc1, true);
2800}
2801
2802// Test the InsertDtmf on specified send stream as callee.
2803TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2804 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002805}
2806
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002808 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002809 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002810 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2812 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2813 EXPECT_TRUE(channel_->SetPlayout(true));
2814 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2815 EXPECT_TRUE(channel_->SetPlayout(false));
2816 EXPECT_FALSE(channel_->SetPlayout(true));
2817}
2818
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002819TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002820 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002821 EXPECT_CALL(adm_,
2822 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2823 EXPECT_CALL(adm_,
2824 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2825 EXPECT_CALL(adm_,
2826 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827 bool ec_enabled;
2828 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002829 webrtc::AecmModes aecm_mode;
2830 bool cng_enabled;
2831 bool agc_enabled;
2832 webrtc::AgcModes agc_mode;
2833 webrtc::AgcConfig agc_config;
2834 bool ns_enabled;
2835 webrtc::NsModes ns_mode;
2836 bool highpass_filter_enabled;
2837 bool stereo_swapping_enabled;
2838 bool typing_detection_enabled;
2839 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002840 voe_.GetAecmMode(aecm_mode, cng_enabled);
2841 voe_.GetAgcStatus(agc_enabled, agc_mode);
2842 voe_.GetAgcConfig(agc_config);
2843 voe_.GetNsStatus(ns_enabled, ns_mode);
2844 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2845 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2846 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2847 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002848 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002849 EXPECT_FALSE(cng_enabled);
2850 EXPECT_TRUE(agc_enabled);
2851 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2852 EXPECT_TRUE(ns_enabled);
2853 EXPECT_TRUE(highpass_filter_enabled);
2854 EXPECT_FALSE(stereo_swapping_enabled);
2855 EXPECT_TRUE(typing_detection_enabled);
2856 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2857 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002858 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2859 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002860
solenberg246b8172015-12-08 09:50:23 -08002861 // Nothing set in AudioOptions, so everything should be as default.
2862 send_parameters_.options = cricket::AudioOptions();
2863 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002864 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002865 voe_.GetAecmMode(aecm_mode, cng_enabled);
2866 voe_.GetAgcStatus(agc_enabled, agc_mode);
2867 voe_.GetAgcConfig(agc_config);
2868 voe_.GetNsStatus(ns_enabled, ns_mode);
2869 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2870 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2871 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2872 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002873 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002874 EXPECT_FALSE(cng_enabled);
2875 EXPECT_TRUE(agc_enabled);
2876 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2877 EXPECT_TRUE(ns_enabled);
2878 EXPECT_TRUE(highpass_filter_enabled);
2879 EXPECT_FALSE(stereo_swapping_enabled);
2880 EXPECT_TRUE(typing_detection_enabled);
2881 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2882 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002883 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2884 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885
2886 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002887 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2888 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002889 voe_.GetEcStatus(ec_enabled, ec_mode);
2890 EXPECT_FALSE(ec_enabled);
2891
2892 // Turn echo cancellation back on, with settings, and make sure
2893 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002894 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2895 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002896 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897 voe_.GetAecmMode(aecm_mode, cng_enabled);
2898 voe_.GetAgcStatus(agc_enabled, agc_mode);
2899 voe_.GetAgcConfig(agc_config);
2900 voe_.GetNsStatus(ns_enabled, ns_mode);
2901 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2902 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2903 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2904 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002905 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002906 EXPECT_TRUE(agc_enabled);
2907 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2908 EXPECT_TRUE(ns_enabled);
2909 EXPECT_TRUE(highpass_filter_enabled);
2910 EXPECT_FALSE(stereo_swapping_enabled);
2911 EXPECT_TRUE(typing_detection_enabled);
2912 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2913 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2914
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002915 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2916 // control.
solenberg246b8172015-12-08 09:50:23 -08002917 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2918 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002919 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002920 voe_.GetAecmMode(aecm_mode, cng_enabled);
2921 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002922 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002923 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2924
2925 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002926 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2927 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2928 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2929 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002930 voe_.GetEcStatus(ec_enabled, ec_mode);
2931 EXPECT_FALSE(ec_enabled);
2932 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002933 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2934 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002935 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002936 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002937 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002938 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2939
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002941 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2942 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943 voe_.GetAgcStatus(agc_enabled, agc_mode);
2944 EXPECT_FALSE(agc_enabled);
2945
2946 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002947 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2948 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2949 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002950 voe_.GetAgcStatus(agc_enabled, agc_mode);
2951 EXPECT_TRUE(agc_enabled);
2952 voe_.GetAgcConfig(agc_config);
2953 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2954
2955 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002956 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2957 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2958 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2959 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2960 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002961 voe_.GetNsStatus(ns_enabled, ns_mode);
2962 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2963 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2964 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2965 EXPECT_FALSE(ns_enabled);
2966 EXPECT_FALSE(highpass_filter_enabled);
2967 EXPECT_FALSE(typing_detection_enabled);
2968 EXPECT_TRUE(stereo_swapping_enabled);
2969
solenberg1ac56142015-10-13 03:58:19 -07002970 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002971 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002972 voe_.GetEcStatus(ec_enabled, ec_mode);
2973 voe_.GetNsStatus(ns_enabled, ns_mode);
2974 EXPECT_TRUE(ec_enabled);
2975 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2976 EXPECT_FALSE(ns_enabled);
2977 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2978}
2979
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002980TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002981 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982
2983 bool ec_enabled;
2984 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002985 bool agc_enabled;
2986 webrtc::AgcModes agc_mode;
2987 bool ns_enabled;
2988 webrtc::NsModes ns_mode;
2989 bool highpass_filter_enabled;
2990 bool stereo_swapping_enabled;
2991 bool typing_detection_enabled;
2992
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002993 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002994 voe_.GetAgcStatus(agc_enabled, agc_mode);
2995 voe_.GetNsStatus(ns_enabled, ns_mode);
2996 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2997 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2998 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2999 EXPECT_TRUE(ec_enabled);
3000 EXPECT_TRUE(agc_enabled);
3001 EXPECT_TRUE(ns_enabled);
3002 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003003 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003004 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003005}
3006
3007TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3008 webrtc::AgcConfig set_config = {0};
3009 set_config.targetLeveldBOv = 3;
3010 set_config.digitalCompressionGaindB = 9;
3011 set_config.limiterEnable = true;
3012 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013
3014 webrtc::AgcConfig config = {0};
3015 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3016 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3017 EXPECT_EQ(set_config.digitalCompressionGaindB,
3018 config.digitalCompressionGaindB);
3019 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3020}
3021
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003022TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003023 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003024 EXPECT_CALL(adm_,
3025 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3026 EXPECT_CALL(adm_,
3027 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3028 EXPECT_CALL(adm_,
3029 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3030
kwiberg686a8ef2016-02-26 03:00:35 -08003031 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003032 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003033 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003034 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003035 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003036 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003037
3038 // Have to add a stream to make SetSend work.
3039 cricket::StreamParams stream1;
3040 stream1.ssrcs.push_back(1);
3041 channel1->AddSendStream(stream1);
3042 cricket::StreamParams stream2;
3043 stream2.ssrcs.push_back(2);
3044 channel2->AddSendStream(stream2);
3045
3046 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003047 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003048 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3049 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3050 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003051 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3052 EXPECT_EQ(parameters_options_all.options, channel1->options());
3053 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3054 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003055
3056 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003057 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003058 parameters_options_no_ns.options.noise_suppression =
3059 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003060 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3061 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003062 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3063 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3064 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003065 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003066
3067 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003068 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003069 parameters_options_no_agc.options.auto_gain_control =
3070 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003071 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003072 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3073 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3074 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003075 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003076
solenberg246b8172015-12-08 09:50:23 -08003077 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003078 bool ec_enabled;
3079 webrtc::EcModes ec_mode;
3080 bool agc_enabled;
3081 webrtc::AgcModes agc_mode;
3082 bool ns_enabled;
3083 webrtc::NsModes ns_mode;
3084 voe_.GetEcStatus(ec_enabled, ec_mode);
3085 voe_.GetAgcStatus(agc_enabled, agc_mode);
3086 voe_.GetNsStatus(ns_enabled, ns_mode);
3087 EXPECT_TRUE(ec_enabled);
3088 EXPECT_TRUE(agc_enabled);
3089 EXPECT_TRUE(ns_enabled);
3090
solenbergd53a3f92016-04-14 13:56:37 -07003091 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003092 voe_.GetEcStatus(ec_enabled, ec_mode);
3093 voe_.GetAgcStatus(agc_enabled, agc_mode);
3094 voe_.GetNsStatus(ns_enabled, ns_mode);
3095 EXPECT_TRUE(ec_enabled);
3096 EXPECT_TRUE(agc_enabled);
3097 EXPECT_FALSE(ns_enabled);
3098
solenbergd53a3f92016-04-14 13:56:37 -07003099 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003100 voe_.GetEcStatus(ec_enabled, ec_mode);
3101 voe_.GetAgcStatus(agc_enabled, agc_mode);
3102 voe_.GetNsStatus(ns_enabled, ns_mode);
3103 EXPECT_TRUE(ec_enabled);
3104 EXPECT_FALSE(agc_enabled);
3105 EXPECT_TRUE(ns_enabled);
3106
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003107 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003108 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003109 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3110 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003111 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003112 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003113 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003114 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003115 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003116 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003117 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3118 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3119 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003120 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003121 voe_.GetEcStatus(ec_enabled, ec_mode);
3122 voe_.GetAgcStatus(agc_enabled, agc_mode);
3123 voe_.GetNsStatus(ns_enabled, ns_mode);
3124 EXPECT_TRUE(ec_enabled);
3125 EXPECT_FALSE(agc_enabled);
3126 EXPECT_FALSE(ns_enabled);
3127}
3128
wu@webrtc.orgde305012013-10-31 15:40:38 +00003129// This test verifies DSCP settings are properly applied on voice media channel.
3130TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003131 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003132 cricket::FakeNetworkInterface network_interface;
3133 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003134 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003135
solenbergbc37fc82016-04-04 09:54:44 -07003136 channel.reset(
3137 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003138 channel->SetInterface(&network_interface);
3139 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3140 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3141
3142 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003143 channel.reset(
3144 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003145 channel->SetInterface(&network_interface);
3146 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3147
3148 // Verify that setting the option to false resets the
3149 // DiffServCodePoint.
3150 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003151 channel.reset(
3152 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003153 channel->SetInterface(&network_interface);
3154 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3155 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3156
3157 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003158}
3159
solenberg1ac56142015-10-13 03:58:19 -07003160TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003161 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003162 cricket::WebRtcVoiceMediaChannel* media_channel =
3163 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003164 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3165 EXPECT_TRUE(channel_->AddRecvStream(
3166 cricket::StreamParams::CreateLegacy(kSsrc1)));
3167 int channel_id = voe_.GetLastChannel();
3168 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3169 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3170 EXPECT_TRUE(channel_->AddRecvStream(
3171 cricket::StreamParams::CreateLegacy(kSsrc2)));
3172 int channel_id2 = voe_.GetLastChannel();
3173 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003174}
3175
solenberg1ac56142015-10-13 03:58:19 -07003176TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003177 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003178 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003179 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3180 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3181 EXPECT_TRUE(channel_->AddSendStream(
3182 cricket::StreamParams::CreateLegacy(kSsrc1)));
3183 int channel_id = voe_.GetLastChannel();
3184 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3185 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3186 EXPECT_TRUE(channel_->AddSendStream(
3187 cricket::StreamParams::CreateLegacy(kSsrc2)));
3188 int channel_id2 = voe_.GetLastChannel();
3189 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003190}
3191
solenberg4bac9c52015-10-09 02:32:53 -07003192TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003193 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003194 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003195 cricket::StreamParams stream;
3196 stream.ssrcs.push_back(kSsrc2);
3197 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003198 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003199 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003200 float scale = 0;
3201 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3202 EXPECT_DOUBLE_EQ(3, scale);
3203}
3204
3205TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003206 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003207 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3208 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3209 int channel_id = voe_.GetLastChannel();
3210 float scale = 0;
3211 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3212 EXPECT_DOUBLE_EQ(2, scale);
3213 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003214 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003215 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003216}
3217
pbos8fc7fa72015-07-15 08:02:58 -07003218TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003219 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003220 const std::string kSyncLabel = "AvSyncLabel";
3221
solenbergff976312016-03-30 23:28:51 -07003222 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003223 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3224 sp.sync_label = kSyncLabel;
3225 // Creating two channels to make sure that sync label is set properly for both
3226 // the default voice channel and following ones.
3227 EXPECT_TRUE(channel_->AddRecvStream(sp));
3228 sp.ssrcs[0] += 1;
3229 EXPECT_TRUE(channel_->AddRecvStream(sp));
3230
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003231 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003232 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003233 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003234 << "SyncGroup should be set based on sync_label";
3235 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003236 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003237 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003238}
3239
solenberg3a941542015-11-16 07:34:50 -08003240// TODO(solenberg): Remove, once recv streams are configured through Call.
3241// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003242TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003243 // Test that setting the header extensions results in the expected state
3244 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003245 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003246 ssrcs.push_back(223);
3247 ssrcs.push_back(224);
3248
solenbergff976312016-03-30 23:28:51 -07003249 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003250 cricket::WebRtcVoiceMediaChannel* media_channel =
3251 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003252 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003253 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003254 EXPECT_TRUE(media_channel->AddRecvStream(
3255 cricket::StreamParams::CreateLegacy(ssrc)));
3256 }
3257
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003258 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003259 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003260 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003261 EXPECT_NE(nullptr, s);
3262 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3263 }
3264
3265 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003266 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003267 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003268 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003269 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003270 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003271 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003272 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003273 EXPECT_NE(nullptr, s);
3274 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003275 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3276 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003277 for (const auto& s_ext : s_exts) {
3278 if (e_ext.id == s_ext.id) {
3279 EXPECT_EQ(e_ext.uri, s_ext.name);
3280 }
3281 }
3282 }
3283 }
3284
3285 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003286 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003287 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003288 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003289 EXPECT_NE(nullptr, s);
3290 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3291 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003292}
3293
3294TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3295 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003296 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003297 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003298 static const unsigned char kRtcp[] = {
3299 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3300 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3303 };
jbaucheec21bd2016-03-20 06:15:43 -07003304 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003305
solenbergff976312016-03-30 23:28:51 -07003306 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003307 cricket::WebRtcVoiceMediaChannel* media_channel =
3308 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003309 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003310 EXPECT_TRUE(media_channel->AddRecvStream(
3311 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3312
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003313 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003314 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003315 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003316 EXPECT_EQ(0, s->received_packets());
3317 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3318 EXPECT_EQ(1, s->received_packets());
3319 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3320 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003321}
Minyue2013aec2015-05-13 14:14:42 +02003322
solenberg0a617e22015-10-20 15:49:38 -07003323// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003324// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003325TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003326 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003327 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003328 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003329 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3330 int recv_ch = voe_.GetLastChannel();
3331 EXPECT_NE(recv_ch, default_channel);
3332 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3333 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3334 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003335 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3336 recv_ch = voe_.GetLastChannel();
3337 EXPECT_NE(recv_ch, default_channel);
3338 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003339}
3340
3341TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003342 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003343 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003344
3345 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3346 int recv_ch = voe_.GetLastChannel();
3347
3348 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3349 int send_ch = voe_.GetLastChannel();
3350
3351 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3352 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3353 // channel of |recv_ch|.This is not a common case, since, normally, only the
3354 // default channel can be associated. However, the default is not deletable.
3355 // So we force the |recv_ch| to associate with a non-default channel.
3356 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3357 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3358
3359 EXPECT_TRUE(channel_->RemoveSendStream(2));
3360 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3361}
stefan658910c2015-09-03 05:48:32 -07003362
deadbeef884f5852016-01-15 09:20:04 -08003363TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003364 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003365 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3366 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003367
3368 // Setting the sink before a recv stream exists should do nothing.
3369 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3370 EXPECT_TRUE(
3371 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3372 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3373
3374 // Now try actually setting the sink.
3375 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3376 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3377
3378 // Now try resetting it.
3379 channel_->SetRawAudioSink(kSsrc1, nullptr);
3380 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3381}
3382
3383TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003384 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003385 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3386 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003387
3388 // Should be able to set a default sink even when no stream exists.
3389 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3390
3391 // Create default channel and ensure it's assigned the default sink.
3392 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3393 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3394
3395 // Try resetting the default sink.
3396 channel_->SetRawAudioSink(0, nullptr);
3397 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3398
3399 // Try setting the default sink while the default stream exists.
3400 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3401 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3402
3403 // If we remove and add a default stream, it should get the same sink.
3404 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3405 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3406 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3407}
3408
skvlad7a43d252016-03-22 15:32:27 -07003409// Test that, just like the video channel, the voice channel communicates the
3410// network state to the call.
3411TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003412 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003413
3414 EXPECT_EQ(webrtc::kNetworkUp,
3415 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3416 EXPECT_EQ(webrtc::kNetworkUp,
3417 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3418
3419 channel_->OnReadyToSend(false);
3420 EXPECT_EQ(webrtc::kNetworkDown,
3421 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3422 EXPECT_EQ(webrtc::kNetworkUp,
3423 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3424
3425 channel_->OnReadyToSend(true);
3426 EXPECT_EQ(webrtc::kNetworkUp,
3427 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3428 EXPECT_EQ(webrtc::kNetworkUp,
3429 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3430}
3431
stefan658910c2015-09-03 05:48:32 -07003432// Tests that the library initializes and shuts down properly.
3433TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003434 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003435 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003436 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003437 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3438 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003439 EXPECT_TRUE(channel != nullptr);
3440 delete channel;
solenbergff976312016-03-30 23:28:51 -07003441}
stefan658910c2015-09-03 05:48:32 -07003442
solenbergff976312016-03-30 23:28:51 -07003443// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003444TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3445 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3446 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3447 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003448 {
3449 cricket::WebRtcVoiceEngine engine(&adm);
3450 std::unique_ptr<webrtc::Call> call(
3451 webrtc::Call::Create(webrtc::Call::Config()));
3452 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3453 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3454 EXPECT_TRUE(channel != nullptr);
3455 delete channel;
3456 }
stefan658910c2015-09-03 05:48:32 -07003457}
3458
3459// Tests that the library is configured with the codecs we want.
3460TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003461 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003462 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003463 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003464 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003465 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003466 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003467 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003468 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003469 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003470 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003471 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003472 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003473 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003474 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003475 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003476 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003477 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003478 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003479 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003480 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003481 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003482 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003483 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003484 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003485 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003486 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003487 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003488 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003489 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003490 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003491 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003492 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003493 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003494 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003495 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003496 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003497 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003498 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003499 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003500 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003501 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003502 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003503 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003504 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003505 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003506 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003507 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003508 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003509 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003510 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003511 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003512
stefan658910c2015-09-03 05:48:32 -07003513 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003514 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003515 for (std::vector<cricket::AudioCodec>::const_iterator it =
3516 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3517 if (it->name == "CN" && it->clockrate == 16000) {
3518 EXPECT_EQ(105, it->id);
3519 } else if (it->name == "CN" && it->clockrate == 32000) {
3520 EXPECT_EQ(106, it->id);
3521 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3522 EXPECT_EQ(103, it->id);
3523 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3524 EXPECT_EQ(104, it->id);
3525 } else if (it->name == "G722" && it->clockrate == 8000) {
3526 EXPECT_EQ(9, it->id);
3527 } else if (it->name == "telephone-event") {
3528 EXPECT_EQ(126, it->id);
3529 } else if (it->name == "red") {
3530 EXPECT_EQ(127, it->id);
3531 } else if (it->name == "opus") {
3532 EXPECT_EQ(111, it->id);
3533 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3534 EXPECT_EQ("10", it->params.find("minptime")->second);
3535 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3536 EXPECT_EQ("60", it->params.find("maxptime")->second);
3537 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3538 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3539 }
3540 }
stefan658910c2015-09-03 05:48:32 -07003541}
3542
3543// Tests that VoE supports at least 32 channels
3544TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003545 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003546 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003547 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003548
3549 cricket::VoiceMediaChannel* channels[32];
3550 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003551 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003552 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3553 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003554 if (!channel)
3555 break;
stefan658910c2015-09-03 05:48:32 -07003556 channels[num_channels++] = channel;
3557 }
3558
tfarina5237aaf2015-11-10 23:44:30 -08003559 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003560 EXPECT_EQ(expected, num_channels);
3561
3562 while (num_channels > 0) {
3563 delete channels[--num_channels];
3564 }
stefan658910c2015-09-03 05:48:32 -07003565}
3566
3567// Test that we set our preferred codecs properly.
3568TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003569 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003570 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003571 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003572 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3573 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003574 cricket::AudioRecvParameters parameters;
3575 parameters.codecs = engine.codecs();
3576 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003577}