blob: d3437265a16cdcc9c7c99bf01e9249a4cca5c141 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakenetworkinterface.h"
22#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080023#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
solenbergbc37fc82016-04-04 09:54:44 -070027#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000029using cricket::kRtpAudioLevelHeaderExtension;
30using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
deadbeef67cf2c12016-04-13 10:07:16 -070036const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
44const cricket::AudioCodec kTelephoneEventCodec(106,
45 "telephone-event",
46 8000,
47 0,
48 1);
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080050const uint32_t kSsrc2 = 2;
51const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070052const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053
54class FakeVoEWrapper : public cricket::VoEWrapper {
55 public:
56 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
57 : cricket::VoEWrapper(engine, // processing
58 engine, // base
59 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine, // network
62 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 engine) { // volume
64 }
65};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020066} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067
solenbergff976312016-03-30 23:28:51 -070068// Tests that our stub library "works".
69TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070070 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
71 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
72 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070073 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
75 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070076 cricket::FakeWebRtcVoiceEngine voe;
77 EXPECT_FALSE(voe.IsInited());
78 {
solenbergbc37fc82016-04-04 09:54:44 -070079 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070080 EXPECT_TRUE(voe.IsInited());
81 }
82 EXPECT_FALSE(voe.IsInited());
83}
84
deadbeef884f5852016-01-15 09:20:04 -080085class FakeAudioSink : public webrtc::AudioSinkInterface {
86 public:
87 void OnData(const Data& audio) override {}
88};
89
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080090class FakeAudioSource : public cricket::AudioSource {
91 void SetSink(Sink* sink) override {}
92};
93
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094class WebRtcVoiceEngineTestFake : public testing::Test {
95 public:
stefanba4c0e42016-02-04 04:12:24 -080096 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
97
98 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070099 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
100 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
101 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700102 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
103 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
104 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergbc37fc82016-04-04 09:54:44 -0700105 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
106 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200107 send_parameters_.codecs.push_back(kPcmuCodec);
108 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109 }
solenbergff976312016-03-30 23:28:51 -0700110 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700111 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
112 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200113 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000114 }
solenbergff976312016-03-30 23:28:51 -0700115 bool SetupRecvStream() {
116 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700117 return false;
118 }
119 return channel_->AddRecvStream(
120 cricket::StreamParams::CreateLegacy(kSsrc1));
121 }
solenbergff976312016-03-30 23:28:51 -0700122 bool SetupSendStream() {
123 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000124 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800126 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
127 return false;
128 }
129 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000131 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700132 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700133 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800134 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700135 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700136 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800137 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000138 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700140 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000141 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200143 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000145 }
146
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100147 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
148 const auto* send_stream = call_.GetAudioSendStream(ssrc);
149 EXPECT_TRUE(send_stream);
150 return *send_stream;
151 }
152
deadbeef884f5852016-01-15 09:20:04 -0800153 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
154 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
155 EXPECT_TRUE(recv_stream);
156 return *recv_stream;
157 }
158
solenberg3a941542015-11-16 07:34:50 -0800159 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800160 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800161 }
162
solenberg7add0582015-11-20 09:59:34 -0800163 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800164 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800165 }
166
solenbergd53a3f92016-04-14 13:56:37 -0700167 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
168 ASSERT_TRUE(channel);
169 if (enable) {
170 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
171 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
172 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
173 }
174 channel->SetSend(enable);
175 }
176
Peter Boström0c4e06b2015-10-07 12:23:21 +0200177 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700178 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000179 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700180 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000181 // send stream.
182 EXPECT_TRUE(channel_->AddSendStream(
183 cricket::StreamParams::CreateLegacy(kSsrc1)));
184 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000185
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200187 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700188 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800190 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200191 send_parameters_.codecs.push_back(kTelephoneEventCodec);
192 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000193 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000194
195 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700196 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800197 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000198 EXPECT_TRUE(channel_->AddSendStream(
199 cricket::StreamParams::CreateLegacy(kSsrc1)));
200 }
201
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800203 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100205 // Test send.
206 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
207 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
208 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800209 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100210 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
211 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
212 EXPECT_EQ(2, telephone_event.event_code);
213 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000214 }
215
216 // Test that send bandwidth is set correctly.
217 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000218 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
219 // |expected_result| is the expected result from SetMaxSendBandwidth().
220 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000221 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000222 int max_bitrate,
223 bool expected_result,
224 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200225 cricket::AudioSendParameters parameters;
226 parameters.codecs.push_back(codec);
227 parameters.max_bandwidth_bps = max_bitrate;
228 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
229
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000231 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000233 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 }
235
skvlade0d46372016-04-07 22:59:22 -0700236 // Sets the per-stream maximum bitrate limit for the specified SSRC.
237 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
238 webrtc::RtpParameters parameters = channel_->GetRtpParameters(ssrc);
239 EXPECT_EQ(1UL, parameters.encodings.size());
240
241 parameters.encodings[0].max_bitrate_bps = bitrate;
242 return channel_->SetRtpParameters(ssrc, parameters);
243 }
244
245 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
246 cricket::AudioSendParameters send_parameters;
247 send_parameters.codecs.push_back(codec);
248 send_parameters.max_bandwidth_bps = bitrate;
249 return channel_->SetSendParameters(send_parameters);
250 }
251
252 int GetCodecBitrate(int32_t ssrc) {
253 cricket::WebRtcVoiceMediaChannel* media_channel =
254 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
255 int channel = media_channel->GetSendChannelId(ssrc);
256 EXPECT_NE(-1, channel);
257 webrtc::CodecInst codec;
258 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
259 return codec.rate;
260 }
261
262 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
263 int global_max,
264 int stream_max,
265 bool expected_result,
266 int expected_codec_bitrate) {
267 // Clear the bitrate limit from the previous test case.
268 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
269
270 // Attempt to set the requested bitrate limits.
271 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
272 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
273
274 // Verify that reading back the parameters gives results
275 // consistent with the Set() result.
276 webrtc::RtpParameters resulting_parameters =
277 channel_->GetRtpParameters(kSsrc1);
278 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
279 EXPECT_EQ(expected_result ? stream_max : -1,
280 resulting_parameters.encodings[0].max_bitrate_bps);
281
282 // Verify that the codec settings have the expected bitrate.
283 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
284 }
285
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000286 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700287 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000288
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000289 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800290 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000291
292 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200293 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000294 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200295 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800296 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000297
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000298 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200299 send_parameters_.extensions.clear();
300 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800301 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000302
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000303 // Ensure extension is set properly.
304 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200305 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
306 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800307 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
308 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
309 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000310
solenberg7add0582015-11-20 09:59:34 -0800311 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000312 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700313 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800314 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
315 call_.GetAudioSendStream(kSsrc2));
316 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
317 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
318 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000319
320 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200321 send_parameters_.codecs.push_back(kPcmuCodec);
322 send_parameters_.extensions.clear();
323 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800324 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
325 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000326 }
327
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000328 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700329 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000330
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000331 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800332 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000333
334 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800335 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000336 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800337 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
338 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000339
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000340 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800341 recv_parameters_.extensions.clear();
342 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
343 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000344
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000345 // Ensure extension is set properly.
346 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800347 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
348 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
349 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
350 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
351 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000352
solenberg7add0582015-11-20 09:59:34 -0800353 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000354 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700355 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800356 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
357 call_.GetAudioReceiveStream(kSsrc2));
358 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
359 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
360 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000361
362 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800363 recv_parameters_.extensions.clear();
364 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
365 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
366 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000367 }
368
solenberg85a04962015-10-27 03:35:21 -0700369 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
370 webrtc::AudioSendStream::Stats stats;
371 stats.local_ssrc = 12;
372 stats.bytes_sent = 345;
373 stats.packets_sent = 678;
374 stats.packets_lost = 9012;
375 stats.fraction_lost = 34.56f;
376 stats.codec_name = "codec_name_send";
377 stats.ext_seqnum = 789;
378 stats.jitter_ms = 12;
379 stats.rtt_ms = 345;
380 stats.audio_level = 678;
381 stats.aec_quality_min = 9.01f;
382 stats.echo_delay_median_ms = 234;
383 stats.echo_delay_std_ms = 567;
384 stats.echo_return_loss = 890;
385 stats.echo_return_loss_enhancement = 1234;
386 stats.typing_noise_detected = true;
387 return stats;
388 }
389 void SetAudioSendStreamStats() {
390 for (auto* s : call_.GetAudioSendStreams()) {
391 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200392 }
solenberg85a04962015-10-27 03:35:21 -0700393 }
solenberg566ef242015-11-06 15:34:49 -0800394 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
395 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700396 const auto stats = GetAudioSendStreamStats();
397 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
398 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
399 EXPECT_EQ(info.packets_sent, stats.packets_sent);
400 EXPECT_EQ(info.packets_lost, stats.packets_lost);
401 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
402 EXPECT_EQ(info.codec_name, stats.codec_name);
403 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
404 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
405 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
406 EXPECT_EQ(info.audio_level, stats.audio_level);
407 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
408 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
409 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
410 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
411 EXPECT_EQ(info.echo_return_loss_enhancement,
412 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800413 EXPECT_EQ(info.typing_noise_detected,
414 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700415 }
416
417 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
418 webrtc::AudioReceiveStream::Stats stats;
419 stats.remote_ssrc = 123;
420 stats.bytes_rcvd = 456;
421 stats.packets_rcvd = 768;
422 stats.packets_lost = 101;
423 stats.fraction_lost = 23.45f;
424 stats.codec_name = "codec_name_recv";
425 stats.ext_seqnum = 678;
426 stats.jitter_ms = 901;
427 stats.jitter_buffer_ms = 234;
428 stats.jitter_buffer_preferred_ms = 567;
429 stats.delay_estimate_ms = 890;
430 stats.audio_level = 1234;
431 stats.expand_rate = 5.67f;
432 stats.speech_expand_rate = 8.90f;
433 stats.secondary_decoded_rate = 1.23f;
434 stats.accelerate_rate = 4.56f;
435 stats.preemptive_expand_rate = 7.89f;
436 stats.decoding_calls_to_silence_generator = 12;
437 stats.decoding_calls_to_neteq = 345;
438 stats.decoding_normal = 67890;
439 stats.decoding_plc = 1234;
440 stats.decoding_cng = 5678;
441 stats.decoding_plc_cng = 9012;
442 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200443 return stats;
444 }
445 void SetAudioReceiveStreamStats() {
446 for (auto* s : call_.GetAudioReceiveStreams()) {
447 s->SetStats(GetAudioReceiveStreamStats());
448 }
449 }
450 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700451 const auto stats = GetAudioReceiveStreamStats();
452 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
453 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
454 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
455 EXPECT_EQ(info.packets_lost, stats.packets_lost);
456 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
457 EXPECT_EQ(info.codec_name, stats.codec_name);
458 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
459 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
460 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200461 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700462 stats.jitter_buffer_preferred_ms);
463 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
464 EXPECT_EQ(info.audio_level, stats.audio_level);
465 EXPECT_EQ(info.expand_rate, stats.expand_rate);
466 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
467 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
468 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
469 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200470 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700471 stats.decoding_calls_to_silence_generator);
472 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
473 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
474 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
475 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
476 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
477 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200478 }
479
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700481 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200482 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700484 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700485 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200486 cricket::AudioSendParameters send_parameters_;
487 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800488 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800489 private:
490 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491};
492
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493// Tests that we can create and destroy a channel.
494TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700495 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496}
497
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000498// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700499// correctly (such that opus appears first).
500TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700501 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502 ASSERT_FALSE(codecs.empty());
503 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
504 EXPECT_EQ(48000, codecs[0].clockrate);
505 EXPECT_EQ(2, codecs[0].channels);
506 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507}
508
stefanba4c0e42016-02-04 04:12:24 -0800509TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700510 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800511 bool opus_found = false;
512 for (cricket::AudioCodec codec : codecs) {
513 if (codec.name == "opus") {
514 EXPECT_TRUE(HasTransportCc(codec));
515 opus_found = true;
516 }
517 }
518 EXPECT_TRUE(opus_found);
519}
520
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000521// Tests that we can find codecs by name or id, and that we interpret the
522// clockrate and bitrate fields properly.
523TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
524 cricket::AudioCodec codec;
525 webrtc::CodecInst codec_inst;
526 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800527 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800529 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800531 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
532 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000533 // Find ISAC with a different payload id.
534 codec = kIsacCodec;
535 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800536 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 EXPECT_EQ(codec.id, codec_inst.pltype);
538 // Find PCMU with a 0 clockrate.
539 codec = kPcmuCodec;
540 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800541 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000542 EXPECT_EQ(codec.id, codec_inst.pltype);
543 EXPECT_EQ(8000, codec_inst.plfreq);
544 // Find PCMU with a 0 bitrate.
545 codec = kPcmuCodec;
546 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800547 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 EXPECT_EQ(codec.id, codec_inst.pltype);
549 EXPECT_EQ(64000, codec_inst.rate);
550 // Find ISAC with an explicit bitrate.
551 codec = kIsacCodec;
552 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800553 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 EXPECT_EQ(codec.id, codec_inst.pltype);
555 EXPECT_EQ(32000, codec_inst.rate);
556}
557
558// Test that we set our inbound codecs properly, including changing PT.
559TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700560 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200561 cricket::AudioRecvParameters parameters;
562 parameters.codecs.push_back(kIsacCodec);
563 parameters.codecs.push_back(kPcmuCodec);
564 parameters.codecs.push_back(kTelephoneEventCodec);
565 parameters.codecs[0].id = 106; // collide with existing telephone-event
566 parameters.codecs[2].id = 126;
567 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700568 EXPECT_TRUE(channel_->AddRecvStream(
569 cricket::StreamParams::CreateLegacy(kSsrc1)));
570 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800572 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 gcodec.plfreq = 16000;
574 gcodec.channels = 1;
575 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
576 EXPECT_EQ(106, gcodec.pltype);
577 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800578 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 gcodec.plfreq = 8000;
580 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
581 EXPECT_EQ(126, gcodec.pltype);
582 EXPECT_STREQ("telephone-event", gcodec.plname);
583}
584
585// Test that we fail to set an unknown inbound codec.
586TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700587 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200588 cricket::AudioRecvParameters parameters;
589 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700590 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200591 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592}
593
594// Test that we fail if we have duplicate types in the inbound list.
595TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700596 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200597 cricket::AudioRecvParameters parameters;
598 parameters.codecs.push_back(kIsacCodec);
599 parameters.codecs.push_back(kCn16000Codec);
600 parameters.codecs[1].id = kIsacCodec.id;
601 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602}
603
604// Test that we can decode OPUS without stereo parameters.
605TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700606 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200607 cricket::AudioRecvParameters parameters;
608 parameters.codecs.push_back(kIsacCodec);
609 parameters.codecs.push_back(kPcmuCodec);
610 parameters.codecs.push_back(kOpusCodec);
611 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 EXPECT_TRUE(channel_->AddRecvStream(
613 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700614 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800616 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 // Even without stereo parameters, recv codecs still specify channels = 2.
618 EXPECT_EQ(2, opus.channels);
619 EXPECT_EQ(111, opus.pltype);
620 EXPECT_STREQ("opus", opus.plname);
621 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700622 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 EXPECT_EQ(111, opus.pltype);
624}
625
626// Test that we can decode OPUS with stereo = 0.
627TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700628 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200629 cricket::AudioRecvParameters parameters;
630 parameters.codecs.push_back(kIsacCodec);
631 parameters.codecs.push_back(kPcmuCodec);
632 parameters.codecs.push_back(kOpusCodec);
633 parameters.codecs[2].params["stereo"] = "0";
634 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 EXPECT_TRUE(channel_->AddRecvStream(
636 cricket::StreamParams::CreateLegacy(kSsrc1)));
637 int channel_num2 = voe_.GetLastChannel();
638 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800639 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 // Even when stereo is off, recv codecs still specify channels = 2.
641 EXPECT_EQ(2, opus.channels);
642 EXPECT_EQ(111, opus.pltype);
643 EXPECT_STREQ("opus", opus.plname);
644 opus.pltype = 0;
645 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
646 EXPECT_EQ(111, opus.pltype);
647}
648
649// Test that we can decode OPUS with stereo = 1.
650TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700651 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652 cricket::AudioRecvParameters parameters;
653 parameters.codecs.push_back(kIsacCodec);
654 parameters.codecs.push_back(kPcmuCodec);
655 parameters.codecs.push_back(kOpusCodec);
656 parameters.codecs[2].params["stereo"] = "1";
657 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 EXPECT_TRUE(channel_->AddRecvStream(
659 cricket::StreamParams::CreateLegacy(kSsrc1)));
660 int channel_num2 = voe_.GetLastChannel();
661 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800662 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 EXPECT_EQ(2, opus.channels);
664 EXPECT_EQ(111, opus.pltype);
665 EXPECT_STREQ("opus", opus.plname);
666 opus.pltype = 0;
667 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
668 EXPECT_EQ(111, opus.pltype);
669}
670
671// Test that changes to recv codecs are applied to all streams.
672TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700673 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200674 cricket::AudioRecvParameters parameters;
675 parameters.codecs.push_back(kIsacCodec);
676 parameters.codecs.push_back(kPcmuCodec);
677 parameters.codecs.push_back(kTelephoneEventCodec);
678 parameters.codecs[0].id = 106; // collide with existing telephone-event
679 parameters.codecs[2].id = 126;
680 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 EXPECT_TRUE(channel_->AddRecvStream(
682 cricket::StreamParams::CreateLegacy(kSsrc1)));
683 int channel_num2 = voe_.GetLastChannel();
684 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800685 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 gcodec.plfreq = 16000;
687 gcodec.channels = 1;
688 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
689 EXPECT_EQ(106, gcodec.pltype);
690 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800691 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 gcodec.plfreq = 8000;
693 gcodec.channels = 1;
694 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
695 EXPECT_EQ(126, gcodec.pltype);
696 EXPECT_STREQ("telephone-event", gcodec.plname);
697}
698
699TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700700 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200701 cricket::AudioRecvParameters parameters;
702 parameters.codecs.push_back(kIsacCodec);
703 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200704 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705
706 int channel_num2 = voe_.GetLastChannel();
707 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800708 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 gcodec.plfreq = 16000;
710 gcodec.channels = 1;
711 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
712 EXPECT_EQ(106, gcodec.pltype);
713 EXPECT_STREQ("ISAC", gcodec.plname);
714}
715
716// Test that we can apply the same set of codecs again while playing.
717TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700718 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200719 cricket::AudioRecvParameters parameters;
720 parameters.codecs.push_back(kIsacCodec);
721 parameters.codecs.push_back(kCn16000Codec);
722 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200724 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725
726 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200727 parameters.codecs[0].id = 127;
728 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
729 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 EXPECT_TRUE(voe_.GetPlayout(channel_num));
731}
732
733// Test that we can add a codec while playing.
734TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700735 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200736 cricket::AudioRecvParameters parameters;
737 parameters.codecs.push_back(kIsacCodec);
738 parameters.codecs.push_back(kCn16000Codec);
739 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_TRUE(channel_->SetPlayout(true));
741
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200742 parameters.codecs.push_back(kOpusCodec);
743 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
744 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745 EXPECT_TRUE(voe_.GetPlayout(channel_num));
746 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800747 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
749}
750
751TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700752 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000754 // Test that when autobw is enabled, bitrate is kept as the default
755 // value. autobw is enabled for the following tests because the target
756 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757
758 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000759 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760
761 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000762 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000765 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766}
767
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000768TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700769 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000771 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772
773 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000774 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
775 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000778 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
779 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780}
781
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000782TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700783 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000784
785 // Test that we can only set a maximum bitrate for a fixed-rate codec
786 // if it's bigger than the fixed rate.
787
788 // PCMU, fixed bitrate == 64000.
789 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
790 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
791 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
792 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
793 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
794 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
795 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
796}
797
798TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700799 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200800 const int kDesiredBitrate = 128000;
801 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700802 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200803 parameters.max_bandwidth_bps = kDesiredBitrate;
804 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000805
806 EXPECT_TRUE(channel_->AddSendStream(
807 cricket::StreamParams::CreateLegacy(kSsrc1)));
808
809 int channel_num = voe_.GetLastChannel();
810 webrtc::CodecInst codec;
811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200812 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000813}
814
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815// Test that bitrate cannot be set for CBR codecs.
816// Bitrate is ignored if it is higher than the fixed bitrate.
817// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000818TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700819 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820
821 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200822 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
823 int channel_num = voe_.GetLastChannel();
824 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
826 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200827
828 send_parameters_.max_bandwidth_bps = 128000;
829 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000830 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
831 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200832
833 send_parameters_.max_bandwidth_bps = 128;
834 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
836 EXPECT_EQ(64000, codec.rate);
837}
838
skvlade0d46372016-04-07 22:59:22 -0700839// Test that the per-stream bitrate limit and the global
840// bitrate limit both apply.
841TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
842 EXPECT_TRUE(SetupSendStream());
843
844 // opus, default bitrate == 64000.
845 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
846 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
847 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
848 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
849
850 // CBR codecs allow both maximums to exceed the bitrate.
851 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
852 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
853 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
854 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
855
856 // CBR codecs don't allow per stream maximums to be too low.
857 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
858 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
859}
860
861// Test that an attempt to set RtpParameters for a stream that does not exist
862// fails.
863TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
864 EXPECT_TRUE(SetupChannel());
865 webrtc::RtpParameters nonexistent_parameters =
866 channel_->GetRtpParameters(kSsrc1);
867 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
868
869 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
870 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, nonexistent_parameters));
871}
872
873TEST_F(WebRtcVoiceEngineTestFake,
874 CannotSetRtpParametersWithIncorrectNumberOfEncodings) {
875 // This test verifies that setting RtpParameters succeeds only if
876 // the structure contains exactly one encoding.
877 // TODO(skvlad): Update this test when we start supporting setting parameters
878 // for each encoding individually.
879
880 EXPECT_TRUE(SetupSendStream());
881 // Setting RtpParameters with no encoding is expected to fail.
882 webrtc::RtpParameters parameters;
883 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
884 // Setting RtpParameters with exactly one encoding should succeed.
885 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
886 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
887 // Two or more encodings should result in failure.
888 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
889 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
890}
891
892// Test that SetRtpParameters configures the correct encoding channel for each
893// SSRC.
894TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
895 SetupForMultiSendStream();
896 // Create send streams.
897 for (uint32_t ssrc : kSsrcs4) {
898 EXPECT_TRUE(
899 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
900 }
901 // Configure one stream to be limited by the stream config, another to be
902 // limited by the global max, and the third one with no per-stream limit
903 // (still subject to the global limit).
904 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
905 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
906 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
907 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
908
909 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
910 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
911 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
912
913 // Remove the global cap; the streams should switch to their respective
914 // maximums (or remain unchanged if there was no other limit on them.)
915 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
916 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
917 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
918 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
919}
920
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700921// Test that GetRtpParameters returns the currently configured codecs.
922TEST_F(WebRtcVoiceEngineTestFake, GetRtpParametersCodecs) {
923 EXPECT_TRUE(SetupSendStream());
924 cricket::AudioSendParameters parameters;
925 parameters.codecs.push_back(kIsacCodec);
926 parameters.codecs.push_back(kPcmuCodec);
927 EXPECT_TRUE(channel_->SetSendParameters(parameters));
928
929 webrtc::RtpParameters rtp_parameters = channel_->GetRtpParameters(kSsrc1);
930 ASSERT_EQ(2u, rtp_parameters.codecs.size());
931 EXPECT_EQ(kIsacCodec.id, rtp_parameters.codecs[0].payload_type);
932 EXPECT_EQ(kIsacCodec.name, rtp_parameters.codecs[0].mime_type);
933 EXPECT_EQ(kIsacCodec.clockrate, rtp_parameters.codecs[0].clock_rate);
934 EXPECT_EQ(kIsacCodec.channels, rtp_parameters.codecs[0].channels);
935 EXPECT_EQ(kPcmuCodec.id, rtp_parameters.codecs[1].payload_type);
936 EXPECT_EQ(kPcmuCodec.name, rtp_parameters.codecs[1].mime_type);
937 EXPECT_EQ(kPcmuCodec.clockrate, rtp_parameters.codecs[1].clock_rate);
938 EXPECT_EQ(kPcmuCodec.channels, rtp_parameters.codecs[1].channels);
939}
940
941// Test that if we set/get parameters multiple times, we get the same results.
942TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpParameters) {
943 EXPECT_TRUE(SetupSendStream());
944 cricket::AudioSendParameters parameters;
945 parameters.codecs.push_back(kIsacCodec);
946 parameters.codecs.push_back(kPcmuCodec);
947 EXPECT_TRUE(channel_->SetSendParameters(parameters));
948
949 webrtc::RtpParameters initial_params = channel_->GetRtpParameters(kSsrc1);
950
951 // We should be able to set the params we just got.
952 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, initial_params));
953
954 // ... And this shouldn't change the params returned by GetRtpParameters.
955 webrtc::RtpParameters new_params = channel_->GetRtpParameters(kSsrc1);
956 EXPECT_EQ(initial_params, channel_->GetRtpParameters(kSsrc1));
957}
958
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959// Test that we apply codecs properly.
960TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700961 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200962 cricket::AudioSendParameters parameters;
963 parameters.codecs.push_back(kIsacCodec);
964 parameters.codecs.push_back(kPcmuCodec);
965 parameters.codecs.push_back(kRedCodec);
966 parameters.codecs[0].id = 96;
967 parameters.codecs[0].bitrate = 48000;
968 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000969 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200970 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971 webrtc::CodecInst gcodec;
972 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
973 EXPECT_EQ(96, gcodec.pltype);
974 EXPECT_EQ(48000, gcodec.rate);
975 EXPECT_STREQ("ISAC", gcodec.plname);
976 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000977 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
979 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100980 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981}
982
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000983// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
984// to apply.
985TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700986 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200987 cricket::AudioSendParameters parameters;
988 parameters.codecs.push_back(kIsacCodec);
989 parameters.codecs.push_back(kPcmuCodec);
990 parameters.codecs.push_back(kRedCodec);
991 parameters.codecs[0].id = 96;
992 parameters.codecs[0].bitrate = 48000;
993 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000994 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
995 // Calling SetSendCodec again with same codec which is already set.
996 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200997 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000998 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
999}
1000
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001001// Verify that G722 is set with 16000 samples per second to WebRTC.
1002TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001003 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001004 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001005 cricket::AudioSendParameters parameters;
1006 parameters.codecs.push_back(kG722CodecSdp);
1007 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001008 webrtc::CodecInst gcodec;
1009 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1010 EXPECT_STREQ("G722", gcodec.plname);
1011 EXPECT_EQ(1, gcodec.channels);
1012 EXPECT_EQ(16000, gcodec.plfreq);
1013}
1014
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001015// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001017 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001018 cricket::AudioSendParameters parameters;
1019 parameters.codecs.push_back(kOpusCodec);
1020 parameters.codecs[0].bitrate = 0;
1021 parameters.codecs[0].clockrate = 50000;
1022 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001023}
1024
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001025// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001027 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001028 cricket::AudioSendParameters parameters;
1029 parameters.codecs.push_back(kOpusCodec);
1030 parameters.codecs[0].bitrate = 0;
1031 parameters.codecs[0].channels = 0;
1032 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033}
1034
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001035// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001037 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001038 cricket::AudioSendParameters parameters;
1039 parameters.codecs.push_back(kOpusCodec);
1040 parameters.codecs[0].bitrate = 0;
1041 parameters.codecs[0].channels = 0;
1042 parameters.codecs[0].params["stereo"] = "1";
1043 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001044}
1045
1046// Test that if channel is 1 for opus and there's no stereo, we fail.
1047TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001048 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 cricket::AudioSendParameters parameters;
1050 parameters.codecs.push_back(kOpusCodec);
1051 parameters.codecs[0].bitrate = 0;
1052 parameters.codecs[0].channels = 1;
1053 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054}
1055
1056// Test that if channel is 1 for opus and stereo=0, we fail.
1057TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001058 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001059 cricket::AudioSendParameters parameters;
1060 parameters.codecs.push_back(kOpusCodec);
1061 parameters.codecs[0].bitrate = 0;
1062 parameters.codecs[0].channels = 1;
1063 parameters.codecs[0].params["stereo"] = "0";
1064 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001065}
1066
1067// Test that if channel is 1 for opus and stereo=1, we fail.
1068TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001069 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 cricket::AudioSendParameters parameters;
1071 parameters.codecs.push_back(kOpusCodec);
1072 parameters.codecs[0].bitrate = 0;
1073 parameters.codecs[0].channels = 1;
1074 parameters.codecs[0].params["stereo"] = "1";
1075 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001076}
1077
1078// Test that with bitrate=0 and no stereo,
1079// channels and bitrate are 1 and 32000.
1080TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001081 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001082 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001083 cricket::AudioSendParameters parameters;
1084 parameters.codecs.push_back(kOpusCodec);
1085 parameters.codecs[0].bitrate = 0;
1086 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001087 webrtc::CodecInst gcodec;
1088 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1089 EXPECT_STREQ("opus", gcodec.plname);
1090 EXPECT_EQ(1, gcodec.channels);
1091 EXPECT_EQ(32000, gcodec.rate);
1092}
1093
1094// Test that with bitrate=0 and stereo=0,
1095// channels and bitrate are 1 and 32000.
1096TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001097 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001099 cricket::AudioSendParameters parameters;
1100 parameters.codecs.push_back(kOpusCodec);
1101 parameters.codecs[0].bitrate = 0;
1102 parameters.codecs[0].params["stereo"] = "0";
1103 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 webrtc::CodecInst gcodec;
1105 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1106 EXPECT_STREQ("opus", gcodec.plname);
1107 EXPECT_EQ(1, gcodec.channels);
1108 EXPECT_EQ(32000, gcodec.rate);
1109}
1110
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001111// Test that with bitrate=invalid and stereo=0,
1112// channels and bitrate are 1 and 32000.
1113TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001114 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001115 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001116 cricket::AudioSendParameters parameters;
1117 parameters.codecs.push_back(kOpusCodec);
1118 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001119 webrtc::CodecInst gcodec;
1120
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001121 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001122 parameters.codecs[0].bitrate = 5999;
1123 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001124 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1125 EXPECT_STREQ("opus", gcodec.plname);
1126 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001127 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001128
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001129 parameters.codecs[0].bitrate = 510001;
1130 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001131 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1132 EXPECT_STREQ("opus", gcodec.plname);
1133 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001134 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001135}
1136
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137// Test that with bitrate=0 and stereo=1,
1138// channels and bitrate are 2 and 64000.
1139TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001140 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001141 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001142 cricket::AudioSendParameters parameters;
1143 parameters.codecs.push_back(kOpusCodec);
1144 parameters.codecs[0].bitrate = 0;
1145 parameters.codecs[0].params["stereo"] = "1";
1146 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147 webrtc::CodecInst gcodec;
1148 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1149 EXPECT_STREQ("opus", gcodec.plname);
1150 EXPECT_EQ(2, gcodec.channels);
1151 EXPECT_EQ(64000, gcodec.rate);
1152}
1153
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001154// Test that with bitrate=invalid and stereo=1,
1155// channels and bitrate are 2 and 64000.
1156TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001157 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001158 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001159 cricket::AudioSendParameters parameters;
1160 parameters.codecs.push_back(kOpusCodec);
1161 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001162 webrtc::CodecInst gcodec;
1163
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001164 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001165 parameters.codecs[0].bitrate = 5999;
1166 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001167 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1168 EXPECT_STREQ("opus", gcodec.plname);
1169 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001170 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001171
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001172 parameters.codecs[0].bitrate = 510001;
1173 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001174 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1175 EXPECT_STREQ("opus", gcodec.plname);
1176 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001177 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001178}
1179
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180// Test that with bitrate=N and stereo unset,
1181// channels and bitrate are 1 and N.
1182TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001183 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001185 cricket::AudioSendParameters parameters;
1186 parameters.codecs.push_back(kOpusCodec);
1187 parameters.codecs[0].bitrate = 96000;
1188 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 webrtc::CodecInst gcodec;
1190 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1191 EXPECT_EQ(111, gcodec.pltype);
1192 EXPECT_EQ(96000, gcodec.rate);
1193 EXPECT_STREQ("opus", gcodec.plname);
1194 EXPECT_EQ(1, gcodec.channels);
1195 EXPECT_EQ(48000, gcodec.plfreq);
1196}
1197
1198// Test that with bitrate=N and stereo=0,
1199// channels and bitrate are 1 and N.
1200TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001201 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001202 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001203 cricket::AudioSendParameters parameters;
1204 parameters.codecs.push_back(kOpusCodec);
1205 parameters.codecs[0].bitrate = 30000;
1206 parameters.codecs[0].params["stereo"] = "0";
1207 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001208 webrtc::CodecInst gcodec;
1209 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1210 EXPECT_EQ(1, gcodec.channels);
1211 EXPECT_EQ(30000, gcodec.rate);
1212 EXPECT_STREQ("opus", gcodec.plname);
1213}
1214
1215// Test that with bitrate=N and without any parameters,
1216// channels and bitrate are 1 and N.
1217TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001218 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001219 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001220 cricket::AudioSendParameters parameters;
1221 parameters.codecs.push_back(kOpusCodec);
1222 parameters.codecs[0].bitrate = 30000;
1223 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 webrtc::CodecInst gcodec;
1225 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1226 EXPECT_EQ(1, gcodec.channels);
1227 EXPECT_EQ(30000, gcodec.rate);
1228 EXPECT_STREQ("opus", gcodec.plname);
1229}
1230
1231// Test that with bitrate=N and stereo=1,
1232// channels and bitrate are 2 and N.
1233TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001234 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001235 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001236 cricket::AudioSendParameters parameters;
1237 parameters.codecs.push_back(kOpusCodec);
1238 parameters.codecs[0].bitrate = 30000;
1239 parameters.codecs[0].params["stereo"] = "1";
1240 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001241 webrtc::CodecInst gcodec;
1242 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1243 EXPECT_EQ(2, gcodec.channels);
1244 EXPECT_EQ(30000, gcodec.rate);
1245 EXPECT_STREQ("opus", gcodec.plname);
1246}
1247
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001248// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1249// Also test that the "maxaveragebitrate" can't be set to values outside the
1250// range of 6000 and 510000
1251TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001252 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001253 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001254 cricket::AudioSendParameters parameters;
1255 parameters.codecs.push_back(kOpusCodec);
1256 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001257 webrtc::CodecInst gcodec;
1258
1259 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001260 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1261 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001262 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001263 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001264
1265 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001266 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1267 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001268 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001269 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001270
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001271 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1272 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001273 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1274 EXPECT_EQ(200000, gcodec.rate);
1275}
1276
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001277// Test that we can enable NACK with opus as caller.
1278TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001279 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001280 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001281 cricket::AudioSendParameters parameters;
1282 parameters.codecs.push_back(kOpusCodec);
1283 parameters.codecs[0].AddFeedbackParam(
1284 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1285 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001286 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001287 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001288 EXPECT_TRUE(voe_.GetNACK(channel_num));
1289}
1290
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001291// Test that we can enable NACK with opus as callee.
1292TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001293 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001294 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001295 cricket::AudioSendParameters parameters;
1296 parameters.codecs.push_back(kOpusCodec);
1297 parameters.codecs[0].AddFeedbackParam(
1298 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1299 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001300 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001301 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001302 EXPECT_FALSE(voe_.GetNACK(channel_num));
1303
1304 EXPECT_TRUE(channel_->AddSendStream(
1305 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001306 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001307}
1308
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309// Test that we can enable NACK on receive streams.
1310TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001311 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001312 int channel_num1 = voe_.GetLastChannel();
1313 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1314 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001315 cricket::AudioSendParameters parameters;
1316 parameters.codecs.push_back(kOpusCodec);
1317 parameters.codecs[0].AddFeedbackParam(
1318 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1319 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1321 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001322 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001323 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1324 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1325}
1326
1327// Test that we can disable NACK.
1328TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001329 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001330 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001331 cricket::AudioSendParameters parameters;
1332 parameters.codecs.push_back(kOpusCodec);
1333 parameters.codecs[0].AddFeedbackParam(
1334 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1335 cricket::kParamValueEmpty));
1336 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001337 EXPECT_TRUE(voe_.GetNACK(channel_num));
1338
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001339 parameters.codecs.clear();
1340 parameters.codecs.push_back(kOpusCodec);
1341 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001342 EXPECT_FALSE(voe_.GetNACK(channel_num));
1343}
1344
1345// Test that we can disable NACK on receive streams.
1346TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001347 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001348 int channel_num1 = voe_.GetLastChannel();
1349 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1350 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001351 cricket::AudioSendParameters parameters;
1352 parameters.codecs.push_back(kOpusCodec);
1353 parameters.codecs[0].AddFeedbackParam(
1354 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1355 cricket::kParamValueEmpty));
1356 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001357 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1358 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1359
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001360 parameters.codecs.clear();
1361 parameters.codecs.push_back(kOpusCodec);
1362 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001363 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1364 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1365}
1366
1367// Test that NACK is enabled on a new receive stream.
1368TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001369 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001370 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 cricket::AudioSendParameters parameters;
1372 parameters.codecs.push_back(kIsacCodec);
1373 parameters.codecs.push_back(kCn16000Codec);
1374 parameters.codecs[0].AddFeedbackParam(
1375 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1376 cricket::kParamValueEmpty));
1377 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001378 EXPECT_TRUE(voe_.GetNACK(channel_num));
1379
1380 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1381 channel_num = voe_.GetLastChannel();
1382 EXPECT_TRUE(voe_.GetNACK(channel_num));
1383 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1384 channel_num = voe_.GetLastChannel();
1385 EXPECT_TRUE(voe_.GetNACK(channel_num));
1386}
1387
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001388// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001389TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001390 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001391 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001392 cricket::AudioSendParameters parameters;
1393 parameters.codecs.push_back(kOpusCodec);
1394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001395 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1396}
1397
1398// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001399TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001400 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001401 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001402 cricket::AudioSendParameters parameters;
1403 parameters.codecs.push_back(kOpusCodec);
1404 parameters.codecs[0].bitrate = 0;
1405 parameters.codecs[0].params["useinbandfec"] = "0";
1406 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001407 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1408 webrtc::CodecInst gcodec;
1409 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1410 EXPECT_STREQ("opus", gcodec.plname);
1411 EXPECT_EQ(1, gcodec.channels);
1412 EXPECT_EQ(32000, gcodec.rate);
1413}
1414
1415// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001416TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001417 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001418 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001419 cricket::AudioSendParameters parameters;
1420 parameters.codecs.push_back(kOpusCodec);
1421 parameters.codecs[0].bitrate = 0;
1422 parameters.codecs[0].params["useinbandfec"] = "1";
1423 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001424 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1425 webrtc::CodecInst gcodec;
1426 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1427 EXPECT_STREQ("opus", gcodec.plname);
1428 EXPECT_EQ(1, gcodec.channels);
1429 EXPECT_EQ(32000, gcodec.rate);
1430}
1431
1432// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001433TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001434 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001435 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001436 cricket::AudioSendParameters parameters;
1437 parameters.codecs.push_back(kOpusCodec);
1438 parameters.codecs[0].bitrate = 0;
1439 parameters.codecs[0].params["stereo"] = "1";
1440 parameters.codecs[0].params["useinbandfec"] = "1";
1441 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001442 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1443 webrtc::CodecInst gcodec;
1444 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1445 EXPECT_STREQ("opus", gcodec.plname);
1446 EXPECT_EQ(2, gcodec.channels);
1447 EXPECT_EQ(64000, gcodec.rate);
1448}
1449
1450// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001451TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001452 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001453 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001454 cricket::AudioSendParameters parameters;
1455 parameters.codecs.push_back(kIsacCodec);
1456 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001457 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1458}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001459
1460// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1461TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001462 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001463 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001464 cricket::AudioSendParameters parameters;
1465 parameters.codecs.push_back(kIsacCodec);
1466 parameters.codecs[0].params["useinbandfec"] = "1";
1467 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001468 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1469}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001470
1471// Test that Opus FEC status can be changed.
1472TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001473 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001474 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001475 cricket::AudioSendParameters parameters;
1476 parameters.codecs.push_back(kOpusCodec);
1477 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001478 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001479 parameters.codecs[0].params["useinbandfec"] = "1";
1480 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001481 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1482}
1483
stefanba4c0e42016-02-04 04:12:24 -08001484TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001485 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001486 cricket::AudioSendParameters send_parameters;
1487 send_parameters.codecs.push_back(kOpusCodec);
1488 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1489 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1490
1491 cricket::AudioRecvParameters recv_parameters;
1492 recv_parameters.codecs.push_back(kIsacCodec);
1493 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1494 EXPECT_TRUE(
1495 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1496 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1497 EXPECT_FALSE(
1498 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1499
solenbergbc37fc82016-04-04 09:54:44 -07001500 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001501 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1502 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1503 EXPECT_TRUE(
1504 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1505}
1506
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001507// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1508TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001509 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001510 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001511 cricket::AudioSendParameters parameters;
1512 parameters.codecs.push_back(kOpusCodec);
1513 parameters.codecs[0].bitrate = 0;
1514 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1515 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001516 EXPECT_EQ(cricket::kOpusBandwidthNb,
1517 voe_.GetMaxEncodingBandwidth(channel_num));
1518 webrtc::CodecInst gcodec;
1519 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1520 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001521
1522 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001523 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1524 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001525 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1526 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001527}
1528
1529// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1530TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001531 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001532 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001533 cricket::AudioSendParameters parameters;
1534 parameters.codecs.push_back(kOpusCodec);
1535 parameters.codecs[0].bitrate = 0;
1536 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1537 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001538 EXPECT_EQ(cricket::kOpusBandwidthMb,
1539 voe_.GetMaxEncodingBandwidth(channel_num));
1540 webrtc::CodecInst gcodec;
1541 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1542 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001543
1544 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001545 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1546 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001547 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1548 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001549}
1550
1551// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1552TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001553 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001554 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001555 cricket::AudioSendParameters parameters;
1556 parameters.codecs.push_back(kOpusCodec);
1557 parameters.codecs[0].bitrate = 0;
1558 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560 EXPECT_EQ(cricket::kOpusBandwidthWb,
1561 voe_.GetMaxEncodingBandwidth(channel_num));
1562 webrtc::CodecInst gcodec;
1563 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1564 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001565
1566 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001567 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1568 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001569 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1570 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001571}
1572
1573// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1574TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001575 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001576 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001577 cricket::AudioSendParameters parameters;
1578 parameters.codecs.push_back(kOpusCodec);
1579 parameters.codecs[0].bitrate = 0;
1580 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1581 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001582 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1583 voe_.GetMaxEncodingBandwidth(channel_num));
1584 webrtc::CodecInst gcodec;
1585 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1586 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001587
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001588 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001589 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1590 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001591 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1592 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001593}
1594
1595// Test 24000 < maxplaybackrate triggers Opus full band mode.
1596TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001597 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001599 cricket::AudioSendParameters parameters;
1600 parameters.codecs.push_back(kOpusCodec);
1601 parameters.codecs[0].bitrate = 0;
1602 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1603 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001604 EXPECT_EQ(cricket::kOpusBandwidthFb,
1605 voe_.GetMaxEncodingBandwidth(channel_num));
1606 webrtc::CodecInst gcodec;
1607 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1608 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001609
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001610 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001611 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1612 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001613 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1614 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001615}
1616
1617// Test Opus that without maxplaybackrate, default playback rate is used.
1618TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001619 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001620 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001621 cricket::AudioSendParameters parameters;
1622 parameters.codecs.push_back(kOpusCodec);
1623 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001624 EXPECT_EQ(cricket::kOpusBandwidthFb,
1625 voe_.GetMaxEncodingBandwidth(channel_num));
1626}
1627
1628// Test the with non-Opus, maxplaybackrate has no effect.
1629TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001630 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001631 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001632 cricket::AudioSendParameters parameters;
1633 parameters.codecs.push_back(kIsacCodec);
1634 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1635 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001636 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1637}
1638
1639// Test maxplaybackrate can be set on two streams.
1640TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001641 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001642 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001643 cricket::AudioSendParameters parameters;
1644 parameters.codecs.push_back(kOpusCodec);
1645 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001646 // Default bandwidth is 24000.
1647 EXPECT_EQ(cricket::kOpusBandwidthFb,
1648 voe_.GetMaxEncodingBandwidth(channel_num));
1649
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001650 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001651
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001652 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001653 EXPECT_EQ(cricket::kOpusBandwidthNb,
1654 voe_.GetMaxEncodingBandwidth(channel_num));
1655
1656 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1657 channel_num = voe_.GetLastChannel();
1658 EXPECT_EQ(cricket::kOpusBandwidthNb,
1659 voe_.GetMaxEncodingBandwidth(channel_num));
1660}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001661
Minyue Li7100dcd2015-03-27 05:05:59 +01001662// Test that with usedtx=0, Opus DTX is off.
1663TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001664 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001665 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001666 cricket::AudioSendParameters parameters;
1667 parameters.codecs.push_back(kOpusCodec);
1668 parameters.codecs[0].params["usedtx"] = "0";
1669 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001670 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1671}
1672
1673// Test that with usedtx=1, Opus DTX is on.
1674TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001675 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001676 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001677 cricket::AudioSendParameters parameters;
1678 parameters.codecs.push_back(kOpusCodec);
1679 parameters.codecs[0].params["usedtx"] = "1";
1680 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001681 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1682 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1683}
1684
1685// Test that usedtx=1 works with stereo Opus.
1686TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001687 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001688 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001689 cricket::AudioSendParameters parameters;
1690 parameters.codecs.push_back(kOpusCodec);
1691 parameters.codecs[0].params["usedtx"] = "1";
1692 parameters.codecs[0].params["stereo"] = "1";
1693 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001694 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1695 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1696}
1697
1698// Test that usedtx=1 does not work with non Opus.
1699TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001700 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001701 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001702 cricket::AudioSendParameters parameters;
1703 parameters.codecs.push_back(kIsacCodec);
1704 parameters.codecs[0].params["usedtx"] = "1";
1705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001706 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1707}
1708
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001709// Test that we can switch back and forth between Opus and ISAC with CN.
1710TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001711 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001713 cricket::AudioSendParameters opus_parameters;
1714 opus_parameters.codecs.push_back(kOpusCodec);
1715 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716 webrtc::CodecInst gcodec;
1717 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001718 EXPECT_EQ(111, gcodec.pltype);
1719 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001721 cricket::AudioSendParameters isac_parameters;
1722 isac_parameters.codecs.push_back(kIsacCodec);
1723 isac_parameters.codecs.push_back(kCn16000Codec);
1724 isac_parameters.codecs.push_back(kOpusCodec);
1725 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1727 EXPECT_EQ(103, gcodec.pltype);
1728 EXPECT_STREQ("ISAC", gcodec.plname);
1729
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001730 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001732 EXPECT_EQ(111, gcodec.pltype);
1733 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734}
1735
1736// Test that we handle various ways of specifying bitrate.
1737TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001738 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001740 cricket::AudioSendParameters parameters;
1741 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1742 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 webrtc::CodecInst gcodec;
1744 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1745 EXPECT_EQ(103, gcodec.pltype);
1746 EXPECT_STREQ("ISAC", gcodec.plname);
1747 EXPECT_EQ(32000, gcodec.rate);
1748
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001749 parameters.codecs[0].bitrate = 0; // bitrate == default
1750 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1752 EXPECT_EQ(103, gcodec.pltype);
1753 EXPECT_STREQ("ISAC", gcodec.plname);
1754 EXPECT_EQ(-1, gcodec.rate);
1755
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001756 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1757 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1759 EXPECT_EQ(103, gcodec.pltype);
1760 EXPECT_STREQ("ISAC", gcodec.plname);
1761 EXPECT_EQ(28000, gcodec.rate);
1762
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001763 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1764 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1766 EXPECT_EQ(0, gcodec.pltype);
1767 EXPECT_STREQ("PCMU", gcodec.plname);
1768 EXPECT_EQ(64000, gcodec.rate);
1769
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001770 parameters.codecs[0].bitrate = 0; // bitrate == default
1771 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1773 EXPECT_EQ(0, gcodec.pltype);
1774 EXPECT_STREQ("PCMU", gcodec.plname);
1775 EXPECT_EQ(64000, gcodec.rate);
1776
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001777 parameters.codecs[0] = kOpusCodec;
1778 parameters.codecs[0].bitrate = 0; // bitrate == default
1779 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1781 EXPECT_EQ(111, gcodec.pltype);
1782 EXPECT_STREQ("opus", gcodec.plname);
1783 EXPECT_EQ(32000, gcodec.rate);
1784}
1785
Brave Yao5225dd82015-03-26 07:39:19 +08001786// Test that we could set packet size specified in kCodecParamPTime.
1787TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001788 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001789 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001790 cricket::AudioSendParameters parameters;
1791 parameters.codecs.push_back(kOpusCodec);
1792 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1793 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001794 webrtc::CodecInst gcodec;
1795 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1796 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1797
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001798 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1799 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001800 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1801 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1802
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001803 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1804 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001805 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1806 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1807
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001808 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1809 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1810 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1812 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1813
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001814 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1815 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1816 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1818 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1819}
1820
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001821// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001822TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001823 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001824 cricket::AudioSendParameters parameters;
1825 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001826}
1827
1828// Test that we can set send codecs even with telephone-event codec as the first
1829// one on the list.
1830TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001831 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001833 cricket::AudioSendParameters parameters;
1834 parameters.codecs.push_back(kTelephoneEventCodec);
1835 parameters.codecs.push_back(kIsacCodec);
1836 parameters.codecs.push_back(kPcmuCodec);
1837 parameters.codecs[0].id = 98; // DTMF
1838 parameters.codecs[1].id = 96;
1839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 webrtc::CodecInst gcodec;
1841 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001842 EXPECT_EQ(96, gcodec.pltype);
1843 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001844 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001845}
1846
solenberg31642aa2016-03-14 08:00:37 -07001847// Test that payload type range is limited for telephone-event codec.
1848TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001849 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001850 cricket::AudioSendParameters parameters;
1851 parameters.codecs.push_back(kTelephoneEventCodec);
1852 parameters.codecs.push_back(kIsacCodec);
1853 parameters.codecs[0].id = 0; // DTMF
1854 parameters.codecs[1].id = 96;
1855 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1856 EXPECT_TRUE(channel_->CanInsertDtmf());
1857 parameters.codecs[0].id = 128; // DTMF
1858 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1859 EXPECT_FALSE(channel_->CanInsertDtmf());
1860 parameters.codecs[0].id = 127;
1861 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1862 EXPECT_TRUE(channel_->CanInsertDtmf());
1863 parameters.codecs[0].id = -1; // DTMF
1864 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1865 EXPECT_FALSE(channel_->CanInsertDtmf());
1866}
1867
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001868// Test that we can set send codecs even with CN codec as the first
1869// one on the list.
1870TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001871 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001872 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001873 cricket::AudioSendParameters parameters;
1874 parameters.codecs.push_back(kCn16000Codec);
1875 parameters.codecs.push_back(kIsacCodec);
1876 parameters.codecs.push_back(kPcmuCodec);
1877 parameters.codecs[0].id = 98; // wideband CN
1878 parameters.codecs[1].id = 96;
1879 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001880 webrtc::CodecInst gcodec;
1881 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1882 EXPECT_EQ(96, gcodec.pltype);
1883 EXPECT_STREQ("ISAC", gcodec.plname);
1884 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001885}
1886
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001887// Test that we set VAD and DTMF types correctly as caller.
1888TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001889 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001890 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001891 cricket::AudioSendParameters parameters;
1892 parameters.codecs.push_back(kIsacCodec);
1893 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001894 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001895 parameters.codecs.push_back(kCn16000Codec);
1896 parameters.codecs.push_back(kCn8000Codec);
1897 parameters.codecs.push_back(kTelephoneEventCodec);
1898 parameters.codecs.push_back(kRedCodec);
1899 parameters.codecs[0].id = 96;
1900 parameters.codecs[2].id = 97; // wideband CN
1901 parameters.codecs[4].id = 98; // DTMF
1902 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903 webrtc::CodecInst gcodec;
1904 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1905 EXPECT_EQ(96, gcodec.pltype);
1906 EXPECT_STREQ("ISAC", gcodec.plname);
1907 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001908 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001909 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1910 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001911 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912}
1913
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001914// Test that we set VAD and DTMF types correctly as callee.
1915TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001916 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001917 cricket::AudioSendParameters parameters;
1918 parameters.codecs.push_back(kIsacCodec);
1919 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001920 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001921 parameters.codecs.push_back(kCn16000Codec);
1922 parameters.codecs.push_back(kCn8000Codec);
1923 parameters.codecs.push_back(kTelephoneEventCodec);
1924 parameters.codecs.push_back(kRedCodec);
1925 parameters.codecs[0].id = 96;
1926 parameters.codecs[2].id = 97; // wideband CN
1927 parameters.codecs[4].id = 98; // DTMF
1928 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001929 EXPECT_TRUE(channel_->AddSendStream(
1930 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001931 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001932
1933 webrtc::CodecInst gcodec;
1934 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1935 EXPECT_EQ(96, gcodec.pltype);
1936 EXPECT_STREQ("ISAC", gcodec.plname);
1937 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001938 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001939 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1940 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001941 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001942}
1943
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944// Test that we only apply VAD if we have a CN codec that matches the
1945// send codec clockrate.
1946TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001947 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001949 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001951 parameters.codecs.push_back(kIsacCodec);
1952 parameters.codecs.push_back(kCn16000Codec);
1953 parameters.codecs[1].id = 97;
1954 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 webrtc::CodecInst gcodec;
1956 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1957 EXPECT_STREQ("ISAC", gcodec.plname);
1958 EXPECT_TRUE(voe_.GetVAD(channel_num));
1959 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1960 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001961 parameters.codecs[0] = kPcmuCodec;
1962 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1964 EXPECT_STREQ("PCMU", gcodec.plname);
1965 EXPECT_FALSE(voe_.GetVAD(channel_num));
1966 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001967 parameters.codecs[1] = kCn8000Codec;
1968 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1970 EXPECT_STREQ("PCMU", gcodec.plname);
1971 EXPECT_TRUE(voe_.GetVAD(channel_num));
1972 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001973 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001974 parameters.codecs[0] = kIsacCodec;
1975 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1977 EXPECT_STREQ("ISAC", gcodec.plname);
1978 EXPECT_FALSE(voe_.GetVAD(channel_num));
1979}
1980
1981// Test that we perform case-insensitive matching of codec names.
1982TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001983 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001984 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001985 cricket::AudioSendParameters parameters;
1986 parameters.codecs.push_back(kIsacCodec);
1987 parameters.codecs.push_back(kPcmuCodec);
1988 parameters.codecs.push_back(kCn16000Codec);
1989 parameters.codecs.push_back(kCn8000Codec);
1990 parameters.codecs.push_back(kTelephoneEventCodec);
1991 parameters.codecs.push_back(kRedCodec);
1992 parameters.codecs[0].name = "iSaC";
1993 parameters.codecs[0].id = 96;
1994 parameters.codecs[2].id = 97; // wideband CN
1995 parameters.codecs[4].id = 98; // DTMF
1996 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997 webrtc::CodecInst gcodec;
1998 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1999 EXPECT_EQ(96, gcodec.pltype);
2000 EXPECT_STREQ("ISAC", gcodec.plname);
2001 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002002 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002003 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2004 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002005 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002006}
2007
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002008// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002009TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002010 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002011 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002012 cricket::AudioSendParameters parameters;
2013 parameters.codecs.push_back(kRedCodec);
2014 parameters.codecs.push_back(kIsacCodec);
2015 parameters.codecs.push_back(kPcmuCodec);
2016 parameters.codecs[0].id = 127;
2017 parameters.codecs[0].params[""] = "96/96";
2018 parameters.codecs[1].id = 96;
2019 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002020 webrtc::CodecInst gcodec;
2021 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2022 EXPECT_EQ(96, gcodec.pltype);
2023 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002024 EXPECT_TRUE(voe_.GetRED(channel_num));
2025 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026}
2027
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002028// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002029TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002030 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002031 cricket::AudioSendParameters parameters;
2032 parameters.codecs.push_back(kRedCodec);
2033 parameters.codecs.push_back(kIsacCodec);
2034 parameters.codecs.push_back(kPcmuCodec);
2035 parameters.codecs[0].id = 127;
2036 parameters.codecs[0].params[""] = "96/96";
2037 parameters.codecs[1].id = 96;
2038 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002039 EXPECT_TRUE(channel_->AddSendStream(
2040 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002041 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002042 webrtc::CodecInst gcodec;
2043 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2044 EXPECT_EQ(96, gcodec.pltype);
2045 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002046 EXPECT_TRUE(voe_.GetRED(channel_num));
2047 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002048}
2049
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002050// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002052 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002053 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002054 cricket::AudioSendParameters parameters;
2055 parameters.codecs.push_back(kRedCodec);
2056 parameters.codecs.push_back(kIsacCodec);
2057 parameters.codecs.push_back(kPcmuCodec);
2058 parameters.codecs[0].id = 127;
2059 parameters.codecs[1].id = 96;
2060 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002061 webrtc::CodecInst gcodec;
2062 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2063 EXPECT_EQ(96, gcodec.pltype);
2064 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002065 EXPECT_TRUE(voe_.GetRED(channel_num));
2066 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067}
2068
2069// Test that we ignore RED if the parameters aren't named the way we expect.
2070TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002071 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002072 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002073 cricket::AudioSendParameters parameters;
2074 parameters.codecs.push_back(kRedCodec);
2075 parameters.codecs.push_back(kIsacCodec);
2076 parameters.codecs.push_back(kPcmuCodec);
2077 parameters.codecs[0].id = 127;
2078 parameters.codecs[0].params["ABC"] = "96/96";
2079 parameters.codecs[1].id = 96;
2080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002081 webrtc::CodecInst gcodec;
2082 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2083 EXPECT_EQ(96, gcodec.pltype);
2084 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002085 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086}
2087
2088// Test that we ignore RED if it uses different primary/secondary encoding.
2089TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002090 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002091 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002092 cricket::AudioSendParameters parameters;
2093 parameters.codecs.push_back(kRedCodec);
2094 parameters.codecs.push_back(kIsacCodec);
2095 parameters.codecs.push_back(kPcmuCodec);
2096 parameters.codecs[0].id = 127;
2097 parameters.codecs[0].params[""] = "96/0";
2098 parameters.codecs[1].id = 96;
2099 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002100 webrtc::CodecInst gcodec;
2101 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2102 EXPECT_EQ(96, gcodec.pltype);
2103 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002104 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105}
2106
2107// Test that we ignore RED if it uses more than 2 encodings.
2108TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002109 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002111 cricket::AudioSendParameters parameters;
2112 parameters.codecs.push_back(kRedCodec);
2113 parameters.codecs.push_back(kIsacCodec);
2114 parameters.codecs.push_back(kPcmuCodec);
2115 parameters.codecs[0].id = 127;
2116 parameters.codecs[0].params[""] = "96/96/96";
2117 parameters.codecs[1].id = 96;
2118 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002119 webrtc::CodecInst gcodec;
2120 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2121 EXPECT_EQ(96, gcodec.pltype);
2122 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002123 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002124}
2125
2126// Test that we ignore RED if it has bogus codec ids.
2127TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002128 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002129 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002130 cricket::AudioSendParameters parameters;
2131 parameters.codecs.push_back(kRedCodec);
2132 parameters.codecs.push_back(kIsacCodec);
2133 parameters.codecs.push_back(kPcmuCodec);
2134 parameters.codecs[0].id = 127;
2135 parameters.codecs[0].params[""] = "ABC/ABC";
2136 parameters.codecs[1].id = 96;
2137 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002138 webrtc::CodecInst gcodec;
2139 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2140 EXPECT_EQ(96, gcodec.pltype);
2141 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002142 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143}
2144
2145// Test that we ignore RED if it refers to a codec that is not present.
2146TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002147 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002148 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002149 cricket::AudioSendParameters parameters;
2150 parameters.codecs.push_back(kRedCodec);
2151 parameters.codecs.push_back(kIsacCodec);
2152 parameters.codecs.push_back(kPcmuCodec);
2153 parameters.codecs[0].id = 127;
2154 parameters.codecs[0].params[""] = "97/97";
2155 parameters.codecs[1].id = 96;
2156 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002157 webrtc::CodecInst gcodec;
2158 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2159 EXPECT_EQ(96, gcodec.pltype);
2160 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002161 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002162}
2163
stefanba4c0e42016-02-04 04:12:24 -08002164class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2165 public:
2166 WebRtcVoiceEngineWithSendSideBweTest()
2167 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2168};
2169
2170TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2171 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002172 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002173 ASSERT_FALSE(capabilities.header_extensions.empty());
2174 for (const cricket::RtpHeaderExtension& extension :
2175 capabilities.header_extensions) {
2176 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2177 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2178 extension.id);
2179 return;
2180 }
2181 }
2182 FAIL() << "Transport sequence number extension not in header-extension list.";
2183}
2184
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002185// Test support for audio level header extension.
2186TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2187 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002188}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002189TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2190 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2191}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002192
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002193// Test support for absolute send time header extension.
2194TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2195 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2196}
2197TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2198 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002199}
2200
solenberg1ac56142015-10-13 03:58:19 -07002201// Test that we can create a channel and start sending on it.
2202TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002203 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002204 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002205 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002206 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002207 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002208 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2209}
2210
2211// Test that a channel will send if and only if it has a source and is enabled
2212// for sending.
2213TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002214 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002215 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2216 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002217 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002218 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2219 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2220 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2221 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2222 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002223}
2224
solenberg6d6e7c52016-04-13 09:07:30 -07002225// Test that SetSendParameters() does not alter a stream's send state.
2226TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2227 EXPECT_TRUE(SetupSendStream());
2228 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2229
2230 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002231 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002232 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2233
2234 // Changing RTP header extensions will recreate the AudioSendStream.
2235 send_parameters_.extensions.push_back(
2236 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2237 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2238 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2239
2240 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002241 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002242 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2243
2244 // Changing RTP header extensions will recreate the AudioSendStream.
2245 send_parameters_.extensions.clear();
2246 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2247 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2248}
2249
solenberg1ac56142015-10-13 03:58:19 -07002250// Test that we can create a channel and start playing out on it.
2251TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002252 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002253 int channel_num = voe_.GetLastChannel();
2254 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2255 EXPECT_TRUE(channel_->SetPlayout(true));
2256 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 EXPECT_TRUE(channel_->SetPlayout(false));
2258 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2259}
2260
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002261// Test that we can add and remove send streams.
2262TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2263 SetupForMultiSendStream();
2264
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002265 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002266 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002267
solenbergc96df772015-10-21 13:01:53 -07002268 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002269 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002270 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002271 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002272 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002273 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002274 }
tfarina5237aaf2015-11-10 23:44:30 -08002275 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002276
solenbergc96df772015-10-21 13:01:53 -07002277 // Delete the send streams.
2278 for (uint32_t ssrc : kSsrcs4) {
2279 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002280 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002281 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282 }
solenbergc96df772015-10-21 13:01:53 -07002283 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002284}
2285
2286// Test SetSendCodecs correctly configure the codecs in all send streams.
2287TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2288 SetupForMultiSendStream();
2289
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002290 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002291 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002292 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002293 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002294 }
2295
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002296 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002297 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002298 parameters.codecs.push_back(kIsacCodec);
2299 parameters.codecs.push_back(kCn16000Codec);
2300 parameters.codecs[1].id = 97;
2301 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002302
2303 // Verify ISAC and VAD are corrected configured on all send channels.
2304 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002305 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002306 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002307 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2308 EXPECT_STREQ("ISAC", gcodec.plname);
2309 EXPECT_TRUE(voe_.GetVAD(channel_num));
2310 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2311 }
2312
2313 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002314 parameters.codecs[0] = kPcmuCodec;
2315 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002316 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002317 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002318 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2319 EXPECT_STREQ("PCMU", gcodec.plname);
2320 EXPECT_FALSE(voe_.GetVAD(channel_num));
2321 }
2322}
2323
2324// Test we can SetSend on all send streams correctly.
2325TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2326 SetupForMultiSendStream();
2327
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002328 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002329 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002330 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002331 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002332 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2333 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002334 }
2335
2336 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002337 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002338 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002339 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002340 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002341 }
2342
2343 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002344 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002345 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002346 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002347 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002348 }
2349}
2350
2351// Test we can set the correct statistics on all send streams.
2352TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2353 SetupForMultiSendStream();
2354
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002355 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002356 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002357 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002358 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002359 }
solenberg85a04962015-10-27 03:35:21 -07002360 SetAudioSendStreamStats();
2361
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002362 // Create a receive stream to check that none of the send streams end up in
2363 // the receive stream stats.
2364 EXPECT_TRUE(channel_->AddRecvStream(
2365 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002366 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002367 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2368 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002369
solenberg85a04962015-10-27 03:35:21 -07002370 // Check stats for the added streams.
2371 {
2372 cricket::VoiceMediaInfo info;
2373 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002374
solenberg85a04962015-10-27 03:35:21 -07002375 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002376 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002377 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002378 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002379 }
2380
2381 // We have added one receive stream. We should see empty stats.
2382 EXPECT_EQ(info.receivers.size(), 1u);
2383 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002384 }
solenberg1ac56142015-10-13 03:58:19 -07002385
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002386 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002387 {
2388 cricket::VoiceMediaInfo info;
2389 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2390 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002391 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002392 EXPECT_EQ(0u, info.receivers.size());
2393 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002394
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002395 // Deliver a new packet - a default receive stream should be created and we
2396 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002397 {
2398 cricket::VoiceMediaInfo info;
2399 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2400 SetAudioReceiveStreamStats();
2401 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002402 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002403 EXPECT_EQ(1u, info.receivers.size());
2404 VerifyVoiceReceiverInfo(info.receivers[0]);
2405 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002406}
2407
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002408// Test that we can add and remove receive streams, and do proper send/playout.
2409// We can receive on multiple streams while sending one stream.
2410TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002411 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 int channel_num1 = voe_.GetLastChannel();
2413
solenberg1ac56142015-10-13 03:58:19 -07002414 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002415 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002416 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002417 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418
solenberg1ac56142015-10-13 03:58:19 -07002419 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002420 EXPECT_TRUE(
2421 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002423 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002424 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425
solenberg1ac56142015-10-13 03:58:19 -07002426 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2428 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2429
2430 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002431 EXPECT_TRUE(
2432 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433 int channel_num3 = voe_.GetLastChannel();
2434 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2435 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2436 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437
2438 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002439 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002440 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441
2442 // Stop playout.
2443 EXPECT_TRUE(channel_->SetPlayout(false));
2444 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2445 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2446 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2447
solenberg1ac56142015-10-13 03:58:19 -07002448 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002449 EXPECT_TRUE(channel_->SetPlayout(true));
2450 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2451 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2452 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2453
solenberg1ac56142015-10-13 03:58:19 -07002454 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002455 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2456 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002457 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458}
2459
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002461// and start sending on it.
2462TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002463 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002464 cricket::AudioOptions options_adjust_agc;
2465 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002466 webrtc::AgcConfig agc_config;
2467 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2468 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002469 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002470 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002471 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002472 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002473 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2474 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002475 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002476 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478}
2479
wu@webrtc.org97077a32013-10-25 21:18:33 +00002480TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002481 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002482 EXPECT_CALL(adm_,
2483 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002484 webrtc::AgcConfig agc_config;
2485 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2486 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002487 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2488 send_parameters_.options.tx_agc_digital_compression_gain =
2489 rtc::Optional<uint16_t>(9);
2490 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2491 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2492 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002493 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2494 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2495 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2496 EXPECT_TRUE(agc_config.limiterEnable);
2497
2498 // Check interaction with adjust_agc_delta. Both should be respected, for
2499 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002500 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2501 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002502 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2503 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2504}
2505
wu@webrtc.org97077a32013-10-25 21:18:33 +00002506TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002507 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002508 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2509 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002510 send_parameters_.options.recording_sample_rate =
2511 rtc::Optional<uint32_t>(48000);
2512 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2513 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002514}
2515
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002517// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002519 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002520 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521}
2522
2523TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2524 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002525 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002526 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002527 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002528 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002529 EXPECT_TRUE(channel_->AddRecvStream(
2530 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002531 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2532 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002533
solenberg85a04962015-10-27 03:35:21 -07002534 // Check stats for the added streams.
2535 {
2536 cricket::VoiceMediaInfo info;
2537 EXPECT_EQ(true, channel_->GetStats(&info));
2538
2539 // We have added one send stream. We should see the stats we've set.
2540 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002541 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002542 // We have added one receive stream. We should see empty stats.
2543 EXPECT_EQ(info.receivers.size(), 1u);
2544 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2545 }
solenberg1ac56142015-10-13 03:58:19 -07002546
solenberg566ef242015-11-06 15:34:49 -08002547 // Start sending - this affects some reported stats.
2548 {
2549 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002550 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002551 EXPECT_EQ(true, channel_->GetStats(&info));
2552 VerifyVoiceSenderInfo(info.senders[0], true);
2553 }
2554
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002555 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002556 {
2557 cricket::VoiceMediaInfo info;
2558 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2559 EXPECT_EQ(true, channel_->GetStats(&info));
2560 EXPECT_EQ(1u, info.senders.size());
2561 EXPECT_EQ(0u, info.receivers.size());
2562 }
solenberg1ac56142015-10-13 03:58:19 -07002563
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002564 // Deliver a new packet - a default receive stream should be created and we
2565 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002566 {
2567 cricket::VoiceMediaInfo info;
2568 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2569 SetAudioReceiveStreamStats();
2570 EXPECT_EQ(true, channel_->GetStats(&info));
2571 EXPECT_EQ(1u, info.senders.size());
2572 EXPECT_EQ(1u, info.receivers.size());
2573 VerifyVoiceReceiverInfo(info.receivers[0]);
2574 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002575}
2576
2577// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002578// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002579TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002580 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002581 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002582 EXPECT_TRUE(channel_->AddRecvStream(
2583 cricket::StreamParams::CreateLegacy(kSsrc2)));
2584 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002585}
2586
2587// Test that the local SSRC is the same on sending and receiving channels if the
2588// receive channel is created before the send channel.
2589TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002590 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002591 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2592 int receive_channel_num = voe_.GetLastChannel();
2593 EXPECT_TRUE(channel_->AddSendStream(
2594 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595
solenberg3a941542015-11-16 07:34:50 -08002596 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002597 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598}
2599
2600// Test that we can properly receive packets.
2601TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002602 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002603 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002604 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002605 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002606 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002607}
2608
2609// Test that we can properly receive packets on multiple streams.
2610TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002611 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002612 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2613 int channel_num1 = voe_.GetLastChannel();
2614 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2615 int channel_num2 = voe_.GetLastChannel();
2616 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2617 int channel_num3 = voe_.GetLastChannel();
2618 // Create packets with the right SSRCs.
2619 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002620 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002621 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002622 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002623 }
2624 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2625 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2626 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002627
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002628 DeliverPacket(packets[0], sizeof(packets[0]));
2629 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2630 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2631 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002632
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002633 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002634 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002635 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2636 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002637
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002638 DeliverPacket(packets[2], sizeof(packets[2]));
2639 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002640 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002641 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002642
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002643 DeliverPacket(packets[3], sizeof(packets[3]));
2644 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2645 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002646 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2647
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002648 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2649 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2650 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2651}
2652
solenberg7e63ef02015-11-20 00:19:43 -08002653// Test that receiving on an unsignalled stream works (default channel will be
2654// created).
2655TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002656 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002657 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2658 int channel_num = voe_.GetLastChannel();
2659 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2660}
2661
2662// Test that receiving on an unsignalled stream works (default channel will be
2663// created), and that packets will be forwarded to the default channel
2664// regardless of their SSRCs.
2665TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002666 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002667 char packet[sizeof(kPcmuFrame)];
2668 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2669
2670 // Note that the first unknown SSRC cannot be 0, because we only support
2671 // creating receive streams for SSRC!=0.
2672 DeliverPacket(packet, sizeof(packet));
2673 int channel_num = voe_.GetLastChannel();
2674 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2675 // Once we have the default channel, SSRC==0 will be ok.
2676 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2677 rtc::SetBE32(&packet[8], ssrc);
2678 DeliverPacket(packet, sizeof(packet));
2679 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2680 }
2681}
2682
2683// Test that a default channel is created even after a signalled stream has been
2684// added, and that this stream will get any packets for unknown SSRCs.
2685TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002686 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002687 char packet[sizeof(kPcmuFrame)];
2688 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2689
2690 // Add a known stream, send packet and verify we got it.
2691 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2692 int signalled_channel_num = voe_.GetLastChannel();
2693 DeliverPacket(packet, sizeof(packet));
2694 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2695
2696 // Note that the first unknown SSRC cannot be 0, because we only support
2697 // creating receive streams for SSRC!=0.
2698 rtc::SetBE32(&packet[8], 7011);
2699 DeliverPacket(packet, sizeof(packet));
2700 int channel_num = voe_.GetLastChannel();
2701 EXPECT_NE(channel_num, signalled_channel_num);
2702 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2703 // Once we have the default channel, SSRC==0 will be ok.
2704 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2705 rtc::SetBE32(&packet[8], ssrc);
2706 DeliverPacket(packet, sizeof(packet));
2707 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2708 }
2709}
2710
solenberg0a617e22015-10-20 15:49:38 -07002711// Test that we properly handle failures to add a receive stream.
2712TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002713 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002714 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002715 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716}
2717
solenberg0a617e22015-10-20 15:49:38 -07002718// Test that we properly handle failures to add a send stream.
2719TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002720 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002721 voe_.set_fail_create_channel(true);
2722 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2723}
2724
solenberg1ac56142015-10-13 03:58:19 -07002725// Test that AddRecvStream creates new stream.
2726TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002727 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728 int channel_num = voe_.GetLastChannel();
2729 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002730 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731}
2732
2733// Test that after adding a recv stream, we do not decode more codecs than
2734// those previously passed into SetRecvCodecs.
2735TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002736 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002737 cricket::AudioRecvParameters parameters;
2738 parameters.codecs.push_back(kIsacCodec);
2739 parameters.codecs.push_back(kPcmuCodec);
2740 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002741 EXPECT_TRUE(channel_->AddRecvStream(
2742 cricket::StreamParams::CreateLegacy(kSsrc1)));
2743 int channel_num2 = voe_.GetLastChannel();
2744 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002745 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002746 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 gcodec.channels = 2;
2748 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2749}
2750
2751// Test that we properly clean up any streams that were added, even if
2752// not explicitly removed.
2753TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002754 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002755 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2757 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2758 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2759 delete channel_;
2760 channel_ = NULL;
2761 EXPECT_EQ(0, voe_.GetNumChannels());
2762}
2763
wu@webrtc.org78187522013-10-07 23:32:02 +00002764TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002765 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002766 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2767}
2768
2769TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002770 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002771 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002772 // Manually delete channel to simulate a failure.
2773 int channel = voe_.GetLastChannel();
2774 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2775 // Add recv stream 2 should work.
2776 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002777 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002778 EXPECT_NE(channel, new_channel);
2779 // The last created channel is deleted too.
2780 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002781}
2782
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002783// Test the InsertDtmf on default send stream as caller.
2784TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2785 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002786}
2787
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002788// Test the InsertDtmf on default send stream as callee
2789TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2790 TestInsertDtmf(0, false);
2791}
2792
2793// Test the InsertDtmf on specified send stream as caller.
2794TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2795 TestInsertDtmf(kSsrc1, true);
2796}
2797
2798// Test the InsertDtmf on specified send stream as callee.
2799TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2800 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002801}
2802
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002803TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002804 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002805 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002806 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2808 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2809 EXPECT_TRUE(channel_->SetPlayout(true));
2810 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2811 EXPECT_TRUE(channel_->SetPlayout(false));
2812 EXPECT_FALSE(channel_->SetPlayout(true));
2813}
2814
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002815TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002816 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002817 EXPECT_CALL(adm_,
2818 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2819 EXPECT_CALL(adm_,
2820 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2821 EXPECT_CALL(adm_,
2822 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002823 bool ec_enabled;
2824 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002825 webrtc::AecmModes aecm_mode;
2826 bool cng_enabled;
2827 bool agc_enabled;
2828 webrtc::AgcModes agc_mode;
2829 webrtc::AgcConfig agc_config;
2830 bool ns_enabled;
2831 webrtc::NsModes ns_mode;
2832 bool highpass_filter_enabled;
2833 bool stereo_swapping_enabled;
2834 bool typing_detection_enabled;
2835 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002836 voe_.GetAecmMode(aecm_mode, cng_enabled);
2837 voe_.GetAgcStatus(agc_enabled, agc_mode);
2838 voe_.GetAgcConfig(agc_config);
2839 voe_.GetNsStatus(ns_enabled, ns_mode);
2840 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2841 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2842 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2843 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002844 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845 EXPECT_FALSE(cng_enabled);
2846 EXPECT_TRUE(agc_enabled);
2847 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2848 EXPECT_TRUE(ns_enabled);
2849 EXPECT_TRUE(highpass_filter_enabled);
2850 EXPECT_FALSE(stereo_swapping_enabled);
2851 EXPECT_TRUE(typing_detection_enabled);
2852 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2853 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002854 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2855 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856
solenberg246b8172015-12-08 09:50:23 -08002857 // Nothing set in AudioOptions, so everything should be as default.
2858 send_parameters_.options = cricket::AudioOptions();
2859 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002860 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 voe_.GetAecmMode(aecm_mode, cng_enabled);
2862 voe_.GetAgcStatus(agc_enabled, agc_mode);
2863 voe_.GetAgcConfig(agc_config);
2864 voe_.GetNsStatus(ns_enabled, ns_mode);
2865 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2866 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2867 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2868 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002869 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002870 EXPECT_FALSE(cng_enabled);
2871 EXPECT_TRUE(agc_enabled);
2872 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2873 EXPECT_TRUE(ns_enabled);
2874 EXPECT_TRUE(highpass_filter_enabled);
2875 EXPECT_FALSE(stereo_swapping_enabled);
2876 EXPECT_TRUE(typing_detection_enabled);
2877 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2878 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002879 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2880 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002881
2882 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002883 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2884 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885 voe_.GetEcStatus(ec_enabled, ec_mode);
2886 EXPECT_FALSE(ec_enabled);
2887
2888 // Turn echo cancellation back on, with settings, and make sure
2889 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002890 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
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_TRUE(agc_enabled);
2903 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2904 EXPECT_TRUE(ns_enabled);
2905 EXPECT_TRUE(highpass_filter_enabled);
2906 EXPECT_FALSE(stereo_swapping_enabled);
2907 EXPECT_TRUE(typing_detection_enabled);
2908 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2909 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2910
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002911 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2912 // control.
solenberg246b8172015-12-08 09:50:23 -08002913 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2914 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002915 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002916 voe_.GetAecmMode(aecm_mode, cng_enabled);
2917 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002918 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002919 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2920
2921 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002922 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2923 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2924 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2925 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002926 voe_.GetEcStatus(ec_enabled, ec_mode);
2927 EXPECT_FALSE(ec_enabled);
2928 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002929 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2930 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002931 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002932 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002933 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002934 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2935
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002936 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002937 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2938 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002939 voe_.GetAgcStatus(agc_enabled, agc_mode);
2940 EXPECT_FALSE(agc_enabled);
2941
2942 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002943 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2944 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2945 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 voe_.GetAgcStatus(agc_enabled, agc_mode);
2947 EXPECT_TRUE(agc_enabled);
2948 voe_.GetAgcConfig(agc_config);
2949 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2950
2951 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002952 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2953 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2954 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2955 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2956 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002957 voe_.GetNsStatus(ns_enabled, ns_mode);
2958 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2959 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2960 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2961 EXPECT_FALSE(ns_enabled);
2962 EXPECT_FALSE(highpass_filter_enabled);
2963 EXPECT_FALSE(typing_detection_enabled);
2964 EXPECT_TRUE(stereo_swapping_enabled);
2965
solenberg1ac56142015-10-13 03:58:19 -07002966 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002967 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002968 voe_.GetEcStatus(ec_enabled, ec_mode);
2969 voe_.GetNsStatus(ns_enabled, ns_mode);
2970 EXPECT_TRUE(ec_enabled);
2971 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2972 EXPECT_FALSE(ns_enabled);
2973 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2974}
2975
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002976TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002977 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002978
2979 bool ec_enabled;
2980 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002981 bool agc_enabled;
2982 webrtc::AgcModes agc_mode;
2983 bool ns_enabled;
2984 webrtc::NsModes ns_mode;
2985 bool highpass_filter_enabled;
2986 bool stereo_swapping_enabled;
2987 bool typing_detection_enabled;
2988
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002989 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002990 voe_.GetAgcStatus(agc_enabled, agc_mode);
2991 voe_.GetNsStatus(ns_enabled, ns_mode);
2992 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2993 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2994 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2995 EXPECT_TRUE(ec_enabled);
2996 EXPECT_TRUE(agc_enabled);
2997 EXPECT_TRUE(ns_enabled);
2998 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002999 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003000 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003001}
3002
3003TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3004 webrtc::AgcConfig set_config = {0};
3005 set_config.targetLeveldBOv = 3;
3006 set_config.digitalCompressionGaindB = 9;
3007 set_config.limiterEnable = true;
3008 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003009
3010 webrtc::AgcConfig config = {0};
3011 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3012 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3013 EXPECT_EQ(set_config.digitalCompressionGaindB,
3014 config.digitalCompressionGaindB);
3015 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3016}
3017
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003019 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003020 EXPECT_CALL(adm_,
3021 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3022 EXPECT_CALL(adm_,
3023 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3024 EXPECT_CALL(adm_,
3025 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3026
kwiberg686a8ef2016-02-26 03:00:35 -08003027 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003028 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003029 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003030 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003031 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003032 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003033
3034 // Have to add a stream to make SetSend work.
3035 cricket::StreamParams stream1;
3036 stream1.ssrcs.push_back(1);
3037 channel1->AddSendStream(stream1);
3038 cricket::StreamParams stream2;
3039 stream2.ssrcs.push_back(2);
3040 channel2->AddSendStream(stream2);
3041
3042 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003043 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003044 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3045 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3046 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003047 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3048 EXPECT_EQ(parameters_options_all.options, channel1->options());
3049 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3050 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003051
3052 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003053 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003054 parameters_options_no_ns.options.noise_suppression =
3055 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003056 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3057 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003058 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3059 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3060 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003061 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003062
3063 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003064 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003065 parameters_options_no_agc.options.auto_gain_control =
3066 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003067 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003068 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3069 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3070 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003071 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003072
solenberg246b8172015-12-08 09:50:23 -08003073 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003074 bool ec_enabled;
3075 webrtc::EcModes ec_mode;
3076 bool agc_enabled;
3077 webrtc::AgcModes agc_mode;
3078 bool ns_enabled;
3079 webrtc::NsModes ns_mode;
3080 voe_.GetEcStatus(ec_enabled, ec_mode);
3081 voe_.GetAgcStatus(agc_enabled, agc_mode);
3082 voe_.GetNsStatus(ns_enabled, ns_mode);
3083 EXPECT_TRUE(ec_enabled);
3084 EXPECT_TRUE(agc_enabled);
3085 EXPECT_TRUE(ns_enabled);
3086
solenbergd53a3f92016-04-14 13:56:37 -07003087 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003088 voe_.GetEcStatus(ec_enabled, ec_mode);
3089 voe_.GetAgcStatus(agc_enabled, agc_mode);
3090 voe_.GetNsStatus(ns_enabled, ns_mode);
3091 EXPECT_TRUE(ec_enabled);
3092 EXPECT_TRUE(agc_enabled);
3093 EXPECT_FALSE(ns_enabled);
3094
solenbergd53a3f92016-04-14 13:56:37 -07003095 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003096 voe_.GetEcStatus(ec_enabled, ec_mode);
3097 voe_.GetAgcStatus(agc_enabled, agc_mode);
3098 voe_.GetNsStatus(ns_enabled, ns_mode);
3099 EXPECT_TRUE(ec_enabled);
3100 EXPECT_FALSE(agc_enabled);
3101 EXPECT_TRUE(ns_enabled);
3102
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003103 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003104 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003105 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3106 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003107 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003108 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003109 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003110 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003111 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003112 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003113 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3114 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3115 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003116 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003117 voe_.GetEcStatus(ec_enabled, ec_mode);
3118 voe_.GetAgcStatus(agc_enabled, agc_mode);
3119 voe_.GetNsStatus(ns_enabled, ns_mode);
3120 EXPECT_TRUE(ec_enabled);
3121 EXPECT_FALSE(agc_enabled);
3122 EXPECT_FALSE(ns_enabled);
3123}
3124
wu@webrtc.orgde305012013-10-31 15:40:38 +00003125// This test verifies DSCP settings are properly applied on voice media channel.
3126TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003127 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003128 cricket::FakeNetworkInterface network_interface;
3129 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003130 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003131
solenbergbc37fc82016-04-04 09:54:44 -07003132 channel.reset(
3133 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003134 channel->SetInterface(&network_interface);
3135 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3136 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3137
3138 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003139 channel.reset(
3140 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003141 channel->SetInterface(&network_interface);
3142 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3143
3144 // Verify that setting the option to false resets the
3145 // DiffServCodePoint.
3146 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003147 channel.reset(
3148 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003149 channel->SetInterface(&network_interface);
3150 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3151 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3152
3153 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003154}
3155
solenberg1ac56142015-10-13 03:58:19 -07003156TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003157 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003158 cricket::WebRtcVoiceMediaChannel* media_channel =
3159 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003160 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3161 EXPECT_TRUE(channel_->AddRecvStream(
3162 cricket::StreamParams::CreateLegacy(kSsrc1)));
3163 int channel_id = voe_.GetLastChannel();
3164 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3165 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3166 EXPECT_TRUE(channel_->AddRecvStream(
3167 cricket::StreamParams::CreateLegacy(kSsrc2)));
3168 int channel_id2 = voe_.GetLastChannel();
3169 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003170}
3171
solenberg1ac56142015-10-13 03:58:19 -07003172TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003173 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003174 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003175 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3176 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3177 EXPECT_TRUE(channel_->AddSendStream(
3178 cricket::StreamParams::CreateLegacy(kSsrc1)));
3179 int channel_id = voe_.GetLastChannel();
3180 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3181 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3182 EXPECT_TRUE(channel_->AddSendStream(
3183 cricket::StreamParams::CreateLegacy(kSsrc2)));
3184 int channel_id2 = voe_.GetLastChannel();
3185 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003186}
3187
solenberg4bac9c52015-10-09 02:32:53 -07003188TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003189 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003190 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003191 cricket::StreamParams stream;
3192 stream.ssrcs.push_back(kSsrc2);
3193 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003194 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003195 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003196 float scale = 0;
3197 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3198 EXPECT_DOUBLE_EQ(3, scale);
3199}
3200
3201TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003202 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003203 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3204 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3205 int channel_id = voe_.GetLastChannel();
3206 float scale = 0;
3207 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3208 EXPECT_DOUBLE_EQ(2, scale);
3209 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003210 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003211 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003212}
3213
pbos8fc7fa72015-07-15 08:02:58 -07003214TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003215 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003216 const std::string kSyncLabel = "AvSyncLabel";
3217
solenbergff976312016-03-30 23:28:51 -07003218 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003219 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3220 sp.sync_label = kSyncLabel;
3221 // Creating two channels to make sure that sync label is set properly for both
3222 // the default voice channel and following ones.
3223 EXPECT_TRUE(channel_->AddRecvStream(sp));
3224 sp.ssrcs[0] += 1;
3225 EXPECT_TRUE(channel_->AddRecvStream(sp));
3226
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003227 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003228 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003229 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003230 << "SyncGroup should be set based on sync_label";
3231 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003232 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003233 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003234}
3235
solenberg3a941542015-11-16 07:34:50 -08003236// TODO(solenberg): Remove, once recv streams are configured through Call.
3237// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003238TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003239 // Test that setting the header extensions results in the expected state
3240 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003241 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003242 ssrcs.push_back(223);
3243 ssrcs.push_back(224);
3244
solenbergff976312016-03-30 23:28:51 -07003245 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003246 cricket::WebRtcVoiceMediaChannel* media_channel =
3247 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003248 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003249 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003250 EXPECT_TRUE(media_channel->AddRecvStream(
3251 cricket::StreamParams::CreateLegacy(ssrc)));
3252 }
3253
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003254 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003255 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003256 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003257 EXPECT_NE(nullptr, s);
3258 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3259 }
3260
3261 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003262 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003263 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003264 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003265 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003266 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003267 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003268 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003269 EXPECT_NE(nullptr, s);
3270 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003271 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3272 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003273 for (const auto& s_ext : s_exts) {
3274 if (e_ext.id == s_ext.id) {
3275 EXPECT_EQ(e_ext.uri, s_ext.name);
3276 }
3277 }
3278 }
3279 }
3280
3281 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003282 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003283 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003284 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003285 EXPECT_NE(nullptr, s);
3286 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3287 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003288}
3289
3290TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3291 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003292 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003293 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003294 static const unsigned char kRtcp[] = {
3295 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3296 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3299 };
jbaucheec21bd2016-03-20 06:15:43 -07003300 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003301
solenbergff976312016-03-30 23:28:51 -07003302 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003303 cricket::WebRtcVoiceMediaChannel* media_channel =
3304 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003305 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003306 EXPECT_TRUE(media_channel->AddRecvStream(
3307 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3308
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003309 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003310 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003311 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003312 EXPECT_EQ(0, s->received_packets());
3313 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3314 EXPECT_EQ(1, s->received_packets());
3315 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3316 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003317}
Minyue2013aec2015-05-13 14:14:42 +02003318
solenberg0a617e22015-10-20 15:49:38 -07003319// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003320// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003321TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003322 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003323 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003324 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003325 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3326 int recv_ch = voe_.GetLastChannel();
3327 EXPECT_NE(recv_ch, default_channel);
3328 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3329 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3330 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003331 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3332 recv_ch = voe_.GetLastChannel();
3333 EXPECT_NE(recv_ch, default_channel);
3334 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003335}
3336
3337TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003338 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003339 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003340
3341 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3342 int recv_ch = voe_.GetLastChannel();
3343
3344 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3345 int send_ch = voe_.GetLastChannel();
3346
3347 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3348 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3349 // channel of |recv_ch|.This is not a common case, since, normally, only the
3350 // default channel can be associated. However, the default is not deletable.
3351 // So we force the |recv_ch| to associate with a non-default channel.
3352 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3353 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3354
3355 EXPECT_TRUE(channel_->RemoveSendStream(2));
3356 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3357}
stefan658910c2015-09-03 05:48:32 -07003358
deadbeef884f5852016-01-15 09:20:04 -08003359TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003360 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003361 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3362 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003363
3364 // Setting the sink before a recv stream exists should do nothing.
3365 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3366 EXPECT_TRUE(
3367 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3368 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3369
3370 // Now try actually setting the sink.
3371 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3372 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3373
3374 // Now try resetting it.
3375 channel_->SetRawAudioSink(kSsrc1, nullptr);
3376 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3377}
3378
3379TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003380 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003381 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3382 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003383
3384 // Should be able to set a default sink even when no stream exists.
3385 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3386
3387 // Create default channel and ensure it's assigned the default sink.
3388 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3389 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3390
3391 // Try resetting the default sink.
3392 channel_->SetRawAudioSink(0, nullptr);
3393 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3394
3395 // Try setting the default sink while the default stream exists.
3396 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3397 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3398
3399 // If we remove and add a default stream, it should get the same sink.
3400 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3401 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3402 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3403}
3404
skvlad7a43d252016-03-22 15:32:27 -07003405// Test that, just like the video channel, the voice channel communicates the
3406// network state to the call.
3407TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003408 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003409
3410 EXPECT_EQ(webrtc::kNetworkUp,
3411 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3412 EXPECT_EQ(webrtc::kNetworkUp,
3413 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3414
3415 channel_->OnReadyToSend(false);
3416 EXPECT_EQ(webrtc::kNetworkDown,
3417 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3418 EXPECT_EQ(webrtc::kNetworkUp,
3419 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3420
3421 channel_->OnReadyToSend(true);
3422 EXPECT_EQ(webrtc::kNetworkUp,
3423 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3424 EXPECT_EQ(webrtc::kNetworkUp,
3425 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3426}
3427
stefan658910c2015-09-03 05:48:32 -07003428// Tests that the library initializes and shuts down properly.
3429TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003430 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003431 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003432 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003433 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3434 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003435 EXPECT_TRUE(channel != nullptr);
3436 delete channel;
solenbergff976312016-03-30 23:28:51 -07003437}
stefan658910c2015-09-03 05:48:32 -07003438
solenbergff976312016-03-30 23:28:51 -07003439// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003440TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3441 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3442 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3443 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003444 {
3445 cricket::WebRtcVoiceEngine engine(&adm);
3446 std::unique_ptr<webrtc::Call> call(
3447 webrtc::Call::Create(webrtc::Call::Config()));
3448 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3449 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3450 EXPECT_TRUE(channel != nullptr);
3451 delete channel;
3452 }
stefan658910c2015-09-03 05:48:32 -07003453}
3454
3455// Tests that the library is configured with the codecs we want.
3456TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003457 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003458 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003459 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003460 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003461 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003462 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003463 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003464 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003465 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003466 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003467 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003468 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003469 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003470 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003471 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003472 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003473 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003474 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003475 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003476 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003477 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003478 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003479 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003480 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003481 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003482 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003483 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003484 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003485 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003486 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003487 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003488 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003489 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003490 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003491 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003492 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003493 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003494 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003495 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003496 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003497 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003498 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003499 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003500 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003501 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003502 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003503 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003504 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003505 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003506 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003507 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003508
stefan658910c2015-09-03 05:48:32 -07003509 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003510 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003511 for (std::vector<cricket::AudioCodec>::const_iterator it =
3512 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3513 if (it->name == "CN" && it->clockrate == 16000) {
3514 EXPECT_EQ(105, it->id);
3515 } else if (it->name == "CN" && it->clockrate == 32000) {
3516 EXPECT_EQ(106, it->id);
3517 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3518 EXPECT_EQ(103, it->id);
3519 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3520 EXPECT_EQ(104, it->id);
3521 } else if (it->name == "G722" && it->clockrate == 8000) {
3522 EXPECT_EQ(9, it->id);
3523 } else if (it->name == "telephone-event") {
3524 EXPECT_EQ(126, it->id);
3525 } else if (it->name == "red") {
3526 EXPECT_EQ(127, it->id);
3527 } else if (it->name == "opus") {
3528 EXPECT_EQ(111, it->id);
3529 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3530 EXPECT_EQ("10", it->params.find("minptime")->second);
3531 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3532 EXPECT_EQ("60", it->params.find("maxptime")->second);
3533 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3534 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3535 }
3536 }
stefan658910c2015-09-03 05:48:32 -07003537}
3538
3539// Tests that VoE supports at least 32 channels
3540TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003541 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003542 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003543 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003544
3545 cricket::VoiceMediaChannel* channels[32];
3546 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003547 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003548 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3549 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003550 if (!channel)
3551 break;
stefan658910c2015-09-03 05:48:32 -07003552 channels[num_channels++] = channel;
3553 }
3554
tfarina5237aaf2015-11-10 23:44:30 -08003555 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003556 EXPECT_EQ(expected, num_channels);
3557
3558 while (num_channels > 0) {
3559 delete channels[--num_channels];
3560 }
stefan658910c2015-09-03 05:48:32 -07003561}
3562
3563// Test that we set our preferred codecs properly.
3564TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003565 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003566 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003567 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003568 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3569 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003570 cricket::AudioRecvParameters parameters;
3571 parameters.codecs = engine.codecs();
3572 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003573}