blob: c72775a98504fc7102a9fd920ab47c87faa0d346 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakenetworkinterface.h"
22#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080023#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
solenbergbc37fc82016-04-04 09:54:44 -070027#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000029using cricket::kRtpAudioLevelHeaderExtension;
30using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
deadbeef67cf2c12016-04-13 10:07:16 -070036const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
44const cricket::AudioCodec kTelephoneEventCodec(106,
45 "telephone-event",
46 8000,
47 0,
48 1);
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080050const uint32_t kSsrc2 = 2;
51const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070052const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053
54class FakeVoEWrapper : public cricket::VoEWrapper {
55 public:
56 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
57 : cricket::VoEWrapper(engine, // processing
58 engine, // base
59 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 engine) { // volume
63 }
64};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
solenbergff976312016-03-30 23:28:51 -070067// Tests that our stub library "works".
68TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070069 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
70 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
71 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070072 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
73 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070075 cricket::FakeWebRtcVoiceEngine voe;
76 EXPECT_FALSE(voe.IsInited());
77 {
solenbergbc37fc82016-04-04 09:54:44 -070078 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070079 EXPECT_TRUE(voe.IsInited());
80 }
81 EXPECT_FALSE(voe.IsInited());
82}
83
deadbeef884f5852016-01-15 09:20:04 -080084class FakeAudioSink : public webrtc::AudioSinkInterface {
85 public:
86 void OnData(const Data& audio) override {}
87};
88
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080089class FakeAudioSource : public cricket::AudioSource {
90 void SetSink(Sink* sink) override {}
91};
92
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093class WebRtcVoiceEngineTestFake : public testing::Test {
94 public:
stefanba4c0e42016-02-04 04:12:24 -080095 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
96
97 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070098 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
99 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
100 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700101 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
102 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
103 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergbc37fc82016-04-04 09:54:44 -0700104 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
105 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200106 send_parameters_.codecs.push_back(kPcmuCodec);
107 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 }
solenbergff976312016-03-30 23:28:51 -0700109 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700110 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
111 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200112 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000113 }
solenbergff976312016-03-30 23:28:51 -0700114 bool SetupRecvStream() {
115 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700116 return false;
117 }
118 return channel_->AddRecvStream(
119 cricket::StreamParams::CreateLegacy(kSsrc1));
120 }
solenbergff976312016-03-30 23:28:51 -0700121 bool SetupSendStream() {
122 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000123 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800125 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
126 return false;
127 }
128 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000130 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700131 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700132 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800133 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700134 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700135 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800136 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000137 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700139 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000140 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200142 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 }
145
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100146 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
147 const auto* send_stream = call_.GetAudioSendStream(ssrc);
148 EXPECT_TRUE(send_stream);
149 return *send_stream;
150 }
151
deadbeef884f5852016-01-15 09:20:04 -0800152 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
153 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
154 EXPECT_TRUE(recv_stream);
155 return *recv_stream;
156 }
157
solenberg3a941542015-11-16 07:34:50 -0800158 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800159 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800160 }
161
solenberg7add0582015-11-20 09:59:34 -0800162 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800163 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800164 }
165
solenbergd53a3f92016-04-14 13:56:37 -0700166 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
167 ASSERT_TRUE(channel);
168 if (enable) {
169 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
170 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
171 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
172 }
173 channel->SetSend(enable);
174 }
175
Peter Boström0c4e06b2015-10-07 12:23:21 +0200176 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700177 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000178 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700179 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000180 // send stream.
181 EXPECT_TRUE(channel_->AddSendStream(
182 cricket::StreamParams::CreateLegacy(kSsrc1)));
183 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000184
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200186 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700187 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000188 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800189 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200190 send_parameters_.codecs.push_back(kTelephoneEventCodec);
191 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000192 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000193
194 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700195 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800196 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000197 EXPECT_TRUE(channel_->AddSendStream(
198 cricket::StreamParams::CreateLegacy(kSsrc1)));
199 }
200
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800202 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000203
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100204 // Test send.
205 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
206 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
207 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800208 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100209 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
210 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
211 EXPECT_EQ(2, telephone_event.event_code);
212 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 }
214
215 // Test that send bandwidth is set correctly.
216 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000217 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
218 // |expected_result| is the expected result from SetMaxSendBandwidth().
219 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700220 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
221 int max_bitrate,
222 bool expected_result,
223 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 cricket::AudioSendParameters parameters;
225 parameters.codecs.push_back(codec);
226 parameters.max_bandwidth_bps = max_bitrate;
227 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
228
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000230 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000232 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 }
234
skvlade0d46372016-04-07 22:59:22 -0700235 // Sets the per-stream maximum bitrate limit for the specified SSRC.
236 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
237 webrtc::RtpParameters parameters = channel_->GetRtpParameters(ssrc);
238 EXPECT_EQ(1UL, parameters.encodings.size());
239
240 parameters.encodings[0].max_bitrate_bps = bitrate;
241 return channel_->SetRtpParameters(ssrc, parameters);
242 }
243
244 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
245 cricket::AudioSendParameters send_parameters;
246 send_parameters.codecs.push_back(codec);
247 send_parameters.max_bandwidth_bps = bitrate;
248 return channel_->SetSendParameters(send_parameters);
249 }
250
251 int GetCodecBitrate(int32_t ssrc) {
252 cricket::WebRtcVoiceMediaChannel* media_channel =
253 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
254 int channel = media_channel->GetSendChannelId(ssrc);
255 EXPECT_NE(-1, channel);
256 webrtc::CodecInst codec;
257 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
258 return codec.rate;
259 }
260
261 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
262 int global_max,
263 int stream_max,
264 bool expected_result,
265 int expected_codec_bitrate) {
266 // Clear the bitrate limit from the previous test case.
267 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
268
269 // Attempt to set the requested bitrate limits.
270 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
271 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
272
273 // Verify that reading back the parameters gives results
274 // consistent with the Set() result.
275 webrtc::RtpParameters resulting_parameters =
276 channel_->GetRtpParameters(kSsrc1);
277 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
278 EXPECT_EQ(expected_result ? stream_max : -1,
279 resulting_parameters.encodings[0].max_bitrate_bps);
280
281 // Verify that the codec settings have the expected bitrate.
282 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
283 }
284
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000285 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700286 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000287
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000288 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800289 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000290
291 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200292 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000293 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200294 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800295 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000296
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000297 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200298 send_parameters_.extensions.clear();
299 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800300 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000301
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000302 // Ensure extension is set properly.
303 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200304 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
305 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800306 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
307 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
308 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000309
solenberg7add0582015-11-20 09:59:34 -0800310 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000311 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700312 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800313 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
314 call_.GetAudioSendStream(kSsrc2));
315 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
316 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
317 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000318
319 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200320 send_parameters_.codecs.push_back(kPcmuCodec);
321 send_parameters_.extensions.clear();
322 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800323 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
324 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000325 }
326
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000327 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700328 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000329
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000330 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800331 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000332
333 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800334 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000335 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800336 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
337 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000338
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000339 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800340 recv_parameters_.extensions.clear();
341 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
342 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000343
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000344 // Ensure extension is set properly.
345 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800346 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
347 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
348 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
349 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
350 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000351
solenberg7add0582015-11-20 09:59:34 -0800352 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000353 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700354 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800355 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
356 call_.GetAudioReceiveStream(kSsrc2));
357 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
358 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
359 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000360
361 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800362 recv_parameters_.extensions.clear();
363 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
364 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
365 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000366 }
367
solenberg85a04962015-10-27 03:35:21 -0700368 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
369 webrtc::AudioSendStream::Stats stats;
370 stats.local_ssrc = 12;
371 stats.bytes_sent = 345;
372 stats.packets_sent = 678;
373 stats.packets_lost = 9012;
374 stats.fraction_lost = 34.56f;
375 stats.codec_name = "codec_name_send";
376 stats.ext_seqnum = 789;
377 stats.jitter_ms = 12;
378 stats.rtt_ms = 345;
379 stats.audio_level = 678;
380 stats.aec_quality_min = 9.01f;
381 stats.echo_delay_median_ms = 234;
382 stats.echo_delay_std_ms = 567;
383 stats.echo_return_loss = 890;
384 stats.echo_return_loss_enhancement = 1234;
385 stats.typing_noise_detected = true;
386 return stats;
387 }
388 void SetAudioSendStreamStats() {
389 for (auto* s : call_.GetAudioSendStreams()) {
390 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200391 }
solenberg85a04962015-10-27 03:35:21 -0700392 }
solenberg566ef242015-11-06 15:34:49 -0800393 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
394 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700395 const auto stats = GetAudioSendStreamStats();
396 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
397 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
398 EXPECT_EQ(info.packets_sent, stats.packets_sent);
399 EXPECT_EQ(info.packets_lost, stats.packets_lost);
400 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
401 EXPECT_EQ(info.codec_name, stats.codec_name);
402 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
403 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
404 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
405 EXPECT_EQ(info.audio_level, stats.audio_level);
406 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
407 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
408 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
409 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
410 EXPECT_EQ(info.echo_return_loss_enhancement,
411 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800412 EXPECT_EQ(info.typing_noise_detected,
413 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700414 }
415
416 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
417 webrtc::AudioReceiveStream::Stats stats;
418 stats.remote_ssrc = 123;
419 stats.bytes_rcvd = 456;
420 stats.packets_rcvd = 768;
421 stats.packets_lost = 101;
422 stats.fraction_lost = 23.45f;
423 stats.codec_name = "codec_name_recv";
424 stats.ext_seqnum = 678;
425 stats.jitter_ms = 901;
426 stats.jitter_buffer_ms = 234;
427 stats.jitter_buffer_preferred_ms = 567;
428 stats.delay_estimate_ms = 890;
429 stats.audio_level = 1234;
430 stats.expand_rate = 5.67f;
431 stats.speech_expand_rate = 8.90f;
432 stats.secondary_decoded_rate = 1.23f;
433 stats.accelerate_rate = 4.56f;
434 stats.preemptive_expand_rate = 7.89f;
435 stats.decoding_calls_to_silence_generator = 12;
436 stats.decoding_calls_to_neteq = 345;
437 stats.decoding_normal = 67890;
438 stats.decoding_plc = 1234;
439 stats.decoding_cng = 5678;
440 stats.decoding_plc_cng = 9012;
441 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200442 return stats;
443 }
444 void SetAudioReceiveStreamStats() {
445 for (auto* s : call_.GetAudioReceiveStreams()) {
446 s->SetStats(GetAudioReceiveStreamStats());
447 }
448 }
449 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700450 const auto stats = GetAudioReceiveStreamStats();
451 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
452 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
453 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
454 EXPECT_EQ(info.packets_lost, stats.packets_lost);
455 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
456 EXPECT_EQ(info.codec_name, stats.codec_name);
457 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
458 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
459 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200460 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700461 stats.jitter_buffer_preferred_ms);
462 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
463 EXPECT_EQ(info.audio_level, stats.audio_level);
464 EXPECT_EQ(info.expand_rate, stats.expand_rate);
465 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
466 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
467 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
468 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200469 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700470 stats.decoding_calls_to_silence_generator);
471 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
472 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
473 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
474 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
475 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
476 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200477 }
478
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700480 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200481 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700483 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700484 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200485 cricket::AudioSendParameters send_parameters_;
486 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800487 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800488 private:
489 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490};
491
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492// Tests that we can create and destroy a channel.
493TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700494 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000495}
496
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700498// correctly (such that opus appears first).
499TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700500 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000501 ASSERT_FALSE(codecs.empty());
502 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
503 EXPECT_EQ(48000, codecs[0].clockrate);
504 EXPECT_EQ(2, codecs[0].channels);
505 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506}
507
stefanba4c0e42016-02-04 04:12:24 -0800508TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700509 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800510 bool opus_found = false;
511 for (cricket::AudioCodec codec : codecs) {
512 if (codec.name == "opus") {
513 EXPECT_TRUE(HasTransportCc(codec));
514 opus_found = true;
515 }
516 }
517 EXPECT_TRUE(opus_found);
518}
519
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520// Tests that we can find codecs by name or id, and that we interpret the
521// clockrate and bitrate fields properly.
522TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
523 cricket::AudioCodec codec;
524 webrtc::CodecInst codec_inst;
525 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800526 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800528 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000529 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800530 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
531 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 // Find ISAC with a different payload id.
533 codec = kIsacCodec;
534 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800535 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000536 EXPECT_EQ(codec.id, codec_inst.pltype);
537 // Find PCMU with a 0 clockrate.
538 codec = kPcmuCodec;
539 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800540 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 EXPECT_EQ(codec.id, codec_inst.pltype);
542 EXPECT_EQ(8000, codec_inst.plfreq);
543 // Find PCMU with a 0 bitrate.
544 codec = kPcmuCodec;
545 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800546 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547 EXPECT_EQ(codec.id, codec_inst.pltype);
548 EXPECT_EQ(64000, codec_inst.rate);
549 // Find ISAC with an explicit bitrate.
550 codec = kIsacCodec;
551 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800552 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 EXPECT_EQ(codec.id, codec_inst.pltype);
554 EXPECT_EQ(32000, codec_inst.rate);
555}
556
557// Test that we set our inbound codecs properly, including changing PT.
558TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700559 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200560 cricket::AudioRecvParameters parameters;
561 parameters.codecs.push_back(kIsacCodec);
562 parameters.codecs.push_back(kPcmuCodec);
563 parameters.codecs.push_back(kTelephoneEventCodec);
564 parameters.codecs[0].id = 106; // collide with existing telephone-event
565 parameters.codecs[2].id = 126;
566 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700567 EXPECT_TRUE(channel_->AddRecvStream(
568 cricket::StreamParams::CreateLegacy(kSsrc1)));
569 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800571 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 gcodec.plfreq = 16000;
573 gcodec.channels = 1;
574 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
575 EXPECT_EQ(106, gcodec.pltype);
576 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800577 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578 gcodec.plfreq = 8000;
579 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
580 EXPECT_EQ(126, gcodec.pltype);
581 EXPECT_STREQ("telephone-event", gcodec.plname);
582}
583
584// Test that we fail to set an unknown inbound codec.
585TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700586 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200587 cricket::AudioRecvParameters parameters;
588 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700589 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200590 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591}
592
593// Test that we fail if we have duplicate types in the inbound list.
594TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700595 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200596 cricket::AudioRecvParameters parameters;
597 parameters.codecs.push_back(kIsacCodec);
598 parameters.codecs.push_back(kCn16000Codec);
599 parameters.codecs[1].id = kIsacCodec.id;
600 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601}
602
603// Test that we can decode OPUS without stereo parameters.
604TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700605 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200606 cricket::AudioRecvParameters parameters;
607 parameters.codecs.push_back(kIsacCodec);
608 parameters.codecs.push_back(kPcmuCodec);
609 parameters.codecs.push_back(kOpusCodec);
610 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 EXPECT_TRUE(channel_->AddRecvStream(
612 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700613 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800615 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616 // Even without stereo parameters, recv codecs still specify channels = 2.
617 EXPECT_EQ(2, opus.channels);
618 EXPECT_EQ(111, opus.pltype);
619 EXPECT_STREQ("opus", opus.plname);
620 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700621 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 EXPECT_EQ(111, opus.pltype);
623}
624
625// Test that we can decode OPUS with stereo = 0.
626TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700627 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200628 cricket::AudioRecvParameters parameters;
629 parameters.codecs.push_back(kIsacCodec);
630 parameters.codecs.push_back(kPcmuCodec);
631 parameters.codecs.push_back(kOpusCodec);
632 parameters.codecs[2].params["stereo"] = "0";
633 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 EXPECT_TRUE(channel_->AddRecvStream(
635 cricket::StreamParams::CreateLegacy(kSsrc1)));
636 int channel_num2 = voe_.GetLastChannel();
637 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800638 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 // Even when stereo is off, recv codecs still specify channels = 2.
640 EXPECT_EQ(2, opus.channels);
641 EXPECT_EQ(111, opus.pltype);
642 EXPECT_STREQ("opus", opus.plname);
643 opus.pltype = 0;
644 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
645 EXPECT_EQ(111, opus.pltype);
646}
647
648// Test that we can decode OPUS with stereo = 1.
649TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700650 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200651 cricket::AudioRecvParameters parameters;
652 parameters.codecs.push_back(kIsacCodec);
653 parameters.codecs.push_back(kPcmuCodec);
654 parameters.codecs.push_back(kOpusCodec);
655 parameters.codecs[2].params["stereo"] = "1";
656 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657 EXPECT_TRUE(channel_->AddRecvStream(
658 cricket::StreamParams::CreateLegacy(kSsrc1)));
659 int channel_num2 = voe_.GetLastChannel();
660 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800661 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_EQ(2, opus.channels);
663 EXPECT_EQ(111, opus.pltype);
664 EXPECT_STREQ("opus", opus.plname);
665 opus.pltype = 0;
666 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
667 EXPECT_EQ(111, opus.pltype);
668}
669
670// Test that changes to recv codecs are applied to all streams.
671TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700672 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200673 cricket::AudioRecvParameters parameters;
674 parameters.codecs.push_back(kIsacCodec);
675 parameters.codecs.push_back(kPcmuCodec);
676 parameters.codecs.push_back(kTelephoneEventCodec);
677 parameters.codecs[0].id = 106; // collide with existing telephone-event
678 parameters.codecs[2].id = 126;
679 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 EXPECT_TRUE(channel_->AddRecvStream(
681 cricket::StreamParams::CreateLegacy(kSsrc1)));
682 int channel_num2 = voe_.GetLastChannel();
683 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800684 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 gcodec.plfreq = 16000;
686 gcodec.channels = 1;
687 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
688 EXPECT_EQ(106, gcodec.pltype);
689 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800690 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 gcodec.plfreq = 8000;
692 gcodec.channels = 1;
693 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
694 EXPECT_EQ(126, gcodec.pltype);
695 EXPECT_STREQ("telephone-event", gcodec.plname);
696}
697
698TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700699 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200700 cricket::AudioRecvParameters parameters;
701 parameters.codecs.push_back(kIsacCodec);
702 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200703 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704
705 int channel_num2 = voe_.GetLastChannel();
706 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800707 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 gcodec.plfreq = 16000;
709 gcodec.channels = 1;
710 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
711 EXPECT_EQ(106, gcodec.pltype);
712 EXPECT_STREQ("ISAC", gcodec.plname);
713}
714
715// Test that we can apply the same set of codecs again while playing.
716TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700717 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200718 cricket::AudioRecvParameters parameters;
719 parameters.codecs.push_back(kIsacCodec);
720 parameters.codecs.push_back(kCn16000Codec);
721 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200723 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724
725 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200726 parameters.codecs[0].id = 127;
727 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
728 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000729 EXPECT_TRUE(voe_.GetPlayout(channel_num));
730}
731
732// Test that we can add a codec while playing.
733TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700734 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200735 cricket::AudioRecvParameters parameters;
736 parameters.codecs.push_back(kIsacCodec);
737 parameters.codecs.push_back(kCn16000Codec);
738 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 EXPECT_TRUE(channel_->SetPlayout(true));
740
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200741 parameters.codecs.push_back(kOpusCodec);
742 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
743 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 EXPECT_TRUE(voe_.GetPlayout(channel_num));
745 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800746 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
748}
749
750TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700751 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000753 // Test that when autobw is enabled, bitrate is kept as the default
754 // value. autobw is enabled for the following tests because the target
755 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756
757 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700758 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759
760 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700761 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700764 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765}
766
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000767TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700768 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000770 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771
772 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700773 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
774 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
775 // Rates above the max (56000) should be capped.
776 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700779 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
780 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
781 // Rates above the max (510000) should be capped.
782 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783}
784
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000785TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700786 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000787
788 // Test that we can only set a maximum bitrate for a fixed-rate codec
789 // if it's bigger than the fixed rate.
790
791 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700792 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
793 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
794 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
795 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
796 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
797 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
798 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000799}
800
801TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700802 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200803 const int kDesiredBitrate = 128000;
804 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700805 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200806 parameters.max_bandwidth_bps = kDesiredBitrate;
807 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000808
809 EXPECT_TRUE(channel_->AddSendStream(
810 cricket::StreamParams::CreateLegacy(kSsrc1)));
811
812 int channel_num = voe_.GetLastChannel();
813 webrtc::CodecInst codec;
814 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200815 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000816}
817
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818// Test that bitrate cannot be set for CBR codecs.
819// Bitrate is ignored if it is higher than the fixed bitrate.
820// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000821TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700822 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823
824 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200825 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
826 int channel_num = voe_.GetLastChannel();
827 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
829 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200830
831 send_parameters_.max_bandwidth_bps = 128000;
832 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
834 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835
836 send_parameters_.max_bandwidth_bps = 128;
837 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
839 EXPECT_EQ(64000, codec.rate);
840}
841
skvlade0d46372016-04-07 22:59:22 -0700842// Test that the per-stream bitrate limit and the global
843// bitrate limit both apply.
844TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
845 EXPECT_TRUE(SetupSendStream());
846
847 // opus, default bitrate == 64000.
848 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
849 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
850 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
851 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
852
853 // CBR codecs allow both maximums to exceed the bitrate.
854 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
855 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
856 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
857 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
858
859 // CBR codecs don't allow per stream maximums to be too low.
860 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
861 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
862}
863
864// Test that an attempt to set RtpParameters for a stream that does not exist
865// fails.
866TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
867 EXPECT_TRUE(SetupChannel());
868 webrtc::RtpParameters nonexistent_parameters =
869 channel_->GetRtpParameters(kSsrc1);
870 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
871
872 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
873 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, nonexistent_parameters));
874}
875
876TEST_F(WebRtcVoiceEngineTestFake,
877 CannotSetRtpParametersWithIncorrectNumberOfEncodings) {
878 // This test verifies that setting RtpParameters succeeds only if
879 // the structure contains exactly one encoding.
880 // TODO(skvlad): Update this test when we start supporting setting parameters
881 // for each encoding individually.
882
883 EXPECT_TRUE(SetupSendStream());
884 // Setting RtpParameters with no encoding is expected to fail.
885 webrtc::RtpParameters parameters;
886 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
887 // Setting RtpParameters with exactly one encoding should succeed.
888 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
889 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
890 // Two or more encodings should result in failure.
891 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
892 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
893}
894
895// Test that SetRtpParameters configures the correct encoding channel for each
896// SSRC.
897TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
898 SetupForMultiSendStream();
899 // Create send streams.
900 for (uint32_t ssrc : kSsrcs4) {
901 EXPECT_TRUE(
902 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
903 }
904 // Configure one stream to be limited by the stream config, another to be
905 // limited by the global max, and the third one with no per-stream limit
906 // (still subject to the global limit).
907 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
908 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
909 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
910 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
911
912 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
913 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
914 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
915
916 // Remove the global cap; the streams should switch to their respective
917 // maximums (or remain unchanged if there was no other limit on them.)
918 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
919 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
920 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
921 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
922}
923
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700924// Test that GetRtpParameters returns the currently configured codecs.
925TEST_F(WebRtcVoiceEngineTestFake, GetRtpParametersCodecs) {
926 EXPECT_TRUE(SetupSendStream());
927 cricket::AudioSendParameters parameters;
928 parameters.codecs.push_back(kIsacCodec);
929 parameters.codecs.push_back(kPcmuCodec);
930 EXPECT_TRUE(channel_->SetSendParameters(parameters));
931
932 webrtc::RtpParameters rtp_parameters = channel_->GetRtpParameters(kSsrc1);
933 ASSERT_EQ(2u, rtp_parameters.codecs.size());
934 EXPECT_EQ(kIsacCodec.id, rtp_parameters.codecs[0].payload_type);
935 EXPECT_EQ(kIsacCodec.name, rtp_parameters.codecs[0].mime_type);
936 EXPECT_EQ(kIsacCodec.clockrate, rtp_parameters.codecs[0].clock_rate);
937 EXPECT_EQ(kIsacCodec.channels, rtp_parameters.codecs[0].channels);
938 EXPECT_EQ(kPcmuCodec.id, rtp_parameters.codecs[1].payload_type);
939 EXPECT_EQ(kPcmuCodec.name, rtp_parameters.codecs[1].mime_type);
940 EXPECT_EQ(kPcmuCodec.clockrate, rtp_parameters.codecs[1].clock_rate);
941 EXPECT_EQ(kPcmuCodec.channels, rtp_parameters.codecs[1].channels);
942}
943
944// Test that if we set/get parameters multiple times, we get the same results.
945TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpParameters) {
946 EXPECT_TRUE(SetupSendStream());
947 cricket::AudioSendParameters parameters;
948 parameters.codecs.push_back(kIsacCodec);
949 parameters.codecs.push_back(kPcmuCodec);
950 EXPECT_TRUE(channel_->SetSendParameters(parameters));
951
952 webrtc::RtpParameters initial_params = channel_->GetRtpParameters(kSsrc1);
953
954 // We should be able to set the params we just got.
955 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, initial_params));
956
957 // ... And this shouldn't change the params returned by GetRtpParameters.
958 webrtc::RtpParameters new_params = channel_->GetRtpParameters(kSsrc1);
959 EXPECT_EQ(initial_params, channel_->GetRtpParameters(kSsrc1));
960}
961
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000962// Test that we apply codecs properly.
963TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700964 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200965 cricket::AudioSendParameters parameters;
966 parameters.codecs.push_back(kIsacCodec);
967 parameters.codecs.push_back(kPcmuCodec);
968 parameters.codecs.push_back(kRedCodec);
969 parameters.codecs[0].id = 96;
970 parameters.codecs[0].bitrate = 48000;
971 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000972 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200973 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000974 webrtc::CodecInst gcodec;
975 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
976 EXPECT_EQ(96, gcodec.pltype);
977 EXPECT_EQ(48000, gcodec.rate);
978 EXPECT_STREQ("ISAC", gcodec.plname);
979 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000980 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
982 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100983 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984}
985
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000986// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
987// to apply.
988TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700989 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200990 cricket::AudioSendParameters parameters;
991 parameters.codecs.push_back(kIsacCodec);
992 parameters.codecs.push_back(kPcmuCodec);
993 parameters.codecs.push_back(kRedCodec);
994 parameters.codecs[0].id = 96;
995 parameters.codecs[0].bitrate = 48000;
996 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000997 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
998 // Calling SetSendCodec again with same codec which is already set.
999 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001000 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001001 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1002}
1003
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001004// Verify that G722 is set with 16000 samples per second to WebRTC.
1005TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001006 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001007 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001008 cricket::AudioSendParameters parameters;
1009 parameters.codecs.push_back(kG722CodecSdp);
1010 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001011 webrtc::CodecInst gcodec;
1012 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1013 EXPECT_STREQ("G722", gcodec.plname);
1014 EXPECT_EQ(1, gcodec.channels);
1015 EXPECT_EQ(16000, gcodec.plfreq);
1016}
1017
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001018// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001020 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001021 cricket::AudioSendParameters parameters;
1022 parameters.codecs.push_back(kOpusCodec);
1023 parameters.codecs[0].bitrate = 0;
1024 parameters.codecs[0].clockrate = 50000;
1025 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026}
1027
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001028// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001029TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001030 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001031 cricket::AudioSendParameters parameters;
1032 parameters.codecs.push_back(kOpusCodec);
1033 parameters.codecs[0].bitrate = 0;
1034 parameters.codecs[0].channels = 0;
1035 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036}
1037
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001038// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001039TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001040 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001041 cricket::AudioSendParameters parameters;
1042 parameters.codecs.push_back(kOpusCodec);
1043 parameters.codecs[0].bitrate = 0;
1044 parameters.codecs[0].channels = 0;
1045 parameters.codecs[0].params["stereo"] = "1";
1046 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001047}
1048
1049// Test that if channel is 1 for opus and there's no stereo, we fail.
1050TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001051 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001052 cricket::AudioSendParameters parameters;
1053 parameters.codecs.push_back(kOpusCodec);
1054 parameters.codecs[0].bitrate = 0;
1055 parameters.codecs[0].channels = 1;
1056 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057}
1058
1059// Test that if channel is 1 for opus and stereo=0, we fail.
1060TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001061 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001062 cricket::AudioSendParameters parameters;
1063 parameters.codecs.push_back(kOpusCodec);
1064 parameters.codecs[0].bitrate = 0;
1065 parameters.codecs[0].channels = 1;
1066 parameters.codecs[0].params["stereo"] = "0";
1067 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001068}
1069
1070// Test that if channel is 1 for opus and stereo=1, we fail.
1071TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001072 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001073 cricket::AudioSendParameters parameters;
1074 parameters.codecs.push_back(kOpusCodec);
1075 parameters.codecs[0].bitrate = 0;
1076 parameters.codecs[0].channels = 1;
1077 parameters.codecs[0].params["stereo"] = "1";
1078 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079}
1080
1081// Test that with bitrate=0 and no stereo,
1082// channels and bitrate are 1 and 32000.
1083TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001084 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001086 cricket::AudioSendParameters parameters;
1087 parameters.codecs.push_back(kOpusCodec);
1088 parameters.codecs[0].bitrate = 0;
1089 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001090 webrtc::CodecInst gcodec;
1091 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1092 EXPECT_STREQ("opus", gcodec.plname);
1093 EXPECT_EQ(1, gcodec.channels);
1094 EXPECT_EQ(32000, gcodec.rate);
1095}
1096
1097// Test that with bitrate=0 and stereo=0,
1098// channels and bitrate are 1 and 32000.
1099TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001100 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001102 cricket::AudioSendParameters parameters;
1103 parameters.codecs.push_back(kOpusCodec);
1104 parameters.codecs[0].bitrate = 0;
1105 parameters.codecs[0].params["stereo"] = "0";
1106 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 webrtc::CodecInst gcodec;
1108 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1109 EXPECT_STREQ("opus", gcodec.plname);
1110 EXPECT_EQ(1, gcodec.channels);
1111 EXPECT_EQ(32000, gcodec.rate);
1112}
1113
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001114// Test that with bitrate=invalid and stereo=0,
1115// channels and bitrate are 1 and 32000.
1116TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001117 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001118 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001119 cricket::AudioSendParameters parameters;
1120 parameters.codecs.push_back(kOpusCodec);
1121 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001122 webrtc::CodecInst gcodec;
1123
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001124 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001125 parameters.codecs[0].bitrate = 5999;
1126 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001127 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1128 EXPECT_STREQ("opus", gcodec.plname);
1129 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001130 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001131
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001132 parameters.codecs[0].bitrate = 510001;
1133 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001134 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1135 EXPECT_STREQ("opus", gcodec.plname);
1136 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001137 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001138}
1139
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140// Test that with bitrate=0 and stereo=1,
1141// channels and bitrate are 2 and 64000.
1142TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001143 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001144 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001145 cricket::AudioSendParameters parameters;
1146 parameters.codecs.push_back(kOpusCodec);
1147 parameters.codecs[0].bitrate = 0;
1148 parameters.codecs[0].params["stereo"] = "1";
1149 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 webrtc::CodecInst gcodec;
1151 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1152 EXPECT_STREQ("opus", gcodec.plname);
1153 EXPECT_EQ(2, gcodec.channels);
1154 EXPECT_EQ(64000, gcodec.rate);
1155}
1156
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001157// Test that with bitrate=invalid and stereo=1,
1158// channels and bitrate are 2 and 64000.
1159TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001160 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001161 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001162 cricket::AudioSendParameters parameters;
1163 parameters.codecs.push_back(kOpusCodec);
1164 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001165 webrtc::CodecInst gcodec;
1166
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001167 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 parameters.codecs[0].bitrate = 5999;
1169 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001170 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1171 EXPECT_STREQ("opus", gcodec.plname);
1172 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001173 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001174
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001175 parameters.codecs[0].bitrate = 510001;
1176 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001177 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1178 EXPECT_STREQ("opus", gcodec.plname);
1179 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001180 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001181}
1182
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183// Test that with bitrate=N and stereo unset,
1184// channels and bitrate are 1 and N.
1185TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001186 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001188 cricket::AudioSendParameters parameters;
1189 parameters.codecs.push_back(kOpusCodec);
1190 parameters.codecs[0].bitrate = 96000;
1191 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 webrtc::CodecInst gcodec;
1193 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1194 EXPECT_EQ(111, gcodec.pltype);
1195 EXPECT_EQ(96000, gcodec.rate);
1196 EXPECT_STREQ("opus", gcodec.plname);
1197 EXPECT_EQ(1, gcodec.channels);
1198 EXPECT_EQ(48000, gcodec.plfreq);
1199}
1200
1201// Test that with bitrate=N and stereo=0,
1202// channels and bitrate are 1 and N.
1203TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001204 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001205 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001206 cricket::AudioSendParameters parameters;
1207 parameters.codecs.push_back(kOpusCodec);
1208 parameters.codecs[0].bitrate = 30000;
1209 parameters.codecs[0].params["stereo"] = "0";
1210 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001211 webrtc::CodecInst gcodec;
1212 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1213 EXPECT_EQ(1, gcodec.channels);
1214 EXPECT_EQ(30000, gcodec.rate);
1215 EXPECT_STREQ("opus", gcodec.plname);
1216}
1217
1218// Test that with bitrate=N and without any parameters,
1219// channels and bitrate are 1 and N.
1220TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001221 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001223 cricket::AudioSendParameters parameters;
1224 parameters.codecs.push_back(kOpusCodec);
1225 parameters.codecs[0].bitrate = 30000;
1226 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227 webrtc::CodecInst gcodec;
1228 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1229 EXPECT_EQ(1, gcodec.channels);
1230 EXPECT_EQ(30000, gcodec.rate);
1231 EXPECT_STREQ("opus", gcodec.plname);
1232}
1233
1234// Test that with bitrate=N and stereo=1,
1235// channels and bitrate are 2 and N.
1236TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001237 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001239 cricket::AudioSendParameters parameters;
1240 parameters.codecs.push_back(kOpusCodec);
1241 parameters.codecs[0].bitrate = 30000;
1242 parameters.codecs[0].params["stereo"] = "1";
1243 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001244 webrtc::CodecInst gcodec;
1245 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1246 EXPECT_EQ(2, gcodec.channels);
1247 EXPECT_EQ(30000, gcodec.rate);
1248 EXPECT_STREQ("opus", gcodec.plname);
1249}
1250
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001251// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1252// Also test that the "maxaveragebitrate" can't be set to values outside the
1253// range of 6000 and 510000
1254TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001255 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001256 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001257 cricket::AudioSendParameters parameters;
1258 parameters.codecs.push_back(kOpusCodec);
1259 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001260 webrtc::CodecInst gcodec;
1261
1262 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001263 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1264 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001265 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001266 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001267
1268 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001269 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1270 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001271 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001272 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001273
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001274 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1275 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001276 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1277 EXPECT_EQ(200000, gcodec.rate);
1278}
1279
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001280// Test that we can enable NACK with opus as caller.
1281TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001282 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001283 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 cricket::AudioSendParameters parameters;
1285 parameters.codecs.push_back(kOpusCodec);
1286 parameters.codecs[0].AddFeedbackParam(
1287 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1288 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001289 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 EXPECT_TRUE(voe_.GetNACK(channel_num));
1292}
1293
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001294// Test that we can enable NACK with opus as callee.
1295TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001296 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001297 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001298 cricket::AudioSendParameters parameters;
1299 parameters.codecs.push_back(kOpusCodec);
1300 parameters.codecs[0].AddFeedbackParam(
1301 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1302 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001303 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001304 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001305 EXPECT_FALSE(voe_.GetNACK(channel_num));
1306
1307 EXPECT_TRUE(channel_->AddSendStream(
1308 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001309 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001310}
1311
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001312// Test that we can enable NACK on receive streams.
1313TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001314 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315 int channel_num1 = voe_.GetLastChannel();
1316 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1317 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001318 cricket::AudioSendParameters parameters;
1319 parameters.codecs.push_back(kOpusCodec);
1320 parameters.codecs[0].AddFeedbackParam(
1321 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1322 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001323 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1324 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001325 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1327 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1328}
1329
1330// Test that we can disable NACK.
1331TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001332 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001333 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001334 cricket::AudioSendParameters parameters;
1335 parameters.codecs.push_back(kOpusCodec);
1336 parameters.codecs[0].AddFeedbackParam(
1337 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1338 cricket::kParamValueEmpty));
1339 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340 EXPECT_TRUE(voe_.GetNACK(channel_num));
1341
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001342 parameters.codecs.clear();
1343 parameters.codecs.push_back(kOpusCodec);
1344 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001345 EXPECT_FALSE(voe_.GetNACK(channel_num));
1346}
1347
1348// Test that we can disable NACK on receive streams.
1349TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001350 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001351 int channel_num1 = voe_.GetLastChannel();
1352 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1353 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001354 cricket::AudioSendParameters parameters;
1355 parameters.codecs.push_back(kOpusCodec);
1356 parameters.codecs[0].AddFeedbackParam(
1357 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1358 cricket::kParamValueEmpty));
1359 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1361 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1362
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 parameters.codecs.clear();
1364 parameters.codecs.push_back(kOpusCodec);
1365 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001366 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1367 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1368}
1369
1370// Test that NACK is enabled on a new receive stream.
1371TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001372 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 cricket::AudioSendParameters parameters;
1375 parameters.codecs.push_back(kIsacCodec);
1376 parameters.codecs.push_back(kCn16000Codec);
1377 parameters.codecs[0].AddFeedbackParam(
1378 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1379 cricket::kParamValueEmpty));
1380 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001381 EXPECT_TRUE(voe_.GetNACK(channel_num));
1382
1383 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1384 channel_num = voe_.GetLastChannel();
1385 EXPECT_TRUE(voe_.GetNACK(channel_num));
1386 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1387 channel_num = voe_.GetLastChannel();
1388 EXPECT_TRUE(voe_.GetNACK(channel_num));
1389}
1390
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001391// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001392TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001393 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001394 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001395 cricket::AudioSendParameters parameters;
1396 parameters.codecs.push_back(kOpusCodec);
1397 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001398 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1399}
1400
1401// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001402TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001403 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001404 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001405 cricket::AudioSendParameters parameters;
1406 parameters.codecs.push_back(kOpusCodec);
1407 parameters.codecs[0].bitrate = 0;
1408 parameters.codecs[0].params["useinbandfec"] = "0";
1409 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001410 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1411 webrtc::CodecInst gcodec;
1412 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1413 EXPECT_STREQ("opus", gcodec.plname);
1414 EXPECT_EQ(1, gcodec.channels);
1415 EXPECT_EQ(32000, gcodec.rate);
1416}
1417
1418// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001419TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001420 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001421 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001422 cricket::AudioSendParameters parameters;
1423 parameters.codecs.push_back(kOpusCodec);
1424 parameters.codecs[0].bitrate = 0;
1425 parameters.codecs[0].params["useinbandfec"] = "1";
1426 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001427 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1428 webrtc::CodecInst gcodec;
1429 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1430 EXPECT_STREQ("opus", gcodec.plname);
1431 EXPECT_EQ(1, gcodec.channels);
1432 EXPECT_EQ(32000, gcodec.rate);
1433}
1434
1435// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001436TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001437 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001438 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001439 cricket::AudioSendParameters parameters;
1440 parameters.codecs.push_back(kOpusCodec);
1441 parameters.codecs[0].bitrate = 0;
1442 parameters.codecs[0].params["stereo"] = "1";
1443 parameters.codecs[0].params["useinbandfec"] = "1";
1444 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001445 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1446 webrtc::CodecInst gcodec;
1447 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1448 EXPECT_STREQ("opus", gcodec.plname);
1449 EXPECT_EQ(2, gcodec.channels);
1450 EXPECT_EQ(64000, gcodec.rate);
1451}
1452
1453// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001454TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001455 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001456 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001457 cricket::AudioSendParameters parameters;
1458 parameters.codecs.push_back(kIsacCodec);
1459 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001460 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1461}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001462
1463// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1464TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001465 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001466 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001467 cricket::AudioSendParameters parameters;
1468 parameters.codecs.push_back(kIsacCodec);
1469 parameters.codecs[0].params["useinbandfec"] = "1";
1470 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001471 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1472}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001473
1474// Test that Opus FEC status can be changed.
1475TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001476 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001477 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001478 cricket::AudioSendParameters parameters;
1479 parameters.codecs.push_back(kOpusCodec);
1480 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001481 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001482 parameters.codecs[0].params["useinbandfec"] = "1";
1483 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001484 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1485}
1486
stefanba4c0e42016-02-04 04:12:24 -08001487TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001488 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001489 cricket::AudioSendParameters send_parameters;
1490 send_parameters.codecs.push_back(kOpusCodec);
1491 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1492 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1493
1494 cricket::AudioRecvParameters recv_parameters;
1495 recv_parameters.codecs.push_back(kIsacCodec);
1496 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1497 EXPECT_TRUE(
1498 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1499 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1500 EXPECT_FALSE(
1501 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1502
solenbergbc37fc82016-04-04 09:54:44 -07001503 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001504 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1505 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1506 EXPECT_TRUE(
1507 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1508}
1509
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001510// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1511TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001512 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001513 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001514 cricket::AudioSendParameters parameters;
1515 parameters.codecs.push_back(kOpusCodec);
1516 parameters.codecs[0].bitrate = 0;
1517 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1518 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001519 EXPECT_EQ(cricket::kOpusBandwidthNb,
1520 voe_.GetMaxEncodingBandwidth(channel_num));
1521 webrtc::CodecInst gcodec;
1522 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1523 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001524
1525 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001526 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1527 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001528 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1529 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001530}
1531
1532// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1533TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001534 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001535 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001536 cricket::AudioSendParameters parameters;
1537 parameters.codecs.push_back(kOpusCodec);
1538 parameters.codecs[0].bitrate = 0;
1539 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1540 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001541 EXPECT_EQ(cricket::kOpusBandwidthMb,
1542 voe_.GetMaxEncodingBandwidth(channel_num));
1543 webrtc::CodecInst gcodec;
1544 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1545 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001546
1547 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001548 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1549 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001550 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1551 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001552}
1553
1554// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1555TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001556 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001557 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001558 cricket::AudioSendParameters parameters;
1559 parameters.codecs.push_back(kOpusCodec);
1560 parameters.codecs[0].bitrate = 0;
1561 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1562 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001563 EXPECT_EQ(cricket::kOpusBandwidthWb,
1564 voe_.GetMaxEncodingBandwidth(channel_num));
1565 webrtc::CodecInst gcodec;
1566 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1567 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001568
1569 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001570 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1571 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001572 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1573 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001574}
1575
1576// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1577TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001578 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001579 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001580 cricket::AudioSendParameters parameters;
1581 parameters.codecs.push_back(kOpusCodec);
1582 parameters.codecs[0].bitrate = 0;
1583 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1584 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001585 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1586 voe_.GetMaxEncodingBandwidth(channel_num));
1587 webrtc::CodecInst gcodec;
1588 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1589 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001590
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001591 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001592 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1593 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001594 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1595 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001596}
1597
1598// Test 24000 < maxplaybackrate triggers Opus full band mode.
1599TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001600 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001601 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001602 cricket::AudioSendParameters parameters;
1603 parameters.codecs.push_back(kOpusCodec);
1604 parameters.codecs[0].bitrate = 0;
1605 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1606 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001607 EXPECT_EQ(cricket::kOpusBandwidthFb,
1608 voe_.GetMaxEncodingBandwidth(channel_num));
1609 webrtc::CodecInst gcodec;
1610 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1611 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001612
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001613 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001614 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1615 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001616 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1617 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001618}
1619
1620// Test Opus that without maxplaybackrate, default playback rate is used.
1621TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001622 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001623 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001624 cricket::AudioSendParameters parameters;
1625 parameters.codecs.push_back(kOpusCodec);
1626 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001627 EXPECT_EQ(cricket::kOpusBandwidthFb,
1628 voe_.GetMaxEncodingBandwidth(channel_num));
1629}
1630
1631// Test the with non-Opus, maxplaybackrate has no effect.
1632TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001633 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001634 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001635 cricket::AudioSendParameters parameters;
1636 parameters.codecs.push_back(kIsacCodec);
1637 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1638 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001639 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1640}
1641
1642// Test maxplaybackrate can be set on two streams.
1643TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001644 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001645 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001646 cricket::AudioSendParameters parameters;
1647 parameters.codecs.push_back(kOpusCodec);
1648 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001649 // Default bandwidth is 24000.
1650 EXPECT_EQ(cricket::kOpusBandwidthFb,
1651 voe_.GetMaxEncodingBandwidth(channel_num));
1652
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001653 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001654
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001655 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001656 EXPECT_EQ(cricket::kOpusBandwidthNb,
1657 voe_.GetMaxEncodingBandwidth(channel_num));
1658
1659 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1660 channel_num = voe_.GetLastChannel();
1661 EXPECT_EQ(cricket::kOpusBandwidthNb,
1662 voe_.GetMaxEncodingBandwidth(channel_num));
1663}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001664
Minyue Li7100dcd2015-03-27 05:05:59 +01001665// Test that with usedtx=0, Opus DTX is off.
1666TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001667 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001668 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 cricket::AudioSendParameters parameters;
1670 parameters.codecs.push_back(kOpusCodec);
1671 parameters.codecs[0].params["usedtx"] = "0";
1672 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001673 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1674}
1675
1676// Test that with usedtx=1, Opus DTX is on.
1677TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001678 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001679 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001680 cricket::AudioSendParameters parameters;
1681 parameters.codecs.push_back(kOpusCodec);
1682 parameters.codecs[0].params["usedtx"] = "1";
1683 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001684 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1685 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1686}
1687
1688// Test that usedtx=1 works with stereo Opus.
1689TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001690 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001691 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001692 cricket::AudioSendParameters parameters;
1693 parameters.codecs.push_back(kOpusCodec);
1694 parameters.codecs[0].params["usedtx"] = "1";
1695 parameters.codecs[0].params["stereo"] = "1";
1696 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001697 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1698 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1699}
1700
1701// Test that usedtx=1 does not work with non Opus.
1702TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001703 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001704 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001705 cricket::AudioSendParameters parameters;
1706 parameters.codecs.push_back(kIsacCodec);
1707 parameters.codecs[0].params["usedtx"] = "1";
1708 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001709 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1710}
1711
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001712// Test that we can switch back and forth between Opus and ISAC with CN.
1713TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001714 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001716 cricket::AudioSendParameters opus_parameters;
1717 opus_parameters.codecs.push_back(kOpusCodec);
1718 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 webrtc::CodecInst gcodec;
1720 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001721 EXPECT_EQ(111, gcodec.pltype);
1722 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001724 cricket::AudioSendParameters isac_parameters;
1725 isac_parameters.codecs.push_back(kIsacCodec);
1726 isac_parameters.codecs.push_back(kCn16000Codec);
1727 isac_parameters.codecs.push_back(kOpusCodec);
1728 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001729 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1730 EXPECT_EQ(103, gcodec.pltype);
1731 EXPECT_STREQ("ISAC", gcodec.plname);
1732
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001733 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001735 EXPECT_EQ(111, gcodec.pltype);
1736 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737}
1738
1739// Test that we handle various ways of specifying bitrate.
1740TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001741 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001743 cricket::AudioSendParameters parameters;
1744 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1745 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 webrtc::CodecInst gcodec;
1747 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1748 EXPECT_EQ(103, gcodec.pltype);
1749 EXPECT_STREQ("ISAC", gcodec.plname);
1750 EXPECT_EQ(32000, gcodec.rate);
1751
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001752 parameters.codecs[0].bitrate = 0; // bitrate == default
1753 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001754 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1755 EXPECT_EQ(103, gcodec.pltype);
1756 EXPECT_STREQ("ISAC", gcodec.plname);
1757 EXPECT_EQ(-1, gcodec.rate);
1758
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001759 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1760 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1762 EXPECT_EQ(103, gcodec.pltype);
1763 EXPECT_STREQ("ISAC", gcodec.plname);
1764 EXPECT_EQ(28000, gcodec.rate);
1765
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001766 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1767 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1769 EXPECT_EQ(0, gcodec.pltype);
1770 EXPECT_STREQ("PCMU", gcodec.plname);
1771 EXPECT_EQ(64000, gcodec.rate);
1772
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001773 parameters.codecs[0].bitrate = 0; // bitrate == default
1774 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1776 EXPECT_EQ(0, gcodec.pltype);
1777 EXPECT_STREQ("PCMU", gcodec.plname);
1778 EXPECT_EQ(64000, gcodec.rate);
1779
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001780 parameters.codecs[0] = kOpusCodec;
1781 parameters.codecs[0].bitrate = 0; // bitrate == default
1782 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1784 EXPECT_EQ(111, gcodec.pltype);
1785 EXPECT_STREQ("opus", gcodec.plname);
1786 EXPECT_EQ(32000, gcodec.rate);
1787}
1788
Brave Yao5225dd82015-03-26 07:39:19 +08001789// Test that we could set packet size specified in kCodecParamPTime.
1790TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001791 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001792 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001793 cricket::AudioSendParameters parameters;
1794 parameters.codecs.push_back(kOpusCodec);
1795 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1796 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001797 webrtc::CodecInst gcodec;
1798 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1799 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1800
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001801 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1802 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001803 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1804 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1805
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001806 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1807 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001808 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1809 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1810
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001811 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1812 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1813 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001814 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1815 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1816
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001817 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1818 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1819 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001820 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1821 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1822}
1823
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001824// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001826 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001827 cricket::AudioSendParameters parameters;
1828 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001829}
1830
1831// Test that we can set send codecs even with telephone-event codec as the first
1832// one on the list.
1833TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001834 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001835 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001836 cricket::AudioSendParameters parameters;
1837 parameters.codecs.push_back(kTelephoneEventCodec);
1838 parameters.codecs.push_back(kIsacCodec);
1839 parameters.codecs.push_back(kPcmuCodec);
1840 parameters.codecs[0].id = 98; // DTMF
1841 parameters.codecs[1].id = 96;
1842 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843 webrtc::CodecInst gcodec;
1844 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001845 EXPECT_EQ(96, gcodec.pltype);
1846 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001847 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001848}
1849
solenberg31642aa2016-03-14 08:00:37 -07001850// Test that payload type range is limited for telephone-event codec.
1851TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001852 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001853 cricket::AudioSendParameters parameters;
1854 parameters.codecs.push_back(kTelephoneEventCodec);
1855 parameters.codecs.push_back(kIsacCodec);
1856 parameters.codecs[0].id = 0; // DTMF
1857 parameters.codecs[1].id = 96;
1858 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1859 EXPECT_TRUE(channel_->CanInsertDtmf());
1860 parameters.codecs[0].id = 128; // DTMF
1861 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1862 EXPECT_FALSE(channel_->CanInsertDtmf());
1863 parameters.codecs[0].id = 127;
1864 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1865 EXPECT_TRUE(channel_->CanInsertDtmf());
1866 parameters.codecs[0].id = -1; // DTMF
1867 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1868 EXPECT_FALSE(channel_->CanInsertDtmf());
1869}
1870
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001871// Test that we can set send codecs even with CN codec as the first
1872// one on the list.
1873TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001874 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001875 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001876 cricket::AudioSendParameters parameters;
1877 parameters.codecs.push_back(kCn16000Codec);
1878 parameters.codecs.push_back(kIsacCodec);
1879 parameters.codecs.push_back(kPcmuCodec);
1880 parameters.codecs[0].id = 98; // wideband CN
1881 parameters.codecs[1].id = 96;
1882 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001883 webrtc::CodecInst gcodec;
1884 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1885 EXPECT_EQ(96, gcodec.pltype);
1886 EXPECT_STREQ("ISAC", gcodec.plname);
1887 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001888}
1889
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001890// Test that we set VAD and DTMF types correctly as caller.
1891TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001892 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001893 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001894 cricket::AudioSendParameters parameters;
1895 parameters.codecs.push_back(kIsacCodec);
1896 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001898 parameters.codecs.push_back(kCn16000Codec);
1899 parameters.codecs.push_back(kCn8000Codec);
1900 parameters.codecs.push_back(kTelephoneEventCodec);
1901 parameters.codecs.push_back(kRedCodec);
1902 parameters.codecs[0].id = 96;
1903 parameters.codecs[2].id = 97; // wideband CN
1904 parameters.codecs[4].id = 98; // DTMF
1905 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001906 webrtc::CodecInst gcodec;
1907 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1908 EXPECT_EQ(96, gcodec.pltype);
1909 EXPECT_STREQ("ISAC", gcodec.plname);
1910 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001911 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1913 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001914 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915}
1916
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001917// Test that we set VAD and DTMF types correctly as callee.
1918TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001919 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001920 cricket::AudioSendParameters parameters;
1921 parameters.codecs.push_back(kIsacCodec);
1922 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001923 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001924 parameters.codecs.push_back(kCn16000Codec);
1925 parameters.codecs.push_back(kCn8000Codec);
1926 parameters.codecs.push_back(kTelephoneEventCodec);
1927 parameters.codecs.push_back(kRedCodec);
1928 parameters.codecs[0].id = 96;
1929 parameters.codecs[2].id = 97; // wideband CN
1930 parameters.codecs[4].id = 98; // DTMF
1931 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001932 EXPECT_TRUE(channel_->AddSendStream(
1933 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001934 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001935
1936 webrtc::CodecInst gcodec;
1937 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1938 EXPECT_EQ(96, gcodec.pltype);
1939 EXPECT_STREQ("ISAC", gcodec.plname);
1940 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001941 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001942 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1943 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001944 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001945}
1946
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947// Test that we only apply VAD if we have a CN codec that matches the
1948// send codec clockrate.
1949TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001950 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001952 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001953 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001954 parameters.codecs.push_back(kIsacCodec);
1955 parameters.codecs.push_back(kCn16000Codec);
1956 parameters.codecs[1].id = 97;
1957 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 webrtc::CodecInst gcodec;
1959 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1960 EXPECT_STREQ("ISAC", gcodec.plname);
1961 EXPECT_TRUE(voe_.GetVAD(channel_num));
1962 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1963 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001964 parameters.codecs[0] = kPcmuCodec;
1965 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1967 EXPECT_STREQ("PCMU", gcodec.plname);
1968 EXPECT_FALSE(voe_.GetVAD(channel_num));
1969 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001970 parameters.codecs[1] = kCn8000Codec;
1971 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1973 EXPECT_STREQ("PCMU", gcodec.plname);
1974 EXPECT_TRUE(voe_.GetVAD(channel_num));
1975 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001976 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001977 parameters.codecs[0] = kIsacCodec;
1978 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001979 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1980 EXPECT_STREQ("ISAC", gcodec.plname);
1981 EXPECT_FALSE(voe_.GetVAD(channel_num));
1982}
1983
1984// Test that we perform case-insensitive matching of codec names.
1985TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001986 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001987 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001988 cricket::AudioSendParameters parameters;
1989 parameters.codecs.push_back(kIsacCodec);
1990 parameters.codecs.push_back(kPcmuCodec);
1991 parameters.codecs.push_back(kCn16000Codec);
1992 parameters.codecs.push_back(kCn8000Codec);
1993 parameters.codecs.push_back(kTelephoneEventCodec);
1994 parameters.codecs.push_back(kRedCodec);
1995 parameters.codecs[0].name = "iSaC";
1996 parameters.codecs[0].id = 96;
1997 parameters.codecs[2].id = 97; // wideband CN
1998 parameters.codecs[4].id = 98; // DTMF
1999 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002000 webrtc::CodecInst gcodec;
2001 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2002 EXPECT_EQ(96, gcodec.pltype);
2003 EXPECT_STREQ("ISAC", gcodec.plname);
2004 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002005 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002006 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2007 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002008 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002009}
2010
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002011// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002012TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002013 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002014 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002015 cricket::AudioSendParameters parameters;
2016 parameters.codecs.push_back(kRedCodec);
2017 parameters.codecs.push_back(kIsacCodec);
2018 parameters.codecs.push_back(kPcmuCodec);
2019 parameters.codecs[0].id = 127;
2020 parameters.codecs[0].params[""] = "96/96";
2021 parameters.codecs[1].id = 96;
2022 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002023 webrtc::CodecInst gcodec;
2024 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2025 EXPECT_EQ(96, gcodec.pltype);
2026 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002027 EXPECT_TRUE(voe_.GetRED(channel_num));
2028 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029}
2030
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002031// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002032TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002033 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002034 cricket::AudioSendParameters parameters;
2035 parameters.codecs.push_back(kRedCodec);
2036 parameters.codecs.push_back(kIsacCodec);
2037 parameters.codecs.push_back(kPcmuCodec);
2038 parameters.codecs[0].id = 127;
2039 parameters.codecs[0].params[""] = "96/96";
2040 parameters.codecs[1].id = 96;
2041 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002042 EXPECT_TRUE(channel_->AddSendStream(
2043 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002044 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002045 webrtc::CodecInst gcodec;
2046 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2047 EXPECT_EQ(96, gcodec.pltype);
2048 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002049 EXPECT_TRUE(voe_.GetRED(channel_num));
2050 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002051}
2052
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002053// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002054TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002055 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002056 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002057 cricket::AudioSendParameters parameters;
2058 parameters.codecs.push_back(kRedCodec);
2059 parameters.codecs.push_back(kIsacCodec);
2060 parameters.codecs.push_back(kPcmuCodec);
2061 parameters.codecs[0].id = 127;
2062 parameters.codecs[1].id = 96;
2063 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064 webrtc::CodecInst gcodec;
2065 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2066 EXPECT_EQ(96, gcodec.pltype);
2067 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002068 EXPECT_TRUE(voe_.GetRED(channel_num));
2069 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070}
2071
2072// Test that we ignore RED if the parameters aren't named the way we expect.
2073TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002074 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002075 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002076 cricket::AudioSendParameters parameters;
2077 parameters.codecs.push_back(kRedCodec);
2078 parameters.codecs.push_back(kIsacCodec);
2079 parameters.codecs.push_back(kPcmuCodec);
2080 parameters.codecs[0].id = 127;
2081 parameters.codecs[0].params["ABC"] = "96/96";
2082 parameters.codecs[1].id = 96;
2083 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002084 webrtc::CodecInst gcodec;
2085 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2086 EXPECT_EQ(96, gcodec.pltype);
2087 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002088 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002089}
2090
2091// Test that we ignore RED if it uses different primary/secondary encoding.
2092TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002093 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002094 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002095 cricket::AudioSendParameters parameters;
2096 parameters.codecs.push_back(kRedCodec);
2097 parameters.codecs.push_back(kIsacCodec);
2098 parameters.codecs.push_back(kPcmuCodec);
2099 parameters.codecs[0].id = 127;
2100 parameters.codecs[0].params[""] = "96/0";
2101 parameters.codecs[1].id = 96;
2102 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002103 webrtc::CodecInst gcodec;
2104 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2105 EXPECT_EQ(96, gcodec.pltype);
2106 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002107 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108}
2109
2110// Test that we ignore RED if it uses more than 2 encodings.
2111TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002112 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002113 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002114 cricket::AudioSendParameters parameters;
2115 parameters.codecs.push_back(kRedCodec);
2116 parameters.codecs.push_back(kIsacCodec);
2117 parameters.codecs.push_back(kPcmuCodec);
2118 parameters.codecs[0].id = 127;
2119 parameters.codecs[0].params[""] = "96/96/96";
2120 parameters.codecs[1].id = 96;
2121 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002122 webrtc::CodecInst gcodec;
2123 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2124 EXPECT_EQ(96, gcodec.pltype);
2125 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002126 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002127}
2128
2129// Test that we ignore RED if it has bogus codec ids.
2130TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002131 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002132 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002133 cricket::AudioSendParameters parameters;
2134 parameters.codecs.push_back(kRedCodec);
2135 parameters.codecs.push_back(kIsacCodec);
2136 parameters.codecs.push_back(kPcmuCodec);
2137 parameters.codecs[0].id = 127;
2138 parameters.codecs[0].params[""] = "ABC/ABC";
2139 parameters.codecs[1].id = 96;
2140 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141 webrtc::CodecInst gcodec;
2142 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2143 EXPECT_EQ(96, gcodec.pltype);
2144 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002145 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002146}
2147
2148// Test that we ignore RED if it refers to a codec that is not present.
2149TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002150 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002151 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002152 cricket::AudioSendParameters parameters;
2153 parameters.codecs.push_back(kRedCodec);
2154 parameters.codecs.push_back(kIsacCodec);
2155 parameters.codecs.push_back(kPcmuCodec);
2156 parameters.codecs[0].id = 127;
2157 parameters.codecs[0].params[""] = "97/97";
2158 parameters.codecs[1].id = 96;
2159 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002160 webrtc::CodecInst gcodec;
2161 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2162 EXPECT_EQ(96, gcodec.pltype);
2163 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002164 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165}
2166
stefanba4c0e42016-02-04 04:12:24 -08002167class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2168 public:
2169 WebRtcVoiceEngineWithSendSideBweTest()
2170 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2171};
2172
2173TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2174 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002175 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002176 ASSERT_FALSE(capabilities.header_extensions.empty());
2177 for (const cricket::RtpHeaderExtension& extension :
2178 capabilities.header_extensions) {
2179 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2180 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2181 extension.id);
2182 return;
2183 }
2184 }
2185 FAIL() << "Transport sequence number extension not in header-extension list.";
2186}
2187
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002188// Test support for audio level header extension.
2189TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2190 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002191}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002192TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2193 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2194}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002195
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002196// Test support for absolute send time header extension.
2197TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2198 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2199}
2200TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2201 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002202}
2203
solenberg1ac56142015-10-13 03:58:19 -07002204// Test that we can create a channel and start sending on it.
2205TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002206 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002207 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002208 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002209 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002210 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002211 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2212}
2213
2214// Test that a channel will send if and only if it has a source and is enabled
2215// for sending.
2216TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002217 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002218 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2219 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002220 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002221 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2222 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2223 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2224 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2225 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002226}
2227
solenberg6d6e7c52016-04-13 09:07:30 -07002228// Test that SetSendParameters() does not alter a stream's send state.
2229TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2230 EXPECT_TRUE(SetupSendStream());
2231 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2232
2233 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002234 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002235 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2236
2237 // Changing RTP header extensions will recreate the AudioSendStream.
2238 send_parameters_.extensions.push_back(
2239 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2240 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2241 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2242
2243 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002244 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002245 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2246
2247 // Changing RTP header extensions will recreate the AudioSendStream.
2248 send_parameters_.extensions.clear();
2249 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2250 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2251}
2252
solenberg1ac56142015-10-13 03:58:19 -07002253// Test that we can create a channel and start playing out on it.
2254TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002255 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002256 int channel_num = voe_.GetLastChannel();
2257 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2258 EXPECT_TRUE(channel_->SetPlayout(true));
2259 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002260 EXPECT_TRUE(channel_->SetPlayout(false));
2261 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2262}
2263
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264// Test that we can add and remove send streams.
2265TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2266 SetupForMultiSendStream();
2267
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002268 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002269 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002270
solenbergc96df772015-10-21 13:01:53 -07002271 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002272 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002273 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002274 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002275 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002276 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002277 }
tfarina5237aaf2015-11-10 23:44:30 -08002278 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002279
solenbergc96df772015-10-21 13:01:53 -07002280 // Delete the send streams.
2281 for (uint32_t ssrc : kSsrcs4) {
2282 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002283 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002284 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002285 }
solenbergc96df772015-10-21 13:01:53 -07002286 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002287}
2288
2289// Test SetSendCodecs correctly configure the codecs in all send streams.
2290TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2291 SetupForMultiSendStream();
2292
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002293 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002294 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002295 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002296 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002297 }
2298
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002299 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002300 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002301 parameters.codecs.push_back(kIsacCodec);
2302 parameters.codecs.push_back(kCn16000Codec);
2303 parameters.codecs[1].id = 97;
2304 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002305
2306 // Verify ISAC and VAD are corrected configured on all send channels.
2307 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002308 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002309 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002310 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2311 EXPECT_STREQ("ISAC", gcodec.plname);
2312 EXPECT_TRUE(voe_.GetVAD(channel_num));
2313 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2314 }
2315
2316 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002317 parameters.codecs[0] = kPcmuCodec;
2318 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002319 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002320 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002321 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2322 EXPECT_STREQ("PCMU", gcodec.plname);
2323 EXPECT_FALSE(voe_.GetVAD(channel_num));
2324 }
2325}
2326
2327// Test we can SetSend on all send streams correctly.
2328TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2329 SetupForMultiSendStream();
2330
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002331 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002332 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002333 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002334 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002335 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2336 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002337 }
2338
2339 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002340 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002341 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002342 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002343 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002344 }
2345
2346 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002347 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002348 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002349 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002350 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002351 }
2352}
2353
2354// Test we can set the correct statistics on all send streams.
2355TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2356 SetupForMultiSendStream();
2357
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002358 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002359 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002360 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002361 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002362 }
solenberg85a04962015-10-27 03:35:21 -07002363 SetAudioSendStreamStats();
2364
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002365 // Create a receive stream to check that none of the send streams end up in
2366 // the receive stream stats.
2367 EXPECT_TRUE(channel_->AddRecvStream(
2368 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002369 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002370 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2371 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002372
solenberg85a04962015-10-27 03:35:21 -07002373 // Check stats for the added streams.
2374 {
2375 cricket::VoiceMediaInfo info;
2376 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002377
solenberg85a04962015-10-27 03:35:21 -07002378 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002379 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002380 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002381 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002382 }
2383
2384 // We have added one receive stream. We should see empty stats.
2385 EXPECT_EQ(info.receivers.size(), 1u);
2386 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002387 }
solenberg1ac56142015-10-13 03:58:19 -07002388
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002389 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002390 {
2391 cricket::VoiceMediaInfo info;
2392 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2393 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002394 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002395 EXPECT_EQ(0u, info.receivers.size());
2396 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002397
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002398 // Deliver a new packet - a default receive stream should be created and we
2399 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002400 {
2401 cricket::VoiceMediaInfo info;
2402 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2403 SetAudioReceiveStreamStats();
2404 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002405 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002406 EXPECT_EQ(1u, info.receivers.size());
2407 VerifyVoiceReceiverInfo(info.receivers[0]);
2408 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002409}
2410
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002411// Test that we can add and remove receive streams, and do proper send/playout.
2412// We can receive on multiple streams while sending one stream.
2413TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002414 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002415 int channel_num1 = voe_.GetLastChannel();
2416
solenberg1ac56142015-10-13 03:58:19 -07002417 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002418 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002419 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002420 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421
solenberg1ac56142015-10-13 03:58:19 -07002422 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002423 EXPECT_TRUE(
2424 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002426 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002427 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428
solenberg1ac56142015-10-13 03:58:19 -07002429 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2431 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2432
2433 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002434 EXPECT_TRUE(
2435 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436 int channel_num3 = voe_.GetLastChannel();
2437 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2438 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2439 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440
2441 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002442 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002443 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444
2445 // Stop playout.
2446 EXPECT_TRUE(channel_->SetPlayout(false));
2447 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2448 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2449 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2450
solenberg1ac56142015-10-13 03:58:19 -07002451 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002452 EXPECT_TRUE(channel_->SetPlayout(true));
2453 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2454 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2455 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2456
solenberg1ac56142015-10-13 03:58:19 -07002457 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2459 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002460 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002461}
2462
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002463// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002464// and start sending on it.
2465TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002466 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002467 cricket::AudioOptions options_adjust_agc;
2468 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469 webrtc::AgcConfig agc_config;
2470 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2471 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002472 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002473 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002474 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002475 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002476 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2477 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002478 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002479 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481}
2482
wu@webrtc.org97077a32013-10-25 21:18:33 +00002483TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002484 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002485 EXPECT_CALL(adm_,
2486 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002487 webrtc::AgcConfig agc_config;
2488 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2489 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002490 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2491 send_parameters_.options.tx_agc_digital_compression_gain =
2492 rtc::Optional<uint16_t>(9);
2493 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2494 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2495 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002496 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2497 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2498 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2499 EXPECT_TRUE(agc_config.limiterEnable);
2500
2501 // Check interaction with adjust_agc_delta. Both should be respected, for
2502 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002503 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2504 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002505 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2506 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2507}
2508
wu@webrtc.org97077a32013-10-25 21:18:33 +00002509TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002510 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002511 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2512 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002513 send_parameters_.options.recording_sample_rate =
2514 rtc::Optional<uint32_t>(48000);
2515 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2516 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002517}
2518
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002519// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002520// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002522 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002523 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524}
2525
2526TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2527 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002528 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002529 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002530 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002531 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002532 EXPECT_TRUE(channel_->AddRecvStream(
2533 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002534 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2535 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536
solenberg85a04962015-10-27 03:35:21 -07002537 // Check stats for the added streams.
2538 {
2539 cricket::VoiceMediaInfo info;
2540 EXPECT_EQ(true, channel_->GetStats(&info));
2541
2542 // We have added one send stream. We should see the stats we've set.
2543 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002544 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002545 // We have added one receive stream. We should see empty stats.
2546 EXPECT_EQ(info.receivers.size(), 1u);
2547 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2548 }
solenberg1ac56142015-10-13 03:58:19 -07002549
solenberg566ef242015-11-06 15:34:49 -08002550 // Start sending - this affects some reported stats.
2551 {
2552 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002553 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002554 EXPECT_EQ(true, channel_->GetStats(&info));
2555 VerifyVoiceSenderInfo(info.senders[0], true);
2556 }
2557
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002558 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002559 {
2560 cricket::VoiceMediaInfo info;
2561 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2562 EXPECT_EQ(true, channel_->GetStats(&info));
2563 EXPECT_EQ(1u, info.senders.size());
2564 EXPECT_EQ(0u, info.receivers.size());
2565 }
solenberg1ac56142015-10-13 03:58:19 -07002566
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002567 // Deliver a new packet - a default receive stream should be created and we
2568 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002569 {
2570 cricket::VoiceMediaInfo info;
2571 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2572 SetAudioReceiveStreamStats();
2573 EXPECT_EQ(true, channel_->GetStats(&info));
2574 EXPECT_EQ(1u, info.senders.size());
2575 EXPECT_EQ(1u, info.receivers.size());
2576 VerifyVoiceReceiverInfo(info.receivers[0]);
2577 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002578}
2579
2580// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002581// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002582TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002583 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002584 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002585 EXPECT_TRUE(channel_->AddRecvStream(
2586 cricket::StreamParams::CreateLegacy(kSsrc2)));
2587 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588}
2589
2590// Test that the local SSRC is the same on sending and receiving channels if the
2591// receive channel is created before the send channel.
2592TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002593 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002594 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2595 int receive_channel_num = voe_.GetLastChannel();
2596 EXPECT_TRUE(channel_->AddSendStream(
2597 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598
solenberg3a941542015-11-16 07:34:50 -08002599 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002600 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002601}
2602
2603// Test that we can properly receive packets.
2604TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002605 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002606 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002607 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002608
2609 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2610 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());
mflodman3d7db262016-04-29 00:57:13 -07002616 const uint32_t ssrc1 = 1;
2617 const uint32_t ssrc2 = 2;
2618 const uint32_t ssrc3 = 3;
2619 EXPECT_TRUE(channel_->AddRecvStream(
2620 cricket::StreamParams::CreateLegacy(ssrc1)));
2621 EXPECT_TRUE(channel_->AddRecvStream(
2622 cricket::StreamParams::CreateLegacy(ssrc2)));
2623 EXPECT_TRUE(channel_->AddRecvStream(
2624 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002625 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002626 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002627 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002628 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002629 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002630 }
mflodman3d7db262016-04-29 00:57:13 -07002631
2632 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2633 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2634 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2635
2636 EXPECT_EQ(s1.received_packets(), 0);
2637 EXPECT_EQ(s2.received_packets(), 0);
2638 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002639
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002641 EXPECT_EQ(s1.received_packets(), 0);
2642 EXPECT_EQ(s2.received_packets(), 0);
2643 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002644
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002646 EXPECT_EQ(s1.received_packets(), 1);
2647 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2648 EXPECT_EQ(s2.received_packets(), 0);
2649 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002650
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002652 EXPECT_EQ(s1.received_packets(), 1);
2653 EXPECT_EQ(s2.received_packets(), 1);
2654 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2655 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002656
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002657 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002658 EXPECT_EQ(s1.received_packets(), 1);
2659 EXPECT_EQ(s2.received_packets(), 1);
2660 EXPECT_EQ(s3.received_packets(), 1);
2661 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002662
mflodman3d7db262016-04-29 00:57:13 -07002663 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2664 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2665 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002666}
2667
solenberg7e63ef02015-11-20 00:19:43 -08002668// Test that receiving on an unsignalled stream works (default channel will be
2669// created).
2670TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002671 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002672 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2673
solenberg7e63ef02015-11-20 00:19:43 -08002674 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002675
2676 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2677 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2678 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002679}
2680
2681// Test that receiving on an unsignalled stream works (default channel will be
2682// created), and that packets will be forwarded to the default channel
2683// regardless of their SSRCs.
2684TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002685 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002686 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002687 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2688
mflodman3d7db262016-04-29 00:57:13 -07002689 // Note that ssrc = 0 is not supported.
2690 uint32_t ssrc = 1;
2691 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002692 rtc::SetBE32(&packet[8], ssrc);
2693 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002694
2695 // Verify we only have one default stream.
2696 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2697 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2698 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002699 }
mflodman3d7db262016-04-29 00:57:13 -07002700
2701 // Sending the same ssrc again should not create a new stream.
2702 --ssrc;
2703 DeliverPacket(packet, sizeof(packet));
2704 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2705 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2706 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002707}
2708
2709// Test that a default channel is created even after a signalled stream has been
2710// added, and that this stream will get any packets for unknown SSRCs.
2711TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002712 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002713 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002714 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2715
2716 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002717 const uint32_t signaled_ssrc = 1;
2718 rtc::SetBE32(&packet[8], signaled_ssrc);
2719 EXPECT_TRUE(channel_->AddRecvStream(
2720 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002721 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002722 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2723 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002724
2725 // Note that the first unknown SSRC cannot be 0, because we only support
2726 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002727 const uint32_t unsignaled_ssrc = 7011;
2728 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002729 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002730 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2731 packet, sizeof(packet)));
2732 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2733
2734 DeliverPacket(packet, sizeof(packet));
2735 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2736
2737 rtc::SetBE32(&packet[8], signaled_ssrc);
2738 DeliverPacket(packet, sizeof(packet));
2739 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2740 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002741}
2742
solenberg0a617e22015-10-20 15:49:38 -07002743// Test that we properly handle failures to add a receive stream.
2744TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002745 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748}
2749
solenberg0a617e22015-10-20 15:49:38 -07002750// Test that we properly handle failures to add a send stream.
2751TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002752 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002753 voe_.set_fail_create_channel(true);
2754 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2755}
2756
solenberg1ac56142015-10-13 03:58:19 -07002757// Test that AddRecvStream creates new stream.
2758TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002759 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002760 int channel_num = voe_.GetLastChannel();
2761 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002762 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002763}
2764
2765// Test that after adding a recv stream, we do not decode more codecs than
2766// those previously passed into SetRecvCodecs.
2767TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002768 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002769 cricket::AudioRecvParameters parameters;
2770 parameters.codecs.push_back(kIsacCodec);
2771 parameters.codecs.push_back(kPcmuCodec);
2772 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002773 EXPECT_TRUE(channel_->AddRecvStream(
2774 cricket::StreamParams::CreateLegacy(kSsrc1)));
2775 int channel_num2 = voe_.GetLastChannel();
2776 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002777 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002778 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002779 gcodec.channels = 2;
2780 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2781}
2782
2783// Test that we properly clean up any streams that were added, even if
2784// not explicitly removed.
2785TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002786 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002787 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002788 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2789 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2790 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2791 delete channel_;
2792 channel_ = NULL;
2793 EXPECT_EQ(0, voe_.GetNumChannels());
2794}
2795
wu@webrtc.org78187522013-10-07 23:32:02 +00002796TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002797 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002798 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2799}
2800
2801TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002802 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002803 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002804 // Manually delete channel to simulate a failure.
2805 int channel = voe_.GetLastChannel();
2806 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2807 // Add recv stream 2 should work.
2808 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002809 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002810 EXPECT_NE(channel, new_channel);
2811 // The last created channel is deleted too.
2812 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002813}
2814
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002815// Test the InsertDtmf on default send stream as caller.
2816TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2817 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002818}
2819
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002820// Test the InsertDtmf on default send stream as callee
2821TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2822 TestInsertDtmf(0, false);
2823}
2824
2825// Test the InsertDtmf on specified send stream as caller.
2826TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2827 TestInsertDtmf(kSsrc1, true);
2828}
2829
2830// Test the InsertDtmf on specified send stream as callee.
2831TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2832 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002833}
2834
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002835TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002836 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002837 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002838 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002839 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2840 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2841 EXPECT_TRUE(channel_->SetPlayout(true));
2842 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2843 EXPECT_TRUE(channel_->SetPlayout(false));
2844 EXPECT_FALSE(channel_->SetPlayout(true));
2845}
2846
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002848 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002849 EXPECT_CALL(adm_,
2850 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2851 EXPECT_CALL(adm_,
2852 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2853 EXPECT_CALL(adm_,
2854 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 bool ec_enabled;
2856 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002857 webrtc::AecmModes aecm_mode;
2858 bool cng_enabled;
2859 bool agc_enabled;
2860 webrtc::AgcModes agc_mode;
2861 webrtc::AgcConfig agc_config;
2862 bool ns_enabled;
2863 webrtc::NsModes ns_mode;
2864 bool highpass_filter_enabled;
2865 bool stereo_swapping_enabled;
2866 bool typing_detection_enabled;
2867 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002868 voe_.GetAecmMode(aecm_mode, cng_enabled);
2869 voe_.GetAgcStatus(agc_enabled, agc_mode);
2870 voe_.GetAgcConfig(agc_config);
2871 voe_.GetNsStatus(ns_enabled, ns_mode);
2872 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2873 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2874 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2875 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002876 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002877 EXPECT_FALSE(cng_enabled);
2878 EXPECT_TRUE(agc_enabled);
2879 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2880 EXPECT_TRUE(ns_enabled);
2881 EXPECT_TRUE(highpass_filter_enabled);
2882 EXPECT_FALSE(stereo_swapping_enabled);
2883 EXPECT_TRUE(typing_detection_enabled);
2884 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2885 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002886 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2887 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002888
solenberg246b8172015-12-08 09:50:23 -08002889 // Nothing set in AudioOptions, so everything should be as default.
2890 send_parameters_.options = cricket::AudioOptions();
2891 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002892 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002893 voe_.GetAecmMode(aecm_mode, cng_enabled);
2894 voe_.GetAgcStatus(agc_enabled, agc_mode);
2895 voe_.GetAgcConfig(agc_config);
2896 voe_.GetNsStatus(ns_enabled, ns_mode);
2897 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2898 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2899 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2900 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002901 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002902 EXPECT_FALSE(cng_enabled);
2903 EXPECT_TRUE(agc_enabled);
2904 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2905 EXPECT_TRUE(ns_enabled);
2906 EXPECT_TRUE(highpass_filter_enabled);
2907 EXPECT_FALSE(stereo_swapping_enabled);
2908 EXPECT_TRUE(typing_detection_enabled);
2909 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2910 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002911 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2912 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002913
2914 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002915 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2916 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 voe_.GetEcStatus(ec_enabled, ec_mode);
2918 EXPECT_FALSE(ec_enabled);
2919
2920 // Turn echo cancellation back on, with settings, and make sure
2921 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002922 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2923 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002924 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002925 voe_.GetAecmMode(aecm_mode, cng_enabled);
2926 voe_.GetAgcStatus(agc_enabled, agc_mode);
2927 voe_.GetAgcConfig(agc_config);
2928 voe_.GetNsStatus(ns_enabled, ns_mode);
2929 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2930 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2931 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2932 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002933 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002934 EXPECT_TRUE(agc_enabled);
2935 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2936 EXPECT_TRUE(ns_enabled);
2937 EXPECT_TRUE(highpass_filter_enabled);
2938 EXPECT_FALSE(stereo_swapping_enabled);
2939 EXPECT_TRUE(typing_detection_enabled);
2940 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2941 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2942
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002943 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2944 // control.
solenberg246b8172015-12-08 09:50:23 -08002945 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2946 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002947 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002948 voe_.GetAecmMode(aecm_mode, cng_enabled);
2949 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002950 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002951 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2952
2953 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002954 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2955 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2956 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2957 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002958 voe_.GetEcStatus(ec_enabled, ec_mode);
2959 EXPECT_FALSE(ec_enabled);
2960 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002961 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2962 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002963 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002964 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002965 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002966 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2967
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002968 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002969 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2970 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971 voe_.GetAgcStatus(agc_enabled, agc_mode);
2972 EXPECT_FALSE(agc_enabled);
2973
2974 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002975 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2976 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2977 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002978 voe_.GetAgcStatus(agc_enabled, agc_mode);
2979 EXPECT_TRUE(agc_enabled);
2980 voe_.GetAgcConfig(agc_config);
2981 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2982
2983 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002984 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2985 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2986 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2987 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2988 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002989 voe_.GetNsStatus(ns_enabled, ns_mode);
2990 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2991 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2992 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2993 EXPECT_FALSE(ns_enabled);
2994 EXPECT_FALSE(highpass_filter_enabled);
2995 EXPECT_FALSE(typing_detection_enabled);
2996 EXPECT_TRUE(stereo_swapping_enabled);
2997
solenberg1ac56142015-10-13 03:58:19 -07002998 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002999 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003000 voe_.GetEcStatus(ec_enabled, ec_mode);
3001 voe_.GetNsStatus(ns_enabled, ns_mode);
3002 EXPECT_TRUE(ec_enabled);
3003 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3004 EXPECT_FALSE(ns_enabled);
3005 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3006}
3007
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003008TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003009 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003010
3011 bool ec_enabled;
3012 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013 bool agc_enabled;
3014 webrtc::AgcModes agc_mode;
3015 bool ns_enabled;
3016 webrtc::NsModes ns_mode;
3017 bool highpass_filter_enabled;
3018 bool stereo_swapping_enabled;
3019 bool typing_detection_enabled;
3020
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003021 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003022 voe_.GetAgcStatus(agc_enabled, agc_mode);
3023 voe_.GetNsStatus(ns_enabled, ns_mode);
3024 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3025 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3026 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3027 EXPECT_TRUE(ec_enabled);
3028 EXPECT_TRUE(agc_enabled);
3029 EXPECT_TRUE(ns_enabled);
3030 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003031 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003032 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003033}
3034
3035TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3036 webrtc::AgcConfig set_config = {0};
3037 set_config.targetLeveldBOv = 3;
3038 set_config.digitalCompressionGaindB = 9;
3039 set_config.limiterEnable = true;
3040 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003041
3042 webrtc::AgcConfig config = {0};
3043 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3044 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3045 EXPECT_EQ(set_config.digitalCompressionGaindB,
3046 config.digitalCompressionGaindB);
3047 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3048}
3049
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003050TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003051 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003052 EXPECT_CALL(adm_,
3053 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3054 EXPECT_CALL(adm_,
3055 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3056 EXPECT_CALL(adm_,
3057 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3058
kwiberg686a8ef2016-02-26 03:00:35 -08003059 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003060 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003061 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003062 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003063 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003064 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003065
3066 // Have to add a stream to make SetSend work.
3067 cricket::StreamParams stream1;
3068 stream1.ssrcs.push_back(1);
3069 channel1->AddSendStream(stream1);
3070 cricket::StreamParams stream2;
3071 stream2.ssrcs.push_back(2);
3072 channel2->AddSendStream(stream2);
3073
3074 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003075 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003076 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3077 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3078 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003079 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3080 EXPECT_EQ(parameters_options_all.options, channel1->options());
3081 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3082 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003083
3084 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003085 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003086 parameters_options_no_ns.options.noise_suppression =
3087 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003088 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3089 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003090 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3091 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3092 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003093 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003094
3095 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003096 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003097 parameters_options_no_agc.options.auto_gain_control =
3098 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003099 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003100 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3101 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3102 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003103 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003104
solenberg246b8172015-12-08 09:50:23 -08003105 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003106 bool ec_enabled;
3107 webrtc::EcModes ec_mode;
3108 bool agc_enabled;
3109 webrtc::AgcModes agc_mode;
3110 bool ns_enabled;
3111 webrtc::NsModes ns_mode;
3112 voe_.GetEcStatus(ec_enabled, ec_mode);
3113 voe_.GetAgcStatus(agc_enabled, agc_mode);
3114 voe_.GetNsStatus(ns_enabled, ns_mode);
3115 EXPECT_TRUE(ec_enabled);
3116 EXPECT_TRUE(agc_enabled);
3117 EXPECT_TRUE(ns_enabled);
3118
solenbergd53a3f92016-04-14 13:56:37 -07003119 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003120 voe_.GetEcStatus(ec_enabled, ec_mode);
3121 voe_.GetAgcStatus(agc_enabled, agc_mode);
3122 voe_.GetNsStatus(ns_enabled, ns_mode);
3123 EXPECT_TRUE(ec_enabled);
3124 EXPECT_TRUE(agc_enabled);
3125 EXPECT_FALSE(ns_enabled);
3126
solenbergd53a3f92016-04-14 13:56:37 -07003127 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128 voe_.GetEcStatus(ec_enabled, ec_mode);
3129 voe_.GetAgcStatus(agc_enabled, agc_mode);
3130 voe_.GetNsStatus(ns_enabled, ns_mode);
3131 EXPECT_TRUE(ec_enabled);
3132 EXPECT_FALSE(agc_enabled);
3133 EXPECT_TRUE(ns_enabled);
3134
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003135 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003136 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003137 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3138 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003139 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003140 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003141 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003142 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003143 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003144 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003145 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3146 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3147 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003148 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003149 voe_.GetEcStatus(ec_enabled, ec_mode);
3150 voe_.GetAgcStatus(agc_enabled, agc_mode);
3151 voe_.GetNsStatus(ns_enabled, ns_mode);
3152 EXPECT_TRUE(ec_enabled);
3153 EXPECT_FALSE(agc_enabled);
3154 EXPECT_FALSE(ns_enabled);
3155}
3156
wu@webrtc.orgde305012013-10-31 15:40:38 +00003157// This test verifies DSCP settings are properly applied on voice media channel.
3158TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003159 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003160 cricket::FakeNetworkInterface network_interface;
3161 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003162 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003163
solenbergbc37fc82016-04-04 09:54:44 -07003164 channel.reset(
3165 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003166 channel->SetInterface(&network_interface);
3167 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3168 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3169
3170 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003171 channel.reset(
3172 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003173 channel->SetInterface(&network_interface);
3174 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3175
3176 // Verify that setting the option to false resets the
3177 // DiffServCodePoint.
3178 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003179 channel.reset(
3180 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003181 channel->SetInterface(&network_interface);
3182 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3183 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3184
3185 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003186}
3187
solenberg1ac56142015-10-13 03:58:19 -07003188TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003189 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003190 cricket::WebRtcVoiceMediaChannel* media_channel =
3191 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003192 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3193 EXPECT_TRUE(channel_->AddRecvStream(
3194 cricket::StreamParams::CreateLegacy(kSsrc1)));
3195 int channel_id = voe_.GetLastChannel();
3196 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3197 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3198 EXPECT_TRUE(channel_->AddRecvStream(
3199 cricket::StreamParams::CreateLegacy(kSsrc2)));
3200 int channel_id2 = voe_.GetLastChannel();
3201 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003202}
3203
solenberg1ac56142015-10-13 03:58:19 -07003204TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003205 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003206 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003207 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3208 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3209 EXPECT_TRUE(channel_->AddSendStream(
3210 cricket::StreamParams::CreateLegacy(kSsrc1)));
3211 int channel_id = voe_.GetLastChannel();
3212 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3213 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3214 EXPECT_TRUE(channel_->AddSendStream(
3215 cricket::StreamParams::CreateLegacy(kSsrc2)));
3216 int channel_id2 = voe_.GetLastChannel();
3217 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003218}
3219
solenberg4bac9c52015-10-09 02:32:53 -07003220TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003221 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003222 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003223 cricket::StreamParams stream;
3224 stream.ssrcs.push_back(kSsrc2);
3225 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003226 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003227 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003228 float scale = 0;
3229 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3230 EXPECT_DOUBLE_EQ(3, scale);
3231}
3232
3233TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003234 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003235 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3236 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3237 int channel_id = voe_.GetLastChannel();
3238 float scale = 0;
3239 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3240 EXPECT_DOUBLE_EQ(2, scale);
3241 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003242 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003243 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003244}
3245
pbos8fc7fa72015-07-15 08:02:58 -07003246TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003247 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003248 const std::string kSyncLabel = "AvSyncLabel";
3249
solenbergff976312016-03-30 23:28:51 -07003250 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003251 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3252 sp.sync_label = kSyncLabel;
3253 // Creating two channels to make sure that sync label is set properly for both
3254 // the default voice channel and following ones.
3255 EXPECT_TRUE(channel_->AddRecvStream(sp));
3256 sp.ssrcs[0] += 1;
3257 EXPECT_TRUE(channel_->AddRecvStream(sp));
3258
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003259 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003260 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003261 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003262 << "SyncGroup should be set based on sync_label";
3263 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003264 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003265 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003266}
3267
solenberg3a941542015-11-16 07:34:50 -08003268// TODO(solenberg): Remove, once recv streams are configured through Call.
3269// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003270TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003271 // Test that setting the header extensions results in the expected state
3272 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003273 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003274 ssrcs.push_back(223);
3275 ssrcs.push_back(224);
3276
solenbergff976312016-03-30 23:28:51 -07003277 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003278 cricket::WebRtcVoiceMediaChannel* media_channel =
3279 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003280 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003281 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003282 EXPECT_TRUE(media_channel->AddRecvStream(
3283 cricket::StreamParams::CreateLegacy(ssrc)));
3284 }
3285
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003286 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
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 }
3292
3293 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003294 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003295 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003296 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003297 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003298 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003299 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003300 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003301 EXPECT_NE(nullptr, s);
3302 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003303 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3304 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003305 for (const auto& s_ext : s_exts) {
3306 if (e_ext.id == s_ext.id) {
3307 EXPECT_EQ(e_ext.uri, s_ext.name);
3308 }
3309 }
3310 }
3311 }
3312
3313 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003314 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003315 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003316 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003317 EXPECT_NE(nullptr, s);
3318 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3319 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003320}
3321
3322TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3323 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003324 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003325 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003326 static const unsigned char kRtcp[] = {
3327 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3328 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3331 };
jbaucheec21bd2016-03-20 06:15:43 -07003332 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003333
solenbergff976312016-03-30 23:28:51 -07003334 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003335 cricket::WebRtcVoiceMediaChannel* media_channel =
3336 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003337 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003338 EXPECT_TRUE(media_channel->AddRecvStream(
3339 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3340
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003341 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003342 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003343 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003344 EXPECT_EQ(0, s->received_packets());
3345 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3346 EXPECT_EQ(1, s->received_packets());
3347 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3348 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003349}
Minyue2013aec2015-05-13 14:14:42 +02003350
solenberg0a617e22015-10-20 15:49:38 -07003351// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003352// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003353TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003354 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003355 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003356 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003357 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3358 int recv_ch = voe_.GetLastChannel();
3359 EXPECT_NE(recv_ch, default_channel);
3360 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3361 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3362 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003363 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3364 recv_ch = voe_.GetLastChannel();
3365 EXPECT_NE(recv_ch, default_channel);
3366 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003367}
3368
3369TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003370 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003371 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003372
3373 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3374 int recv_ch = voe_.GetLastChannel();
3375
3376 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3377 int send_ch = voe_.GetLastChannel();
3378
3379 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3380 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3381 // channel of |recv_ch|.This is not a common case, since, normally, only the
3382 // default channel can be associated. However, the default is not deletable.
3383 // So we force the |recv_ch| to associate with a non-default channel.
3384 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3385 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3386
3387 EXPECT_TRUE(channel_->RemoveSendStream(2));
3388 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3389}
stefan658910c2015-09-03 05:48:32 -07003390
deadbeef884f5852016-01-15 09:20:04 -08003391TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003392 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003393 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3394 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003395
3396 // Setting the sink before a recv stream exists should do nothing.
3397 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3398 EXPECT_TRUE(
3399 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3400 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3401
3402 // Now try actually setting the sink.
3403 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3404 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3405
3406 // Now try resetting it.
3407 channel_->SetRawAudioSink(kSsrc1, nullptr);
3408 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3409}
3410
3411TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003412 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003413 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3414 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003415
3416 // Should be able to set a default sink even when no stream exists.
3417 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3418
3419 // Create default channel and ensure it's assigned the default sink.
3420 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3421 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3422
3423 // Try resetting the default sink.
3424 channel_->SetRawAudioSink(0, nullptr);
3425 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3426
3427 // Try setting the default sink while the default stream exists.
3428 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3429 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3430
3431 // If we remove and add a default stream, it should get the same sink.
3432 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3433 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3434 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3435}
3436
skvlad7a43d252016-03-22 15:32:27 -07003437// Test that, just like the video channel, the voice channel communicates the
3438// network state to the call.
3439TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003440 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003441
3442 EXPECT_EQ(webrtc::kNetworkUp,
3443 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3444 EXPECT_EQ(webrtc::kNetworkUp,
3445 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3446
3447 channel_->OnReadyToSend(false);
3448 EXPECT_EQ(webrtc::kNetworkDown,
3449 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3450 EXPECT_EQ(webrtc::kNetworkUp,
3451 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3452
3453 channel_->OnReadyToSend(true);
3454 EXPECT_EQ(webrtc::kNetworkUp,
3455 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3456 EXPECT_EQ(webrtc::kNetworkUp,
3457 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3458}
3459
stefan658910c2015-09-03 05:48:32 -07003460// Tests that the library initializes and shuts down properly.
3461TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003462 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003463 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003464 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003465 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3466 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003467 EXPECT_TRUE(channel != nullptr);
3468 delete channel;
solenbergff976312016-03-30 23:28:51 -07003469}
stefan658910c2015-09-03 05:48:32 -07003470
solenbergff976312016-03-30 23:28:51 -07003471// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003472TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3473 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3474 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3475 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003476 {
3477 cricket::WebRtcVoiceEngine engine(&adm);
3478 std::unique_ptr<webrtc::Call> call(
3479 webrtc::Call::Create(webrtc::Call::Config()));
3480 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3481 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3482 EXPECT_TRUE(channel != nullptr);
3483 delete channel;
3484 }
stefan658910c2015-09-03 05:48:32 -07003485}
3486
3487// Tests that the library is configured with the codecs we want.
3488TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003489 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003490 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003491 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003492 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003493 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003494 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003495 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003496 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003497 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003498 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003499 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003500 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003501 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003502 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003503 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003504 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003505 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003506 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003507 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003508 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003509 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003510 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003511 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003512 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003513 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003514 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003515 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003516 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003517 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003518 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003519 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003520 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003521 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003522 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003523 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003524 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003525 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003526 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003527 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003528 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003529 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003530 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003531 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003532 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003533 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003534 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003535 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003536 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003537 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003538 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003539 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003540
stefan658910c2015-09-03 05:48:32 -07003541 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003542 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003543 for (std::vector<cricket::AudioCodec>::const_iterator it =
3544 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3545 if (it->name == "CN" && it->clockrate == 16000) {
3546 EXPECT_EQ(105, it->id);
3547 } else if (it->name == "CN" && it->clockrate == 32000) {
3548 EXPECT_EQ(106, it->id);
3549 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3550 EXPECT_EQ(103, it->id);
3551 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3552 EXPECT_EQ(104, it->id);
3553 } else if (it->name == "G722" && it->clockrate == 8000) {
3554 EXPECT_EQ(9, it->id);
3555 } else if (it->name == "telephone-event") {
3556 EXPECT_EQ(126, it->id);
3557 } else if (it->name == "red") {
3558 EXPECT_EQ(127, it->id);
3559 } else if (it->name == "opus") {
3560 EXPECT_EQ(111, it->id);
3561 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3562 EXPECT_EQ("10", it->params.find("minptime")->second);
3563 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3564 EXPECT_EQ("60", it->params.find("maxptime")->second);
3565 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3566 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3567 }
3568 }
stefan658910c2015-09-03 05:48:32 -07003569}
3570
3571// Tests that VoE supports at least 32 channels
3572TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003573 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003574 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003575 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003576
3577 cricket::VoiceMediaChannel* channels[32];
3578 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003579 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003580 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3581 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003582 if (!channel)
3583 break;
stefan658910c2015-09-03 05:48:32 -07003584 channels[num_channels++] = channel;
3585 }
3586
tfarina5237aaf2015-11-10 23:44:30 -08003587 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003588 EXPECT_EQ(expected, num_channels);
3589
3590 while (num_channels > 0) {
3591 delete channels[--num_channels];
3592 }
stefan658910c2015-09-03 05:48:32 -07003593}
3594
3595// Test that we set our preferred codecs properly.
3596TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003597 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003598 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003599 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003600 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3601 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003602 cricket::AudioRecvParameters parameters;
3603 parameters.codecs = engine.codecs();
3604 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003605}