blob: 60aa869a4b04e0314095e2c417c0e3d40a545174 [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
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921// Test that we apply codecs properly.
922TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700923 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924 cricket::AudioSendParameters parameters;
925 parameters.codecs.push_back(kIsacCodec);
926 parameters.codecs.push_back(kPcmuCodec);
927 parameters.codecs.push_back(kRedCodec);
928 parameters.codecs[0].id = 96;
929 parameters.codecs[0].bitrate = 48000;
930 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000931 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200932 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000933 webrtc::CodecInst gcodec;
934 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
935 EXPECT_EQ(96, gcodec.pltype);
936 EXPECT_EQ(48000, gcodec.rate);
937 EXPECT_STREQ("ISAC", gcodec.plname);
938 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000939 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000940 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
941 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100942 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943}
944
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000945// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
946// to apply.
947TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700948 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200949 cricket::AudioSendParameters parameters;
950 parameters.codecs.push_back(kIsacCodec);
951 parameters.codecs.push_back(kPcmuCodec);
952 parameters.codecs.push_back(kRedCodec);
953 parameters.codecs[0].id = 96;
954 parameters.codecs[0].bitrate = 48000;
955 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000956 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
957 // Calling SetSendCodec again with same codec which is already set.
958 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200959 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000960 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
961}
962
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000963// Verify that G722 is set with 16000 samples per second to WebRTC.
964TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -0700965 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000966 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200967 cricket::AudioSendParameters parameters;
968 parameters.codecs.push_back(kG722CodecSdp);
969 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000970 webrtc::CodecInst gcodec;
971 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
972 EXPECT_STREQ("G722", gcodec.plname);
973 EXPECT_EQ(1, gcodec.channels);
974 EXPECT_EQ(16000, gcodec.plfreq);
975}
976
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000977// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -0700979 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200980 cricket::AudioSendParameters parameters;
981 parameters.codecs.push_back(kOpusCodec);
982 parameters.codecs[0].bitrate = 0;
983 parameters.codecs[0].clockrate = 50000;
984 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985}
986
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000987// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700989 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200990 cricket::AudioSendParameters parameters;
991 parameters.codecs.push_back(kOpusCodec);
992 parameters.codecs[0].bitrate = 0;
993 parameters.codecs[0].channels = 0;
994 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000995}
996
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000997// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700999 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001000 cricket::AudioSendParameters parameters;
1001 parameters.codecs.push_back(kOpusCodec);
1002 parameters.codecs[0].bitrate = 0;
1003 parameters.codecs[0].channels = 0;
1004 parameters.codecs[0].params["stereo"] = "1";
1005 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001006}
1007
1008// Test that if channel is 1 for opus and there's no stereo, we fail.
1009TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001010 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001011 cricket::AudioSendParameters parameters;
1012 parameters.codecs.push_back(kOpusCodec);
1013 parameters.codecs[0].bitrate = 0;
1014 parameters.codecs[0].channels = 1;
1015 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016}
1017
1018// Test that if channel is 1 for opus and stereo=0, we fail.
1019TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001020 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001021 cricket::AudioSendParameters parameters;
1022 parameters.codecs.push_back(kOpusCodec);
1023 parameters.codecs[0].bitrate = 0;
1024 parameters.codecs[0].channels = 1;
1025 parameters.codecs[0].params["stereo"] = "0";
1026 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027}
1028
1029// Test that if channel is 1 for opus and stereo=1, we fail.
1030TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001031 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001032 cricket::AudioSendParameters parameters;
1033 parameters.codecs.push_back(kOpusCodec);
1034 parameters.codecs[0].bitrate = 0;
1035 parameters.codecs[0].channels = 1;
1036 parameters.codecs[0].params["stereo"] = "1";
1037 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001038}
1039
1040// Test that with bitrate=0 and no stereo,
1041// channels and bitrate are 1 and 32000.
1042TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001043 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001044 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001045 cricket::AudioSendParameters parameters;
1046 parameters.codecs.push_back(kOpusCodec);
1047 parameters.codecs[0].bitrate = 0;
1048 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001049 webrtc::CodecInst gcodec;
1050 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1051 EXPECT_STREQ("opus", gcodec.plname);
1052 EXPECT_EQ(1, gcodec.channels);
1053 EXPECT_EQ(32000, gcodec.rate);
1054}
1055
1056// Test that with bitrate=0 and stereo=0,
1057// channels and bitrate are 1 and 32000.
1058TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001059 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001061 cricket::AudioSendParameters parameters;
1062 parameters.codecs.push_back(kOpusCodec);
1063 parameters.codecs[0].bitrate = 0;
1064 parameters.codecs[0].params["stereo"] = "0";
1065 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066 webrtc::CodecInst gcodec;
1067 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1068 EXPECT_STREQ("opus", gcodec.plname);
1069 EXPECT_EQ(1, gcodec.channels);
1070 EXPECT_EQ(32000, gcodec.rate);
1071}
1072
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001073// Test that with bitrate=invalid and stereo=0,
1074// channels and bitrate are 1 and 32000.
1075TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001076 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001077 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001078 cricket::AudioSendParameters parameters;
1079 parameters.codecs.push_back(kOpusCodec);
1080 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001081 webrtc::CodecInst gcodec;
1082
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001083 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001084 parameters.codecs[0].bitrate = 5999;
1085 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001086 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1087 EXPECT_STREQ("opus", gcodec.plname);
1088 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001089 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001090
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001091 parameters.codecs[0].bitrate = 510001;
1092 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001093 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1094 EXPECT_STREQ("opus", gcodec.plname);
1095 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001096 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001097}
1098
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099// Test that with bitrate=0 and stereo=1,
1100// channels and bitrate are 2 and 64000.
1101TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001102 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001103 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001104 cricket::AudioSendParameters parameters;
1105 parameters.codecs.push_back(kOpusCodec);
1106 parameters.codecs[0].bitrate = 0;
1107 parameters.codecs[0].params["stereo"] = "1";
1108 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109 webrtc::CodecInst gcodec;
1110 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1111 EXPECT_STREQ("opus", gcodec.plname);
1112 EXPECT_EQ(2, gcodec.channels);
1113 EXPECT_EQ(64000, gcodec.rate);
1114}
1115
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001116// Test that with bitrate=invalid and stereo=1,
1117// channels and bitrate are 2 and 64000.
1118TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001119 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001120 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001121 cricket::AudioSendParameters parameters;
1122 parameters.codecs.push_back(kOpusCodec);
1123 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001124 webrtc::CodecInst gcodec;
1125
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001126 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001127 parameters.codecs[0].bitrate = 5999;
1128 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001129 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1130 EXPECT_STREQ("opus", gcodec.plname);
1131 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001132 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001133
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001134 parameters.codecs[0].bitrate = 510001;
1135 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001136 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1137 EXPECT_STREQ("opus", gcodec.plname);
1138 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001139 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001140}
1141
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142// Test that with bitrate=N and stereo unset,
1143// channels and bitrate are 1 and N.
1144TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001145 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001147 cricket::AudioSendParameters parameters;
1148 parameters.codecs.push_back(kOpusCodec);
1149 parameters.codecs[0].bitrate = 96000;
1150 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001151 webrtc::CodecInst gcodec;
1152 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1153 EXPECT_EQ(111, gcodec.pltype);
1154 EXPECT_EQ(96000, gcodec.rate);
1155 EXPECT_STREQ("opus", gcodec.plname);
1156 EXPECT_EQ(1, gcodec.channels);
1157 EXPECT_EQ(48000, gcodec.plfreq);
1158}
1159
1160// Test that with bitrate=N and stereo=0,
1161// channels and bitrate are 1 and N.
1162TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001163 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001165 cricket::AudioSendParameters parameters;
1166 parameters.codecs.push_back(kOpusCodec);
1167 parameters.codecs[0].bitrate = 30000;
1168 parameters.codecs[0].params["stereo"] = "0";
1169 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 webrtc::CodecInst gcodec;
1171 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1172 EXPECT_EQ(1, gcodec.channels);
1173 EXPECT_EQ(30000, gcodec.rate);
1174 EXPECT_STREQ("opus", gcodec.plname);
1175}
1176
1177// Test that with bitrate=N and without any parameters,
1178// channels and bitrate are 1 and N.
1179TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001180 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001181 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001182 cricket::AudioSendParameters parameters;
1183 parameters.codecs.push_back(kOpusCodec);
1184 parameters.codecs[0].bitrate = 30000;
1185 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001186 webrtc::CodecInst gcodec;
1187 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1188 EXPECT_EQ(1, gcodec.channels);
1189 EXPECT_EQ(30000, gcodec.rate);
1190 EXPECT_STREQ("opus", gcodec.plname);
1191}
1192
1193// Test that with bitrate=N and stereo=1,
1194// channels and bitrate are 2 and N.
1195TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001196 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001197 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001198 cricket::AudioSendParameters parameters;
1199 parameters.codecs.push_back(kOpusCodec);
1200 parameters.codecs[0].bitrate = 30000;
1201 parameters.codecs[0].params["stereo"] = "1";
1202 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203 webrtc::CodecInst gcodec;
1204 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1205 EXPECT_EQ(2, gcodec.channels);
1206 EXPECT_EQ(30000, gcodec.rate);
1207 EXPECT_STREQ("opus", gcodec.plname);
1208}
1209
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001210// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1211// Also test that the "maxaveragebitrate" can't be set to values outside the
1212// range of 6000 and 510000
1213TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001214 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001215 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001216 cricket::AudioSendParameters parameters;
1217 parameters.codecs.push_back(kOpusCodec);
1218 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001219 webrtc::CodecInst gcodec;
1220
1221 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001222 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1223 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001224 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001225 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001226
1227 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001228 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1229 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001230 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001231 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001232
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001233 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1234 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001235 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1236 EXPECT_EQ(200000, gcodec.rate);
1237}
1238
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001239// Test that we can enable NACK with opus as caller.
1240TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001241 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001242 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001243 cricket::AudioSendParameters parameters;
1244 parameters.codecs.push_back(kOpusCodec);
1245 parameters.codecs[0].AddFeedbackParam(
1246 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1247 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001248 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001249 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001250 EXPECT_TRUE(voe_.GetNACK(channel_num));
1251}
1252
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001253// Test that we can enable NACK with opus as callee.
1254TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001255 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001256 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001257 cricket::AudioSendParameters parameters;
1258 parameters.codecs.push_back(kOpusCodec);
1259 parameters.codecs[0].AddFeedbackParam(
1260 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1261 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001262 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001263 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001264 EXPECT_FALSE(voe_.GetNACK(channel_num));
1265
1266 EXPECT_TRUE(channel_->AddSendStream(
1267 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001268 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001269}
1270
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271// Test that we can enable NACK on receive streams.
1272TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001273 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001274 int channel_num1 = voe_.GetLastChannel();
1275 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1276 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 cricket::AudioSendParameters parameters;
1278 parameters.codecs.push_back(kOpusCodec);
1279 parameters.codecs[0].AddFeedbackParam(
1280 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1281 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001282 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1283 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001285 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1286 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1287}
1288
1289// Test that we can disable NACK.
1290TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001291 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001292 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001293 cricket::AudioSendParameters parameters;
1294 parameters.codecs.push_back(kOpusCodec);
1295 parameters.codecs[0].AddFeedbackParam(
1296 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1297 cricket::kParamValueEmpty));
1298 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001299 EXPECT_TRUE(voe_.GetNACK(channel_num));
1300
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001301 parameters.codecs.clear();
1302 parameters.codecs.push_back(kOpusCodec);
1303 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001304 EXPECT_FALSE(voe_.GetNACK(channel_num));
1305}
1306
1307// Test that we can disable NACK on receive streams.
1308TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001309 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001310 int channel_num1 = voe_.GetLastChannel();
1311 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1312 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001313 cricket::AudioSendParameters parameters;
1314 parameters.codecs.push_back(kOpusCodec);
1315 parameters.codecs[0].AddFeedbackParam(
1316 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1317 cricket::kParamValueEmpty));
1318 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001319 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1320 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1321
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001322 parameters.codecs.clear();
1323 parameters.codecs.push_back(kOpusCodec);
1324 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001325 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1326 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1327}
1328
1329// Test that NACK is enabled on a new receive stream.
1330TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001331 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001332 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001333 cricket::AudioSendParameters parameters;
1334 parameters.codecs.push_back(kIsacCodec);
1335 parameters.codecs.push_back(kCn16000Codec);
1336 parameters.codecs[0].AddFeedbackParam(
1337 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1338 cricket::kParamValueEmpty));
1339 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340 EXPECT_TRUE(voe_.GetNACK(channel_num));
1341
1342 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1343 channel_num = voe_.GetLastChannel();
1344 EXPECT_TRUE(voe_.GetNACK(channel_num));
1345 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1346 channel_num = voe_.GetLastChannel();
1347 EXPECT_TRUE(voe_.GetNACK(channel_num));
1348}
1349
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001350// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001351TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001352 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001353 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001354 cricket::AudioSendParameters parameters;
1355 parameters.codecs.push_back(kOpusCodec);
1356 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001357 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1358}
1359
1360// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001361TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001362 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001363 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001364 cricket::AudioSendParameters parameters;
1365 parameters.codecs.push_back(kOpusCodec);
1366 parameters.codecs[0].bitrate = 0;
1367 parameters.codecs[0].params["useinbandfec"] = "0";
1368 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001369 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1370 webrtc::CodecInst gcodec;
1371 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1372 EXPECT_STREQ("opus", gcodec.plname);
1373 EXPECT_EQ(1, gcodec.channels);
1374 EXPECT_EQ(32000, gcodec.rate);
1375}
1376
1377// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001378TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001379 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001380 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001381 cricket::AudioSendParameters parameters;
1382 parameters.codecs.push_back(kOpusCodec);
1383 parameters.codecs[0].bitrate = 0;
1384 parameters.codecs[0].params["useinbandfec"] = "1";
1385 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001386 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1387 webrtc::CodecInst gcodec;
1388 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1389 EXPECT_STREQ("opus", gcodec.plname);
1390 EXPECT_EQ(1, gcodec.channels);
1391 EXPECT_EQ(32000, gcodec.rate);
1392}
1393
1394// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001395TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001396 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001397 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001398 cricket::AudioSendParameters parameters;
1399 parameters.codecs.push_back(kOpusCodec);
1400 parameters.codecs[0].bitrate = 0;
1401 parameters.codecs[0].params["stereo"] = "1";
1402 parameters.codecs[0].params["useinbandfec"] = "1";
1403 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001404 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1405 webrtc::CodecInst gcodec;
1406 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1407 EXPECT_STREQ("opus", gcodec.plname);
1408 EXPECT_EQ(2, gcodec.channels);
1409 EXPECT_EQ(64000, gcodec.rate);
1410}
1411
1412// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001413TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001414 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001415 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001416 cricket::AudioSendParameters parameters;
1417 parameters.codecs.push_back(kIsacCodec);
1418 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001419 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1420}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001421
1422// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1423TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001424 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001425 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001426 cricket::AudioSendParameters parameters;
1427 parameters.codecs.push_back(kIsacCodec);
1428 parameters.codecs[0].params["useinbandfec"] = "1";
1429 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001430 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1431}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001432
1433// Test that Opus FEC status can be changed.
1434TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001435 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001436 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001437 cricket::AudioSendParameters parameters;
1438 parameters.codecs.push_back(kOpusCodec);
1439 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001440 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001441 parameters.codecs[0].params["useinbandfec"] = "1";
1442 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001443 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1444}
1445
stefanba4c0e42016-02-04 04:12:24 -08001446TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001447 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001448 cricket::AudioSendParameters send_parameters;
1449 send_parameters.codecs.push_back(kOpusCodec);
1450 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1451 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1452
1453 cricket::AudioRecvParameters recv_parameters;
1454 recv_parameters.codecs.push_back(kIsacCodec);
1455 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1456 EXPECT_TRUE(
1457 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1458 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1459 EXPECT_FALSE(
1460 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1461
solenbergbc37fc82016-04-04 09:54:44 -07001462 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001463 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1464 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1465 EXPECT_TRUE(
1466 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1467}
1468
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001469// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1470TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001471 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001472 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001473 cricket::AudioSendParameters parameters;
1474 parameters.codecs.push_back(kOpusCodec);
1475 parameters.codecs[0].bitrate = 0;
1476 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1477 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001478 EXPECT_EQ(cricket::kOpusBandwidthNb,
1479 voe_.GetMaxEncodingBandwidth(channel_num));
1480 webrtc::CodecInst gcodec;
1481 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1482 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001483
1484 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1486 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001487 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1488 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001489}
1490
1491// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1492TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001493 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001494 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001495 cricket::AudioSendParameters parameters;
1496 parameters.codecs.push_back(kOpusCodec);
1497 parameters.codecs[0].bitrate = 0;
1498 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1499 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001500 EXPECT_EQ(cricket::kOpusBandwidthMb,
1501 voe_.GetMaxEncodingBandwidth(channel_num));
1502 webrtc::CodecInst gcodec;
1503 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1504 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001505
1506 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001507 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1508 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001509 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1510 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001511}
1512
1513// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1514TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001515 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001516 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001517 cricket::AudioSendParameters parameters;
1518 parameters.codecs.push_back(kOpusCodec);
1519 parameters.codecs[0].bitrate = 0;
1520 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1521 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001522 EXPECT_EQ(cricket::kOpusBandwidthWb,
1523 voe_.GetMaxEncodingBandwidth(channel_num));
1524 webrtc::CodecInst gcodec;
1525 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1526 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001527
1528 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1530 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001531 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1532 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001533}
1534
1535// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1536TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001537 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001538 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001539 cricket::AudioSendParameters parameters;
1540 parameters.codecs.push_back(kOpusCodec);
1541 parameters.codecs[0].bitrate = 0;
1542 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1543 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001544 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1545 voe_.GetMaxEncodingBandwidth(channel_num));
1546 webrtc::CodecInst gcodec;
1547 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1548 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001549
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001550 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001551 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1552 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001553 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1554 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001555}
1556
1557// Test 24000 < maxplaybackrate triggers Opus full band mode.
1558TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001559 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001561 cricket::AudioSendParameters parameters;
1562 parameters.codecs.push_back(kOpusCodec);
1563 parameters.codecs[0].bitrate = 0;
1564 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1565 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001566 EXPECT_EQ(cricket::kOpusBandwidthFb,
1567 voe_.GetMaxEncodingBandwidth(channel_num));
1568 webrtc::CodecInst gcodec;
1569 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1570 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001571
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001572 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1574 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001575 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1576 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001577}
1578
1579// Test Opus that without maxplaybackrate, default playback rate is used.
1580TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001581 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001582 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001583 cricket::AudioSendParameters parameters;
1584 parameters.codecs.push_back(kOpusCodec);
1585 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001586 EXPECT_EQ(cricket::kOpusBandwidthFb,
1587 voe_.GetMaxEncodingBandwidth(channel_num));
1588}
1589
1590// Test the with non-Opus, maxplaybackrate has no effect.
1591TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001592 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001593 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001594 cricket::AudioSendParameters parameters;
1595 parameters.codecs.push_back(kIsacCodec);
1596 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1597 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1599}
1600
1601// Test maxplaybackrate can be set on two streams.
1602TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001603 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001604 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 cricket::AudioSendParameters parameters;
1606 parameters.codecs.push_back(kOpusCodec);
1607 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001608 // Default bandwidth is 24000.
1609 EXPECT_EQ(cricket::kOpusBandwidthFb,
1610 voe_.GetMaxEncodingBandwidth(channel_num));
1611
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001612 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001613
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001614 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001615 EXPECT_EQ(cricket::kOpusBandwidthNb,
1616 voe_.GetMaxEncodingBandwidth(channel_num));
1617
1618 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1619 channel_num = voe_.GetLastChannel();
1620 EXPECT_EQ(cricket::kOpusBandwidthNb,
1621 voe_.GetMaxEncodingBandwidth(channel_num));
1622}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001623
Minyue Li7100dcd2015-03-27 05:05:59 +01001624// Test that with usedtx=0, Opus DTX is off.
1625TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001626 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001627 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001628 cricket::AudioSendParameters parameters;
1629 parameters.codecs.push_back(kOpusCodec);
1630 parameters.codecs[0].params["usedtx"] = "0";
1631 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001632 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1633}
1634
1635// Test that with usedtx=1, Opus DTX is on.
1636TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001637 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001638 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001639 cricket::AudioSendParameters parameters;
1640 parameters.codecs.push_back(kOpusCodec);
1641 parameters.codecs[0].params["usedtx"] = "1";
1642 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001643 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1644 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1645}
1646
1647// Test that usedtx=1 works with stereo Opus.
1648TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001649 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001650 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001651 cricket::AudioSendParameters parameters;
1652 parameters.codecs.push_back(kOpusCodec);
1653 parameters.codecs[0].params["usedtx"] = "1";
1654 parameters.codecs[0].params["stereo"] = "1";
1655 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001656 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1657 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1658}
1659
1660// Test that usedtx=1 does not work with non Opus.
1661TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001662 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001663 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001664 cricket::AudioSendParameters parameters;
1665 parameters.codecs.push_back(kIsacCodec);
1666 parameters.codecs[0].params["usedtx"] = "1";
1667 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001668 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1669}
1670
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001671// Test that we can switch back and forth between Opus and ISAC with CN.
1672TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001673 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001675 cricket::AudioSendParameters opus_parameters;
1676 opus_parameters.codecs.push_back(kOpusCodec);
1677 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 webrtc::CodecInst gcodec;
1679 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001680 EXPECT_EQ(111, gcodec.pltype);
1681 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001683 cricket::AudioSendParameters isac_parameters;
1684 isac_parameters.codecs.push_back(kIsacCodec);
1685 isac_parameters.codecs.push_back(kCn16000Codec);
1686 isac_parameters.codecs.push_back(kOpusCodec);
1687 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1689 EXPECT_EQ(103, gcodec.pltype);
1690 EXPECT_STREQ("ISAC", gcodec.plname);
1691
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001692 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001694 EXPECT_EQ(111, gcodec.pltype);
1695 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696}
1697
1698// Test that we handle various ways of specifying bitrate.
1699TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001700 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001702 cricket::AudioSendParameters parameters;
1703 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1704 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705 webrtc::CodecInst gcodec;
1706 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1707 EXPECT_EQ(103, gcodec.pltype);
1708 EXPECT_STREQ("ISAC", gcodec.plname);
1709 EXPECT_EQ(32000, gcodec.rate);
1710
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 parameters.codecs[0].bitrate = 0; // bitrate == default
1712 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1714 EXPECT_EQ(103, gcodec.pltype);
1715 EXPECT_STREQ("ISAC", gcodec.plname);
1716 EXPECT_EQ(-1, gcodec.rate);
1717
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001718 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1721 EXPECT_EQ(103, gcodec.pltype);
1722 EXPECT_STREQ("ISAC", gcodec.plname);
1723 EXPECT_EQ(28000, gcodec.rate);
1724
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1726 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1728 EXPECT_EQ(0, gcodec.pltype);
1729 EXPECT_STREQ("PCMU", gcodec.plname);
1730 EXPECT_EQ(64000, gcodec.rate);
1731
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 parameters.codecs[0].bitrate = 0; // bitrate == default
1733 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1735 EXPECT_EQ(0, gcodec.pltype);
1736 EXPECT_STREQ("PCMU", gcodec.plname);
1737 EXPECT_EQ(64000, gcodec.rate);
1738
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001739 parameters.codecs[0] = kOpusCodec;
1740 parameters.codecs[0].bitrate = 0; // bitrate == default
1741 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1743 EXPECT_EQ(111, gcodec.pltype);
1744 EXPECT_STREQ("opus", gcodec.plname);
1745 EXPECT_EQ(32000, gcodec.rate);
1746}
1747
Brave Yao5225dd82015-03-26 07:39:19 +08001748// Test that we could set packet size specified in kCodecParamPTime.
1749TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001750 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001751 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001752 cricket::AudioSendParameters parameters;
1753 parameters.codecs.push_back(kOpusCodec);
1754 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1755 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001756 webrtc::CodecInst gcodec;
1757 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1758 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1759
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001760 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1761 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001762 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1763 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1764
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001765 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1766 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001767 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1768 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1769
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001770 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1771 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1772 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001773 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1774 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1775
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001776 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1777 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1778 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001779 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1780 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1781}
1782
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001783// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001785 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001786 cricket::AudioSendParameters parameters;
1787 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001788}
1789
1790// Test that we can set send codecs even with telephone-event codec as the first
1791// one on the list.
1792TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001793 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001795 cricket::AudioSendParameters parameters;
1796 parameters.codecs.push_back(kTelephoneEventCodec);
1797 parameters.codecs.push_back(kIsacCodec);
1798 parameters.codecs.push_back(kPcmuCodec);
1799 parameters.codecs[0].id = 98; // DTMF
1800 parameters.codecs[1].id = 96;
1801 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802 webrtc::CodecInst gcodec;
1803 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001804 EXPECT_EQ(96, gcodec.pltype);
1805 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001806 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001807}
1808
solenberg31642aa2016-03-14 08:00:37 -07001809// Test that payload type range is limited for telephone-event codec.
1810TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001811 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001812 cricket::AudioSendParameters parameters;
1813 parameters.codecs.push_back(kTelephoneEventCodec);
1814 parameters.codecs.push_back(kIsacCodec);
1815 parameters.codecs[0].id = 0; // DTMF
1816 parameters.codecs[1].id = 96;
1817 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1818 EXPECT_TRUE(channel_->CanInsertDtmf());
1819 parameters.codecs[0].id = 128; // DTMF
1820 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1821 EXPECT_FALSE(channel_->CanInsertDtmf());
1822 parameters.codecs[0].id = 127;
1823 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1824 EXPECT_TRUE(channel_->CanInsertDtmf());
1825 parameters.codecs[0].id = -1; // DTMF
1826 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1827 EXPECT_FALSE(channel_->CanInsertDtmf());
1828}
1829
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001830// Test that we can set send codecs even with CN codec as the first
1831// one on the list.
1832TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001833 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001834 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001835 cricket::AudioSendParameters parameters;
1836 parameters.codecs.push_back(kCn16000Codec);
1837 parameters.codecs.push_back(kIsacCodec);
1838 parameters.codecs.push_back(kPcmuCodec);
1839 parameters.codecs[0].id = 98; // wideband CN
1840 parameters.codecs[1].id = 96;
1841 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001842 webrtc::CodecInst gcodec;
1843 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1844 EXPECT_EQ(96, gcodec.pltype);
1845 EXPECT_STREQ("ISAC", gcodec.plname);
1846 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847}
1848
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001849// Test that we set VAD and DTMF types correctly as caller.
1850TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001851 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001852 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001853 cricket::AudioSendParameters parameters;
1854 parameters.codecs.push_back(kIsacCodec);
1855 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001856 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001857 parameters.codecs.push_back(kCn16000Codec);
1858 parameters.codecs.push_back(kCn8000Codec);
1859 parameters.codecs.push_back(kTelephoneEventCodec);
1860 parameters.codecs.push_back(kRedCodec);
1861 parameters.codecs[0].id = 96;
1862 parameters.codecs[2].id = 97; // wideband CN
1863 parameters.codecs[4].id = 98; // DTMF
1864 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001865 webrtc::CodecInst gcodec;
1866 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1867 EXPECT_EQ(96, gcodec.pltype);
1868 EXPECT_STREQ("ISAC", gcodec.plname);
1869 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001870 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001871 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1872 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001873 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001874}
1875
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001876// Test that we set VAD and DTMF types correctly as callee.
1877TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001878 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001879 cricket::AudioSendParameters parameters;
1880 parameters.codecs.push_back(kIsacCodec);
1881 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001882 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001883 parameters.codecs.push_back(kCn16000Codec);
1884 parameters.codecs.push_back(kCn8000Codec);
1885 parameters.codecs.push_back(kTelephoneEventCodec);
1886 parameters.codecs.push_back(kRedCodec);
1887 parameters.codecs[0].id = 96;
1888 parameters.codecs[2].id = 97; // wideband CN
1889 parameters.codecs[4].id = 98; // DTMF
1890 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001891 EXPECT_TRUE(channel_->AddSendStream(
1892 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001893 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001894
1895 webrtc::CodecInst gcodec;
1896 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1897 EXPECT_EQ(96, gcodec.pltype);
1898 EXPECT_STREQ("ISAC", gcodec.plname);
1899 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001900 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001901 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1902 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001903 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001904}
1905
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001906// Test that we only apply VAD if we have a CN codec that matches the
1907// send codec clockrate.
1908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001909 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001911 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001913 parameters.codecs.push_back(kIsacCodec);
1914 parameters.codecs.push_back(kCn16000Codec);
1915 parameters.codecs[1].id = 97;
1916 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 webrtc::CodecInst gcodec;
1918 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1919 EXPECT_STREQ("ISAC", gcodec.plname);
1920 EXPECT_TRUE(voe_.GetVAD(channel_num));
1921 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1922 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001923 parameters.codecs[0] = kPcmuCodec;
1924 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1926 EXPECT_STREQ("PCMU", gcodec.plname);
1927 EXPECT_FALSE(voe_.GetVAD(channel_num));
1928 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001929 parameters.codecs[1] = kCn8000Codec;
1930 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1932 EXPECT_STREQ("PCMU", gcodec.plname);
1933 EXPECT_TRUE(voe_.GetVAD(channel_num));
1934 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001935 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001936 parameters.codecs[0] = kIsacCodec;
1937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1939 EXPECT_STREQ("ISAC", gcodec.plname);
1940 EXPECT_FALSE(voe_.GetVAD(channel_num));
1941}
1942
1943// Test that we perform case-insensitive matching of codec names.
1944TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001945 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001947 cricket::AudioSendParameters parameters;
1948 parameters.codecs.push_back(kIsacCodec);
1949 parameters.codecs.push_back(kPcmuCodec);
1950 parameters.codecs.push_back(kCn16000Codec);
1951 parameters.codecs.push_back(kCn8000Codec);
1952 parameters.codecs.push_back(kTelephoneEventCodec);
1953 parameters.codecs.push_back(kRedCodec);
1954 parameters.codecs[0].name = "iSaC";
1955 parameters.codecs[0].id = 96;
1956 parameters.codecs[2].id = 97; // wideband CN
1957 parameters.codecs[4].id = 98; // DTMF
1958 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 webrtc::CodecInst gcodec;
1960 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1961 EXPECT_EQ(96, gcodec.pltype);
1962 EXPECT_STREQ("ISAC", gcodec.plname);
1963 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001964 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1966 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001967 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968}
1969
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001970// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001971TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001972 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001974 cricket::AudioSendParameters parameters;
1975 parameters.codecs.push_back(kRedCodec);
1976 parameters.codecs.push_back(kIsacCodec);
1977 parameters.codecs.push_back(kPcmuCodec);
1978 parameters.codecs[0].id = 127;
1979 parameters.codecs[0].params[""] = "96/96";
1980 parameters.codecs[1].id = 96;
1981 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001982 webrtc::CodecInst gcodec;
1983 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1984 EXPECT_EQ(96, gcodec.pltype);
1985 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001986 EXPECT_TRUE(voe_.GetRED(channel_num));
1987 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001988}
1989
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001990// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001991TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001992 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001993 cricket::AudioSendParameters parameters;
1994 parameters.codecs.push_back(kRedCodec);
1995 parameters.codecs.push_back(kIsacCodec);
1996 parameters.codecs.push_back(kPcmuCodec);
1997 parameters.codecs[0].id = 127;
1998 parameters.codecs[0].params[""] = "96/96";
1999 parameters.codecs[1].id = 96;
2000 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002001 EXPECT_TRUE(channel_->AddSendStream(
2002 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002003 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002004 webrtc::CodecInst gcodec;
2005 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2006 EXPECT_EQ(96, gcodec.pltype);
2007 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002008 EXPECT_TRUE(voe_.GetRED(channel_num));
2009 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002010}
2011
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002012// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002013TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002014 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002016 cricket::AudioSendParameters parameters;
2017 parameters.codecs.push_back(kRedCodec);
2018 parameters.codecs.push_back(kIsacCodec);
2019 parameters.codecs.push_back(kPcmuCodec);
2020 parameters.codecs[0].id = 127;
2021 parameters.codecs[1].id = 96;
2022 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002023 webrtc::CodecInst gcodec;
2024 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2025 EXPECT_EQ(96, gcodec.pltype);
2026 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002027 EXPECT_TRUE(voe_.GetRED(channel_num));
2028 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029}
2030
2031// Test that we ignore RED if the parameters aren't named the way we expect.
2032TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002033 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002034 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002035 cricket::AudioSendParameters parameters;
2036 parameters.codecs.push_back(kRedCodec);
2037 parameters.codecs.push_back(kIsacCodec);
2038 parameters.codecs.push_back(kPcmuCodec);
2039 parameters.codecs[0].id = 127;
2040 parameters.codecs[0].params["ABC"] = "96/96";
2041 parameters.codecs[1].id = 96;
2042 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002043 webrtc::CodecInst gcodec;
2044 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2045 EXPECT_EQ(96, gcodec.pltype);
2046 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002047 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002048}
2049
2050// Test that we ignore RED if it uses different primary/secondary encoding.
2051TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
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[0].params[""] = "96/0";
2060 parameters.codecs[1].id = 96;
2061 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062 webrtc::CodecInst gcodec;
2063 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2064 EXPECT_EQ(96, gcodec.pltype);
2065 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002066 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067}
2068
2069// Test that we ignore RED if it uses more than 2 encodings.
2070TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
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[""] = "96/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 has bogus codec ids.
2089TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
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[""] = "ABC/ABC";
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 refers to a codec that is not present.
2108TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
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[""] = "97/97";
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
stefanba4c0e42016-02-04 04:12:24 -08002126class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2127 public:
2128 WebRtcVoiceEngineWithSendSideBweTest()
2129 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2130};
2131
2132TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2133 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002134 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002135 ASSERT_FALSE(capabilities.header_extensions.empty());
2136 for (const cricket::RtpHeaderExtension& extension :
2137 capabilities.header_extensions) {
2138 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2139 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2140 extension.id);
2141 return;
2142 }
2143 }
2144 FAIL() << "Transport sequence number extension not in header-extension list.";
2145}
2146
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002147// Test support for audio level header extension.
2148TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2149 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002150}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002151TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2152 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2153}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002154
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002155// Test support for absolute send time header extension.
2156TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2157 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2158}
2159TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2160 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002161}
2162
solenberg1ac56142015-10-13 03:58:19 -07002163// Test that we can create a channel and start sending on it.
2164TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002165 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002166 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002167 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002168 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002169 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002170 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2171}
2172
2173// Test that a channel will send if and only if it has a source and is enabled
2174// for sending.
2175TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002176 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002177 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2178 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002179 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002180 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2181 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2182 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2183 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2184 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002185}
2186
solenberg6d6e7c52016-04-13 09:07:30 -07002187// Test that SetSendParameters() does not alter a stream's send state.
2188TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2189 EXPECT_TRUE(SetupSendStream());
2190 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2191
2192 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002193 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002194 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2195
2196 // Changing RTP header extensions will recreate the AudioSendStream.
2197 send_parameters_.extensions.push_back(
2198 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2199 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2200 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2201
2202 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002203 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002204 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2205
2206 // Changing RTP header extensions will recreate the AudioSendStream.
2207 send_parameters_.extensions.clear();
2208 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2209 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2210}
2211
solenberg1ac56142015-10-13 03:58:19 -07002212// Test that we can create a channel and start playing out on it.
2213TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002214 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002215 int channel_num = voe_.GetLastChannel();
2216 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2217 EXPECT_TRUE(channel_->SetPlayout(true));
2218 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002219 EXPECT_TRUE(channel_->SetPlayout(false));
2220 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2221}
2222
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002223// Test that we can add and remove send streams.
2224TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2225 SetupForMultiSendStream();
2226
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002227 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002228 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002229
solenbergc96df772015-10-21 13:01:53 -07002230 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002231 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002232 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002233 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002234 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002235 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002236 }
tfarina5237aaf2015-11-10 23:44:30 -08002237 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002238
solenbergc96df772015-10-21 13:01:53 -07002239 // Delete the send streams.
2240 for (uint32_t ssrc : kSsrcs4) {
2241 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002242 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002243 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002244 }
solenbergc96df772015-10-21 13:01:53 -07002245 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002246}
2247
2248// Test SetSendCodecs correctly configure the codecs in all send streams.
2249TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2250 SetupForMultiSendStream();
2251
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002252 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002253 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002254 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002255 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002256 }
2257
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002258 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002260 parameters.codecs.push_back(kIsacCodec);
2261 parameters.codecs.push_back(kCn16000Codec);
2262 parameters.codecs[1].id = 97;
2263 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264
2265 // Verify ISAC and VAD are corrected configured on all send channels.
2266 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002267 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002268 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002269 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2270 EXPECT_STREQ("ISAC", gcodec.plname);
2271 EXPECT_TRUE(voe_.GetVAD(channel_num));
2272 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2273 }
2274
2275 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002276 parameters.codecs[0] = kPcmuCodec;
2277 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002278 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002279 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002280 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2281 EXPECT_STREQ("PCMU", gcodec.plname);
2282 EXPECT_FALSE(voe_.GetVAD(channel_num));
2283 }
2284}
2285
2286// Test we can SetSend on all send streams correctly.
2287TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2288 SetupForMultiSendStream();
2289
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002290 // Create the send channels and they should be a "not sending" date.
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)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002294 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2295 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002296 }
2297
2298 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002299 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002300 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002301 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002302 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002303 }
2304
2305 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002306 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002307 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002308 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002309 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002310 }
2311}
2312
2313// Test we can set the correct statistics on all send streams.
2314TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2315 SetupForMultiSendStream();
2316
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002317 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002318 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002319 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002320 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002321 }
solenberg85a04962015-10-27 03:35:21 -07002322 SetAudioSendStreamStats();
2323
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002324 // Create a receive stream to check that none of the send streams end up in
2325 // the receive stream stats.
2326 EXPECT_TRUE(channel_->AddRecvStream(
2327 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002328 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002329 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2330 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002331
solenberg85a04962015-10-27 03:35:21 -07002332 // Check stats for the added streams.
2333 {
2334 cricket::VoiceMediaInfo info;
2335 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002336
solenberg85a04962015-10-27 03:35:21 -07002337 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002338 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002339 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002340 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002341 }
2342
2343 // We have added one receive stream. We should see empty stats.
2344 EXPECT_EQ(info.receivers.size(), 1u);
2345 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002346 }
solenberg1ac56142015-10-13 03:58:19 -07002347
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002348 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002349 {
2350 cricket::VoiceMediaInfo info;
2351 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2352 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002353 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002354 EXPECT_EQ(0u, info.receivers.size());
2355 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002356
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002357 // Deliver a new packet - a default receive stream should be created and we
2358 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002359 {
2360 cricket::VoiceMediaInfo info;
2361 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2362 SetAudioReceiveStreamStats();
2363 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002364 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002365 EXPECT_EQ(1u, info.receivers.size());
2366 VerifyVoiceReceiverInfo(info.receivers[0]);
2367 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002368}
2369
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002370// Test that we can add and remove receive streams, and do proper send/playout.
2371// We can receive on multiple streams while sending one stream.
2372TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002373 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374 int channel_num1 = voe_.GetLastChannel();
2375
solenberg1ac56142015-10-13 03:58:19 -07002376 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002377 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002379 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380
solenberg1ac56142015-10-13 03:58:19 -07002381 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002382 EXPECT_TRUE(
2383 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002385 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002386 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387
solenberg1ac56142015-10-13 03:58:19 -07002388 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2390 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2391
2392 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002393 EXPECT_TRUE(
2394 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395 int channel_num3 = voe_.GetLastChannel();
2396 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2397 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2398 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399
2400 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002401 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002402 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403
2404 // Stop playout.
2405 EXPECT_TRUE(channel_->SetPlayout(false));
2406 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2407 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2408 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2409
solenberg1ac56142015-10-13 03:58:19 -07002410 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411 EXPECT_TRUE(channel_->SetPlayout(true));
2412 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2413 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2414 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2415
solenberg1ac56142015-10-13 03:58:19 -07002416 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2418 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002419 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420}
2421
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002423// and start sending on it.
2424TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002425 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002426 cricket::AudioOptions options_adjust_agc;
2427 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 webrtc::AgcConfig agc_config;
2429 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2430 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002431 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002432 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002433 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002434 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002435 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2436 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002437 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002438 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440}
2441
wu@webrtc.org97077a32013-10-25 21:18:33 +00002442TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002443 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002444 EXPECT_CALL(adm_,
2445 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002446 webrtc::AgcConfig agc_config;
2447 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2448 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002449 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2450 send_parameters_.options.tx_agc_digital_compression_gain =
2451 rtc::Optional<uint16_t>(9);
2452 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2453 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2454 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002455 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2456 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2457 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2458 EXPECT_TRUE(agc_config.limiterEnable);
2459
2460 // Check interaction with adjust_agc_delta. Both should be respected, for
2461 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002462 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2463 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002464 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2465 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2466}
2467
wu@webrtc.org97077a32013-10-25 21:18:33 +00002468TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002469 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002470 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2471 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002472 send_parameters_.options.recording_sample_rate =
2473 rtc::Optional<uint32_t>(48000);
2474 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2475 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002476}
2477
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002479// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002481 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002482 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483}
2484
2485TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2486 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002487 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002488 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002489 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002490 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002491 EXPECT_TRUE(channel_->AddRecvStream(
2492 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002493 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2494 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495
solenberg85a04962015-10-27 03:35:21 -07002496 // Check stats for the added streams.
2497 {
2498 cricket::VoiceMediaInfo info;
2499 EXPECT_EQ(true, channel_->GetStats(&info));
2500
2501 // We have added one send stream. We should see the stats we've set.
2502 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002503 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002504 // We have added one receive stream. We should see empty stats.
2505 EXPECT_EQ(info.receivers.size(), 1u);
2506 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2507 }
solenberg1ac56142015-10-13 03:58:19 -07002508
solenberg566ef242015-11-06 15:34:49 -08002509 // Start sending - this affects some reported stats.
2510 {
2511 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002512 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002513 EXPECT_EQ(true, channel_->GetStats(&info));
2514 VerifyVoiceSenderInfo(info.senders[0], true);
2515 }
2516
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002517 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002518 {
2519 cricket::VoiceMediaInfo info;
2520 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2521 EXPECT_EQ(true, channel_->GetStats(&info));
2522 EXPECT_EQ(1u, info.senders.size());
2523 EXPECT_EQ(0u, info.receivers.size());
2524 }
solenberg1ac56142015-10-13 03:58:19 -07002525
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002526 // Deliver a new packet - a default receive stream should be created and we
2527 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002528 {
2529 cricket::VoiceMediaInfo info;
2530 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2531 SetAudioReceiveStreamStats();
2532 EXPECT_EQ(true, channel_->GetStats(&info));
2533 EXPECT_EQ(1u, info.senders.size());
2534 EXPECT_EQ(1u, info.receivers.size());
2535 VerifyVoiceReceiverInfo(info.receivers[0]);
2536 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537}
2538
2539// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002540// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002542 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002543 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002544 EXPECT_TRUE(channel_->AddRecvStream(
2545 cricket::StreamParams::CreateLegacy(kSsrc2)));
2546 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547}
2548
2549// Test that the local SSRC is the same on sending and receiving channels if the
2550// receive channel is created before the send channel.
2551TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002552 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002553 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2554 int receive_channel_num = voe_.GetLastChannel();
2555 EXPECT_TRUE(channel_->AddSendStream(
2556 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557
solenberg3a941542015-11-16 07:34:50 -08002558 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002559 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560}
2561
2562// Test that we can properly receive packets.
2563TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002564 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002565 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002567 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002568 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002569}
2570
2571// Test that we can properly receive packets on multiple streams.
2572TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002573 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002574 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2575 int channel_num1 = voe_.GetLastChannel();
2576 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2577 int channel_num2 = voe_.GetLastChannel();
2578 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2579 int channel_num3 = voe_.GetLastChannel();
2580 // Create packets with the right SSRCs.
2581 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002582 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002583 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002584 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002585 }
2586 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2587 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2588 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002589
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002590 DeliverPacket(packets[0], sizeof(packets[0]));
2591 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2592 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2593 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002594
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002596 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2598 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002599
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600 DeliverPacket(packets[2], sizeof(packets[2]));
2601 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002602 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002604
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002605 DeliverPacket(packets[3], sizeof(packets[3]));
2606 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2607 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002608 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2609
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002610 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2611 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2612 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2613}
2614
solenberg7e63ef02015-11-20 00:19:43 -08002615// Test that receiving on an unsignalled stream works (default channel will be
2616// created).
2617TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002618 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002619 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2620 int channel_num = voe_.GetLastChannel();
2621 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2622}
2623
2624// Test that receiving on an unsignalled stream works (default channel will be
2625// created), and that packets will be forwarded to the default channel
2626// regardless of their SSRCs.
2627TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002628 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002629 char packet[sizeof(kPcmuFrame)];
2630 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2631
2632 // Note that the first unknown SSRC cannot be 0, because we only support
2633 // creating receive streams for SSRC!=0.
2634 DeliverPacket(packet, sizeof(packet));
2635 int channel_num = voe_.GetLastChannel();
2636 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2637 // Once we have the default channel, SSRC==0 will be ok.
2638 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2639 rtc::SetBE32(&packet[8], ssrc);
2640 DeliverPacket(packet, sizeof(packet));
2641 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2642 }
2643}
2644
2645// Test that a default channel is created even after a signalled stream has been
2646// added, and that this stream will get any packets for unknown SSRCs.
2647TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002648 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002649 char packet[sizeof(kPcmuFrame)];
2650 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2651
2652 // Add a known stream, send packet and verify we got it.
2653 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2654 int signalled_channel_num = voe_.GetLastChannel();
2655 DeliverPacket(packet, sizeof(packet));
2656 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2657
2658 // Note that the first unknown SSRC cannot be 0, because we only support
2659 // creating receive streams for SSRC!=0.
2660 rtc::SetBE32(&packet[8], 7011);
2661 DeliverPacket(packet, sizeof(packet));
2662 int channel_num = voe_.GetLastChannel();
2663 EXPECT_NE(channel_num, signalled_channel_num);
2664 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2665 // Once we have the default channel, SSRC==0 will be ok.
2666 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2667 rtc::SetBE32(&packet[8], ssrc);
2668 DeliverPacket(packet, sizeof(packet));
2669 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2670 }
2671}
2672
solenberg0a617e22015-10-20 15:49:38 -07002673// Test that we properly handle failures to add a receive stream.
2674TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002675 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678}
2679
solenberg0a617e22015-10-20 15:49:38 -07002680// Test that we properly handle failures to add a send stream.
2681TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002682 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002683 voe_.set_fail_create_channel(true);
2684 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2685}
2686
solenberg1ac56142015-10-13 03:58:19 -07002687// Test that AddRecvStream creates new stream.
2688TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002689 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002690 int channel_num = voe_.GetLastChannel();
2691 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002692 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693}
2694
2695// Test that after adding a recv stream, we do not decode more codecs than
2696// those previously passed into SetRecvCodecs.
2697TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002698 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002699 cricket::AudioRecvParameters parameters;
2700 parameters.codecs.push_back(kIsacCodec);
2701 parameters.codecs.push_back(kPcmuCodec);
2702 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002703 EXPECT_TRUE(channel_->AddRecvStream(
2704 cricket::StreamParams::CreateLegacy(kSsrc1)));
2705 int channel_num2 = voe_.GetLastChannel();
2706 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002707 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002708 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002709 gcodec.channels = 2;
2710 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2711}
2712
2713// Test that we properly clean up any streams that were added, even if
2714// not explicitly removed.
2715TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002716 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002717 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2719 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2720 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2721 delete channel_;
2722 channel_ = NULL;
2723 EXPECT_EQ(0, voe_.GetNumChannels());
2724}
2725
wu@webrtc.org78187522013-10-07 23:32:02 +00002726TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002727 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002728 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2729}
2730
2731TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002732 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002733 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002734 // Manually delete channel to simulate a failure.
2735 int channel = voe_.GetLastChannel();
2736 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2737 // Add recv stream 2 should work.
2738 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002739 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002740 EXPECT_NE(channel, new_channel);
2741 // The last created channel is deleted too.
2742 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002743}
2744
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002745// Test the InsertDtmf on default send stream as caller.
2746TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2747 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748}
2749
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002750// Test the InsertDtmf on default send stream as callee
2751TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2752 TestInsertDtmf(0, false);
2753}
2754
2755// Test the InsertDtmf on specified send stream as caller.
2756TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2757 TestInsertDtmf(kSsrc1, true);
2758}
2759
2760// Test the InsertDtmf on specified send stream as callee.
2761TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2762 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002763}
2764
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002766 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002767 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002768 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2770 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2771 EXPECT_TRUE(channel_->SetPlayout(true));
2772 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2773 EXPECT_TRUE(channel_->SetPlayout(false));
2774 EXPECT_FALSE(channel_->SetPlayout(true));
2775}
2776
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002778 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002779 EXPECT_CALL(adm_,
2780 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2781 EXPECT_CALL(adm_,
2782 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2783 EXPECT_CALL(adm_,
2784 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785 bool ec_enabled;
2786 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002787 webrtc::AecmModes aecm_mode;
2788 bool cng_enabled;
2789 bool agc_enabled;
2790 webrtc::AgcModes agc_mode;
2791 webrtc::AgcConfig agc_config;
2792 bool ns_enabled;
2793 webrtc::NsModes ns_mode;
2794 bool highpass_filter_enabled;
2795 bool stereo_swapping_enabled;
2796 bool typing_detection_enabled;
2797 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002798 voe_.GetAecmMode(aecm_mode, cng_enabled);
2799 voe_.GetAgcStatus(agc_enabled, agc_mode);
2800 voe_.GetAgcConfig(agc_config);
2801 voe_.GetNsStatus(ns_enabled, ns_mode);
2802 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2803 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2804 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2805 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002806 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807 EXPECT_FALSE(cng_enabled);
2808 EXPECT_TRUE(agc_enabled);
2809 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2810 EXPECT_TRUE(ns_enabled);
2811 EXPECT_TRUE(highpass_filter_enabled);
2812 EXPECT_FALSE(stereo_swapping_enabled);
2813 EXPECT_TRUE(typing_detection_enabled);
2814 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2815 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002816 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2817 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002818
solenberg246b8172015-12-08 09:50:23 -08002819 // Nothing set in AudioOptions, so everything should be as default.
2820 send_parameters_.options = cricket::AudioOptions();
2821 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002823 voe_.GetAecmMode(aecm_mode, cng_enabled);
2824 voe_.GetAgcStatus(agc_enabled, agc_mode);
2825 voe_.GetAgcConfig(agc_config);
2826 voe_.GetNsStatus(ns_enabled, ns_mode);
2827 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2828 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2829 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2830 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002831 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002832 EXPECT_FALSE(cng_enabled);
2833 EXPECT_TRUE(agc_enabled);
2834 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2835 EXPECT_TRUE(ns_enabled);
2836 EXPECT_TRUE(highpass_filter_enabled);
2837 EXPECT_FALSE(stereo_swapping_enabled);
2838 EXPECT_TRUE(typing_detection_enabled);
2839 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2840 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002841 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2842 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843
2844 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002845 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2846 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 voe_.GetEcStatus(ec_enabled, ec_mode);
2848 EXPECT_FALSE(ec_enabled);
2849
2850 // Turn echo cancellation back on, with settings, and make sure
2851 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002852 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2853 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002854 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 voe_.GetAecmMode(aecm_mode, cng_enabled);
2856 voe_.GetAgcStatus(agc_enabled, agc_mode);
2857 voe_.GetAgcConfig(agc_config);
2858 voe_.GetNsStatus(ns_enabled, ns_mode);
2859 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2860 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2861 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2862 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002863 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002864 EXPECT_TRUE(agc_enabled);
2865 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2866 EXPECT_TRUE(ns_enabled);
2867 EXPECT_TRUE(highpass_filter_enabled);
2868 EXPECT_FALSE(stereo_swapping_enabled);
2869 EXPECT_TRUE(typing_detection_enabled);
2870 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2871 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2872
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002873 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2874 // control.
solenberg246b8172015-12-08 09:50:23 -08002875 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2876 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002877 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002878 voe_.GetAecmMode(aecm_mode, cng_enabled);
2879 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002880 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002881 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2882
2883 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002884 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2885 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2886 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2887 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002888 voe_.GetEcStatus(ec_enabled, ec_mode);
2889 EXPECT_FALSE(ec_enabled);
2890 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002891 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2892 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002893 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002894 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002895 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002896 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2897
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002899 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2900 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002901 voe_.GetAgcStatus(agc_enabled, agc_mode);
2902 EXPECT_FALSE(agc_enabled);
2903
2904 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002905 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2906 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2907 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002908 voe_.GetAgcStatus(agc_enabled, agc_mode);
2909 EXPECT_TRUE(agc_enabled);
2910 voe_.GetAgcConfig(agc_config);
2911 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2912
2913 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002914 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2915 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2916 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2917 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2918 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919 voe_.GetNsStatus(ns_enabled, ns_mode);
2920 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2921 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2922 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2923 EXPECT_FALSE(ns_enabled);
2924 EXPECT_FALSE(highpass_filter_enabled);
2925 EXPECT_FALSE(typing_detection_enabled);
2926 EXPECT_TRUE(stereo_swapping_enabled);
2927
solenberg1ac56142015-10-13 03:58:19 -07002928 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002929 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930 voe_.GetEcStatus(ec_enabled, ec_mode);
2931 voe_.GetNsStatus(ns_enabled, ns_mode);
2932 EXPECT_TRUE(ec_enabled);
2933 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2934 EXPECT_FALSE(ns_enabled);
2935 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2936}
2937
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002938TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002939 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940
2941 bool ec_enabled;
2942 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943 bool agc_enabled;
2944 webrtc::AgcModes agc_mode;
2945 bool ns_enabled;
2946 webrtc::NsModes ns_mode;
2947 bool highpass_filter_enabled;
2948 bool stereo_swapping_enabled;
2949 bool typing_detection_enabled;
2950
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002951 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002952 voe_.GetAgcStatus(agc_enabled, agc_mode);
2953 voe_.GetNsStatus(ns_enabled, ns_mode);
2954 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2955 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2956 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2957 EXPECT_TRUE(ec_enabled);
2958 EXPECT_TRUE(agc_enabled);
2959 EXPECT_TRUE(ns_enabled);
2960 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002961 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002962 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002963}
2964
2965TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2966 webrtc::AgcConfig set_config = {0};
2967 set_config.targetLeveldBOv = 3;
2968 set_config.digitalCompressionGaindB = 9;
2969 set_config.limiterEnable = true;
2970 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971
2972 webrtc::AgcConfig config = {0};
2973 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2974 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2975 EXPECT_EQ(set_config.digitalCompressionGaindB,
2976 config.digitalCompressionGaindB);
2977 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2978}
2979
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002980TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002981 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002982 EXPECT_CALL(adm_,
2983 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2984 EXPECT_CALL(adm_,
2985 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2986 EXPECT_CALL(adm_,
2987 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2988
kwiberg686a8ef2016-02-26 03:00:35 -08002989 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002990 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002991 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002992 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002993 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002994 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995
2996 // Have to add a stream to make SetSend work.
2997 cricket::StreamParams stream1;
2998 stream1.ssrcs.push_back(1);
2999 channel1->AddSendStream(stream1);
3000 cricket::StreamParams stream2;
3001 stream2.ssrcs.push_back(2);
3002 channel2->AddSendStream(stream2);
3003
3004 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003005 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003006 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3007 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3008 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003009 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3010 EXPECT_EQ(parameters_options_all.options, channel1->options());
3011 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3012 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013
3014 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003015 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003016 parameters_options_no_ns.options.noise_suppression =
3017 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003018 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3019 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003020 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3021 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3022 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003023 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003024
3025 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003026 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003027 parameters_options_no_agc.options.auto_gain_control =
3028 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003029 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003030 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3031 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3032 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003033 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003034
solenberg246b8172015-12-08 09:50:23 -08003035 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003036 bool ec_enabled;
3037 webrtc::EcModes ec_mode;
3038 bool agc_enabled;
3039 webrtc::AgcModes agc_mode;
3040 bool ns_enabled;
3041 webrtc::NsModes ns_mode;
3042 voe_.GetEcStatus(ec_enabled, ec_mode);
3043 voe_.GetAgcStatus(agc_enabled, agc_mode);
3044 voe_.GetNsStatus(ns_enabled, ns_mode);
3045 EXPECT_TRUE(ec_enabled);
3046 EXPECT_TRUE(agc_enabled);
3047 EXPECT_TRUE(ns_enabled);
3048
solenbergd53a3f92016-04-14 13:56:37 -07003049 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003050 voe_.GetEcStatus(ec_enabled, ec_mode);
3051 voe_.GetAgcStatus(agc_enabled, agc_mode);
3052 voe_.GetNsStatus(ns_enabled, ns_mode);
3053 EXPECT_TRUE(ec_enabled);
3054 EXPECT_TRUE(agc_enabled);
3055 EXPECT_FALSE(ns_enabled);
3056
solenbergd53a3f92016-04-14 13:56:37 -07003057 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003058 voe_.GetEcStatus(ec_enabled, ec_mode);
3059 voe_.GetAgcStatus(agc_enabled, agc_mode);
3060 voe_.GetNsStatus(ns_enabled, ns_mode);
3061 EXPECT_TRUE(ec_enabled);
3062 EXPECT_FALSE(agc_enabled);
3063 EXPECT_TRUE(ns_enabled);
3064
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003065 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003066 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003067 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3068 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003069 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003070 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003071 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003072 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003073 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003074 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003075 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3076 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3077 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003078 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003079 voe_.GetEcStatus(ec_enabled, ec_mode);
3080 voe_.GetAgcStatus(agc_enabled, agc_mode);
3081 voe_.GetNsStatus(ns_enabled, ns_mode);
3082 EXPECT_TRUE(ec_enabled);
3083 EXPECT_FALSE(agc_enabled);
3084 EXPECT_FALSE(ns_enabled);
3085}
3086
wu@webrtc.orgde305012013-10-31 15:40:38 +00003087// This test verifies DSCP settings are properly applied on voice media channel.
3088TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003089 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003090 cricket::FakeNetworkInterface network_interface;
3091 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003092 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003093
solenbergbc37fc82016-04-04 09:54:44 -07003094 channel.reset(
3095 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003096 channel->SetInterface(&network_interface);
3097 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3098 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3099
3100 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003101 channel.reset(
3102 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003103 channel->SetInterface(&network_interface);
3104 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3105
3106 // Verify that setting the option to false resets the
3107 // DiffServCodePoint.
3108 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003109 channel.reset(
3110 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003111 channel->SetInterface(&network_interface);
3112 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3113 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3114
3115 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003116}
3117
solenberg1ac56142015-10-13 03:58:19 -07003118TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003119 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003120 cricket::WebRtcVoiceMediaChannel* media_channel =
3121 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003122 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3123 EXPECT_TRUE(channel_->AddRecvStream(
3124 cricket::StreamParams::CreateLegacy(kSsrc1)));
3125 int channel_id = voe_.GetLastChannel();
3126 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3127 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3128 EXPECT_TRUE(channel_->AddRecvStream(
3129 cricket::StreamParams::CreateLegacy(kSsrc2)));
3130 int channel_id2 = voe_.GetLastChannel();
3131 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003132}
3133
solenberg1ac56142015-10-13 03:58:19 -07003134TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003135 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003136 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003137 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3138 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3139 EXPECT_TRUE(channel_->AddSendStream(
3140 cricket::StreamParams::CreateLegacy(kSsrc1)));
3141 int channel_id = voe_.GetLastChannel();
3142 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3143 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3144 EXPECT_TRUE(channel_->AddSendStream(
3145 cricket::StreamParams::CreateLegacy(kSsrc2)));
3146 int channel_id2 = voe_.GetLastChannel();
3147 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003148}
3149
solenberg4bac9c52015-10-09 02:32:53 -07003150TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003151 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003152 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003153 cricket::StreamParams stream;
3154 stream.ssrcs.push_back(kSsrc2);
3155 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003156 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003157 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003158 float scale = 0;
3159 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3160 EXPECT_DOUBLE_EQ(3, scale);
3161}
3162
3163TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003164 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003165 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3166 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3167 int channel_id = voe_.GetLastChannel();
3168 float scale = 0;
3169 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3170 EXPECT_DOUBLE_EQ(2, scale);
3171 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003172 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003173 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003174}
3175
pbos8fc7fa72015-07-15 08:02:58 -07003176TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003177 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003178 const std::string kSyncLabel = "AvSyncLabel";
3179
solenbergff976312016-03-30 23:28:51 -07003180 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003181 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3182 sp.sync_label = kSyncLabel;
3183 // Creating two channels to make sure that sync label is set properly for both
3184 // the default voice channel and following ones.
3185 EXPECT_TRUE(channel_->AddRecvStream(sp));
3186 sp.ssrcs[0] += 1;
3187 EXPECT_TRUE(channel_->AddRecvStream(sp));
3188
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003189 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003190 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003191 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003192 << "SyncGroup should be set based on sync_label";
3193 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003194 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003195 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003196}
3197
solenberg3a941542015-11-16 07:34:50 -08003198// TODO(solenberg): Remove, once recv streams are configured through Call.
3199// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003200TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003201 // Test that setting the header extensions results in the expected state
3202 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003203 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003204 ssrcs.push_back(223);
3205 ssrcs.push_back(224);
3206
solenbergff976312016-03-30 23:28:51 -07003207 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003208 cricket::WebRtcVoiceMediaChannel* media_channel =
3209 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003210 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003211 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003212 EXPECT_TRUE(media_channel->AddRecvStream(
3213 cricket::StreamParams::CreateLegacy(ssrc)));
3214 }
3215
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003216 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003217 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003218 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003219 EXPECT_NE(nullptr, s);
3220 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3221 }
3222
3223 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003224 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003225 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003226 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003227 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003228 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003229 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003230 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003231 EXPECT_NE(nullptr, s);
3232 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003233 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3234 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003235 for (const auto& s_ext : s_exts) {
3236 if (e_ext.id == s_ext.id) {
3237 EXPECT_EQ(e_ext.uri, s_ext.name);
3238 }
3239 }
3240 }
3241 }
3242
3243 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003244 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003245 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003246 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003247 EXPECT_NE(nullptr, s);
3248 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3249 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003250}
3251
3252TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3253 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003254 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003255 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003256 static const unsigned char kRtcp[] = {
3257 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3258 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3259 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3260 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3261 };
jbaucheec21bd2016-03-20 06:15:43 -07003262 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003263
solenbergff976312016-03-30 23:28:51 -07003264 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003265 cricket::WebRtcVoiceMediaChannel* media_channel =
3266 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003267 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003268 EXPECT_TRUE(media_channel->AddRecvStream(
3269 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3270
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003271 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003272 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003273 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003274 EXPECT_EQ(0, s->received_packets());
3275 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3276 EXPECT_EQ(1, s->received_packets());
3277 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3278 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003279}
Minyue2013aec2015-05-13 14:14:42 +02003280
solenberg0a617e22015-10-20 15:49:38 -07003281// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003282// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003283TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003284 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003285 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003286 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003287 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3288 int recv_ch = voe_.GetLastChannel();
3289 EXPECT_NE(recv_ch, default_channel);
3290 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3291 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3292 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003293 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3294 recv_ch = voe_.GetLastChannel();
3295 EXPECT_NE(recv_ch, default_channel);
3296 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003297}
3298
3299TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003300 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003301 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003302
3303 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3304 int recv_ch = voe_.GetLastChannel();
3305
3306 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3307 int send_ch = voe_.GetLastChannel();
3308
3309 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3310 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3311 // channel of |recv_ch|.This is not a common case, since, normally, only the
3312 // default channel can be associated. However, the default is not deletable.
3313 // So we force the |recv_ch| to associate with a non-default channel.
3314 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3315 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3316
3317 EXPECT_TRUE(channel_->RemoveSendStream(2));
3318 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3319}
stefan658910c2015-09-03 05:48:32 -07003320
deadbeef884f5852016-01-15 09:20:04 -08003321TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003322 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003323 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3324 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003325
3326 // Setting the sink before a recv stream exists should do nothing.
3327 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3328 EXPECT_TRUE(
3329 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3330 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3331
3332 // Now try actually setting the sink.
3333 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3334 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3335
3336 // Now try resetting it.
3337 channel_->SetRawAudioSink(kSsrc1, nullptr);
3338 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3339}
3340
3341TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003342 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003343 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3344 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003345
3346 // Should be able to set a default sink even when no stream exists.
3347 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3348
3349 // Create default channel and ensure it's assigned the default sink.
3350 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3351 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3352
3353 // Try resetting the default sink.
3354 channel_->SetRawAudioSink(0, nullptr);
3355 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3356
3357 // Try setting the default sink while the default stream exists.
3358 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3359 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3360
3361 // If we remove and add a default stream, it should get the same sink.
3362 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3363 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3364 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3365}
3366
skvlad7a43d252016-03-22 15:32:27 -07003367// Test that, just like the video channel, the voice channel communicates the
3368// network state to the call.
3369TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003370 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003371
3372 EXPECT_EQ(webrtc::kNetworkUp,
3373 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3374 EXPECT_EQ(webrtc::kNetworkUp,
3375 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3376
3377 channel_->OnReadyToSend(false);
3378 EXPECT_EQ(webrtc::kNetworkDown,
3379 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3380 EXPECT_EQ(webrtc::kNetworkUp,
3381 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3382
3383 channel_->OnReadyToSend(true);
3384 EXPECT_EQ(webrtc::kNetworkUp,
3385 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3386 EXPECT_EQ(webrtc::kNetworkUp,
3387 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3388}
3389
stefan658910c2015-09-03 05:48:32 -07003390// Tests that the library initializes and shuts down properly.
3391TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003392 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003393 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003394 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003395 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3396 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003397 EXPECT_TRUE(channel != nullptr);
3398 delete channel;
solenbergff976312016-03-30 23:28:51 -07003399}
stefan658910c2015-09-03 05:48:32 -07003400
solenbergff976312016-03-30 23:28:51 -07003401// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003402TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3403 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3404 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3405 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003406 {
3407 cricket::WebRtcVoiceEngine engine(&adm);
3408 std::unique_ptr<webrtc::Call> call(
3409 webrtc::Call::Create(webrtc::Call::Config()));
3410 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3411 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3412 EXPECT_TRUE(channel != nullptr);
3413 delete channel;
3414 }
stefan658910c2015-09-03 05:48:32 -07003415}
3416
3417// Tests that the library is configured with the codecs we want.
3418TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003419 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003420 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003421 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003422 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003423 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003424 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003425 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003426 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003427 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003428 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003429 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003430 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003431 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003432 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003433 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003434 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003435 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003436 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003437 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003438 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003439 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003440 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003441 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003442 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003443 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003444 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003445 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003446 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003447 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003448 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003449 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003450 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003451 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003452 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003453 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003454 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003455 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003456 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003457 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003458 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003459 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003460 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003461 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003462 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003463 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003464 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003465 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003466 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003467 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003468 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003469 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003470
stefan658910c2015-09-03 05:48:32 -07003471 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003472 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003473 for (std::vector<cricket::AudioCodec>::const_iterator it =
3474 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3475 if (it->name == "CN" && it->clockrate == 16000) {
3476 EXPECT_EQ(105, it->id);
3477 } else if (it->name == "CN" && it->clockrate == 32000) {
3478 EXPECT_EQ(106, it->id);
3479 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3480 EXPECT_EQ(103, it->id);
3481 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3482 EXPECT_EQ(104, it->id);
3483 } else if (it->name == "G722" && it->clockrate == 8000) {
3484 EXPECT_EQ(9, it->id);
3485 } else if (it->name == "telephone-event") {
3486 EXPECT_EQ(126, it->id);
3487 } else if (it->name == "red") {
3488 EXPECT_EQ(127, it->id);
3489 } else if (it->name == "opus") {
3490 EXPECT_EQ(111, it->id);
3491 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3492 EXPECT_EQ("10", it->params.find("minptime")->second);
3493 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3494 EXPECT_EQ("60", it->params.find("maxptime")->second);
3495 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3496 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3497 }
3498 }
stefan658910c2015-09-03 05:48:32 -07003499}
3500
3501// Tests that VoE supports at least 32 channels
3502TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003503 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003504 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003505 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003506
3507 cricket::VoiceMediaChannel* channels[32];
3508 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003509 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003510 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3511 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003512 if (!channel)
3513 break;
stefan658910c2015-09-03 05:48:32 -07003514 channels[num_channels++] = channel;
3515 }
3516
tfarina5237aaf2015-11-10 23:44:30 -08003517 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003518 EXPECT_EQ(expected, num_channels);
3519
3520 while (num_channels > 0) {
3521 delete channels[--num_channels];
3522 }
stefan658910c2015-09-03 05:48:32 -07003523}
3524
3525// Test that we set our preferred codecs properly.
3526TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003527 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003528 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003529 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003530 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3531 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003532 cricket::AudioRecvParameters parameters;
3533 parameters.codecs = engine.codecs();
3534 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003535}