blob: e17aea34b874853d425740f914845600666811bc [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
Peter Boström0c4e06b2015-10-07 12:23:21 +0200167 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700168 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000169 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700170 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000171 // send stream.
172 EXPECT_TRUE(channel_->AddSendStream(
173 cricket::StreamParams::CreateLegacy(kSsrc1)));
174 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000175
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200177 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800178 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000179 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800180 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200181 send_parameters_.codecs.push_back(kTelephoneEventCodec);
182 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000184
185 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700186 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800187 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000188 EXPECT_TRUE(channel_->AddSendStream(
189 cricket::StreamParams::CreateLegacy(kSsrc1)));
190 }
191
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000192 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800193 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000194
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100195 // Test send.
196 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
197 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
198 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800199 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100200 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
201 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
202 EXPECT_EQ(2, telephone_event.event_code);
203 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204 }
205
206 // Test that send bandwidth is set correctly.
207 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000208 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
209 // |expected_result| is the expected result from SetMaxSendBandwidth().
210 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000212 int max_bitrate,
213 bool expected_result,
214 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200215 cricket::AudioSendParameters parameters;
216 parameters.codecs.push_back(codec);
217 parameters.max_bandwidth_bps = max_bitrate;
218 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
219
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000220 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000221 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000222 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000223 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000224 }
225
skvlade0d46372016-04-07 22:59:22 -0700226 // Sets the per-stream maximum bitrate limit for the specified SSRC.
227 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
228 webrtc::RtpParameters parameters = channel_->GetRtpParameters(ssrc);
229 EXPECT_EQ(1UL, parameters.encodings.size());
230
231 parameters.encodings[0].max_bitrate_bps = bitrate;
232 return channel_->SetRtpParameters(ssrc, parameters);
233 }
234
235 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
236 cricket::AudioSendParameters send_parameters;
237 send_parameters.codecs.push_back(codec);
238 send_parameters.max_bandwidth_bps = bitrate;
239 return channel_->SetSendParameters(send_parameters);
240 }
241
242 int GetCodecBitrate(int32_t ssrc) {
243 cricket::WebRtcVoiceMediaChannel* media_channel =
244 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
245 int channel = media_channel->GetSendChannelId(ssrc);
246 EXPECT_NE(-1, channel);
247 webrtc::CodecInst codec;
248 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
249 return codec.rate;
250 }
251
252 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
253 int global_max,
254 int stream_max,
255 bool expected_result,
256 int expected_codec_bitrate) {
257 // Clear the bitrate limit from the previous test case.
258 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
259
260 // Attempt to set the requested bitrate limits.
261 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
262 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
263
264 // Verify that reading back the parameters gives results
265 // consistent with the Set() result.
266 webrtc::RtpParameters resulting_parameters =
267 channel_->GetRtpParameters(kSsrc1);
268 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
269 EXPECT_EQ(expected_result ? stream_max : -1,
270 resulting_parameters.encodings[0].max_bitrate_bps);
271
272 // Verify that the codec settings have the expected bitrate.
273 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
274 }
275
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000276 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700277 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000278
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000279 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800280 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000281
282 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200283 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000284 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200285 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800286 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000287
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000288 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200289 send_parameters_.extensions.clear();
290 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800291 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000292
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000293 // Ensure extension is set properly.
294 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200295 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
296 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800297 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
298 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
299 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000300
solenberg7add0582015-11-20 09:59:34 -0800301 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000302 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700303 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800304 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
305 call_.GetAudioSendStream(kSsrc2));
306 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
307 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
308 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000309
310 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200311 send_parameters_.codecs.push_back(kPcmuCodec);
312 send_parameters_.extensions.clear();
313 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800314 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
315 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000316 }
317
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000318 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700319 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000320
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000321 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800322 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000323
324 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800325 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000326 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800327 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
328 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000329
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000330 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800331 recv_parameters_.extensions.clear();
332 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
333 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000334
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000335 // Ensure extension is set properly.
336 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800337 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
338 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
339 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
340 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
341 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000342
solenberg7add0582015-11-20 09:59:34 -0800343 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000344 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700345 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800346 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
347 call_.GetAudioReceiveStream(kSsrc2));
348 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
349 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
350 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000351
352 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800353 recv_parameters_.extensions.clear();
354 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
355 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
356 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000357 }
358
solenberg85a04962015-10-27 03:35:21 -0700359 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
360 webrtc::AudioSendStream::Stats stats;
361 stats.local_ssrc = 12;
362 stats.bytes_sent = 345;
363 stats.packets_sent = 678;
364 stats.packets_lost = 9012;
365 stats.fraction_lost = 34.56f;
366 stats.codec_name = "codec_name_send";
367 stats.ext_seqnum = 789;
368 stats.jitter_ms = 12;
369 stats.rtt_ms = 345;
370 stats.audio_level = 678;
371 stats.aec_quality_min = 9.01f;
372 stats.echo_delay_median_ms = 234;
373 stats.echo_delay_std_ms = 567;
374 stats.echo_return_loss = 890;
375 stats.echo_return_loss_enhancement = 1234;
376 stats.typing_noise_detected = true;
377 return stats;
378 }
379 void SetAudioSendStreamStats() {
380 for (auto* s : call_.GetAudioSendStreams()) {
381 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200382 }
solenberg85a04962015-10-27 03:35:21 -0700383 }
solenberg566ef242015-11-06 15:34:49 -0800384 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
385 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700386 const auto stats = GetAudioSendStreamStats();
387 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
388 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
389 EXPECT_EQ(info.packets_sent, stats.packets_sent);
390 EXPECT_EQ(info.packets_lost, stats.packets_lost);
391 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
392 EXPECT_EQ(info.codec_name, stats.codec_name);
393 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
394 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
395 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
396 EXPECT_EQ(info.audio_level, stats.audio_level);
397 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
398 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
399 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
400 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
401 EXPECT_EQ(info.echo_return_loss_enhancement,
402 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800403 EXPECT_EQ(info.typing_noise_detected,
404 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700405 }
406
407 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
408 webrtc::AudioReceiveStream::Stats stats;
409 stats.remote_ssrc = 123;
410 stats.bytes_rcvd = 456;
411 stats.packets_rcvd = 768;
412 stats.packets_lost = 101;
413 stats.fraction_lost = 23.45f;
414 stats.codec_name = "codec_name_recv";
415 stats.ext_seqnum = 678;
416 stats.jitter_ms = 901;
417 stats.jitter_buffer_ms = 234;
418 stats.jitter_buffer_preferred_ms = 567;
419 stats.delay_estimate_ms = 890;
420 stats.audio_level = 1234;
421 stats.expand_rate = 5.67f;
422 stats.speech_expand_rate = 8.90f;
423 stats.secondary_decoded_rate = 1.23f;
424 stats.accelerate_rate = 4.56f;
425 stats.preemptive_expand_rate = 7.89f;
426 stats.decoding_calls_to_silence_generator = 12;
427 stats.decoding_calls_to_neteq = 345;
428 stats.decoding_normal = 67890;
429 stats.decoding_plc = 1234;
430 stats.decoding_cng = 5678;
431 stats.decoding_plc_cng = 9012;
432 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200433 return stats;
434 }
435 void SetAudioReceiveStreamStats() {
436 for (auto* s : call_.GetAudioReceiveStreams()) {
437 s->SetStats(GetAudioReceiveStreamStats());
438 }
439 }
440 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700441 const auto stats = GetAudioReceiveStreamStats();
442 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
443 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
444 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
445 EXPECT_EQ(info.packets_lost, stats.packets_lost);
446 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
447 EXPECT_EQ(info.codec_name, stats.codec_name);
448 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
449 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
450 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200451 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700452 stats.jitter_buffer_preferred_ms);
453 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
454 EXPECT_EQ(info.audio_level, stats.audio_level);
455 EXPECT_EQ(info.expand_rate, stats.expand_rate);
456 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
457 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
458 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
459 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200460 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700461 stats.decoding_calls_to_silence_generator);
462 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
463 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
464 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
465 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
466 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
467 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200468 }
469
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700471 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200472 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700474 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700475 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200476 cricket::AudioSendParameters send_parameters_;
477 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800478 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800479 private:
480 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481};
482
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483// Tests that we can create and destroy a channel.
484TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700485 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000486}
487
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700489// correctly (such that opus appears first).
490TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700491 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492 ASSERT_FALSE(codecs.empty());
493 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
494 EXPECT_EQ(48000, codecs[0].clockrate);
495 EXPECT_EQ(2, codecs[0].channels);
496 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497}
498
stefanba4c0e42016-02-04 04:12:24 -0800499TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700500 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800501 bool opus_found = false;
502 for (cricket::AudioCodec codec : codecs) {
503 if (codec.name == "opus") {
504 EXPECT_TRUE(HasTransportCc(codec));
505 opus_found = true;
506 }
507 }
508 EXPECT_TRUE(opus_found);
509}
510
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000511// Tests that we can find codecs by name or id, and that we interpret the
512// clockrate and bitrate fields properly.
513TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
514 cricket::AudioCodec codec;
515 webrtc::CodecInst codec_inst;
516 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800517 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800519 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800521 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
522 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000523 // Find ISAC with a different payload id.
524 codec = kIsacCodec;
525 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800526 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 EXPECT_EQ(codec.id, codec_inst.pltype);
528 // Find PCMU with a 0 clockrate.
529 codec = kPcmuCodec;
530 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800531 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 EXPECT_EQ(codec.id, codec_inst.pltype);
533 EXPECT_EQ(8000, codec_inst.plfreq);
534 // Find PCMU with a 0 bitrate.
535 codec = kPcmuCodec;
536 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800537 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538 EXPECT_EQ(codec.id, codec_inst.pltype);
539 EXPECT_EQ(64000, codec_inst.rate);
540 // Find ISAC with an explicit bitrate.
541 codec = kIsacCodec;
542 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800543 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000544 EXPECT_EQ(codec.id, codec_inst.pltype);
545 EXPECT_EQ(32000, codec_inst.rate);
546}
547
548// Test that we set our inbound codecs properly, including changing PT.
549TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700550 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200551 cricket::AudioRecvParameters parameters;
552 parameters.codecs.push_back(kIsacCodec);
553 parameters.codecs.push_back(kPcmuCodec);
554 parameters.codecs.push_back(kTelephoneEventCodec);
555 parameters.codecs[0].id = 106; // collide with existing telephone-event
556 parameters.codecs[2].id = 126;
557 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700558 EXPECT_TRUE(channel_->AddRecvStream(
559 cricket::StreamParams::CreateLegacy(kSsrc1)));
560 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800562 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 gcodec.plfreq = 16000;
564 gcodec.channels = 1;
565 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
566 EXPECT_EQ(106, gcodec.pltype);
567 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800568 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000569 gcodec.plfreq = 8000;
570 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
571 EXPECT_EQ(126, gcodec.pltype);
572 EXPECT_STREQ("telephone-event", gcodec.plname);
573}
574
575// Test that we fail to set an unknown inbound codec.
576TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700577 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200578 cricket::AudioRecvParameters parameters;
579 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700580 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200581 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582}
583
584// Test that we fail if we have duplicate types in the inbound list.
585TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700586 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200587 cricket::AudioRecvParameters parameters;
588 parameters.codecs.push_back(kIsacCodec);
589 parameters.codecs.push_back(kCn16000Codec);
590 parameters.codecs[1].id = kIsacCodec.id;
591 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592}
593
594// Test that we can decode OPUS without stereo parameters.
595TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
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(kPcmuCodec);
600 parameters.codecs.push_back(kOpusCodec);
601 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 EXPECT_TRUE(channel_->AddRecvStream(
603 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700604 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800606 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 // Even without stereo parameters, recv codecs still specify channels = 2.
608 EXPECT_EQ(2, opus.channels);
609 EXPECT_EQ(111, opus.pltype);
610 EXPECT_STREQ("opus", opus.plname);
611 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700612 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 EXPECT_EQ(111, opus.pltype);
614}
615
616// Test that we can decode OPUS with stereo = 0.
617TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700618 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 cricket::AudioRecvParameters parameters;
620 parameters.codecs.push_back(kIsacCodec);
621 parameters.codecs.push_back(kPcmuCodec);
622 parameters.codecs.push_back(kOpusCodec);
623 parameters.codecs[2].params["stereo"] = "0";
624 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 EXPECT_TRUE(channel_->AddRecvStream(
626 cricket::StreamParams::CreateLegacy(kSsrc1)));
627 int channel_num2 = voe_.GetLastChannel();
628 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800629 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630 // Even when stereo is off, recv codecs still specify channels = 2.
631 EXPECT_EQ(2, opus.channels);
632 EXPECT_EQ(111, opus.pltype);
633 EXPECT_STREQ("opus", opus.plname);
634 opus.pltype = 0;
635 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
636 EXPECT_EQ(111, opus.pltype);
637}
638
639// Test that we can decode OPUS with stereo = 1.
640TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700641 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200642 cricket::AudioRecvParameters parameters;
643 parameters.codecs.push_back(kIsacCodec);
644 parameters.codecs.push_back(kPcmuCodec);
645 parameters.codecs.push_back(kOpusCodec);
646 parameters.codecs[2].params["stereo"] = "1";
647 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_TRUE(channel_->AddRecvStream(
649 cricket::StreamParams::CreateLegacy(kSsrc1)));
650 int channel_num2 = voe_.GetLastChannel();
651 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800652 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 EXPECT_EQ(2, opus.channels);
654 EXPECT_EQ(111, opus.pltype);
655 EXPECT_STREQ("opus", opus.plname);
656 opus.pltype = 0;
657 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
658 EXPECT_EQ(111, opus.pltype);
659}
660
661// Test that changes to recv codecs are applied to all streams.
662TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700663 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200664 cricket::AudioRecvParameters parameters;
665 parameters.codecs.push_back(kIsacCodec);
666 parameters.codecs.push_back(kPcmuCodec);
667 parameters.codecs.push_back(kTelephoneEventCodec);
668 parameters.codecs[0].id = 106; // collide with existing telephone-event
669 parameters.codecs[2].id = 126;
670 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 EXPECT_TRUE(channel_->AddRecvStream(
672 cricket::StreamParams::CreateLegacy(kSsrc1)));
673 int channel_num2 = voe_.GetLastChannel();
674 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800675 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 gcodec.plfreq = 16000;
677 gcodec.channels = 1;
678 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
679 EXPECT_EQ(106, gcodec.pltype);
680 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800681 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682 gcodec.plfreq = 8000;
683 gcodec.channels = 1;
684 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
685 EXPECT_EQ(126, gcodec.pltype);
686 EXPECT_STREQ("telephone-event", gcodec.plname);
687}
688
689TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700690 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200691 cricket::AudioRecvParameters parameters;
692 parameters.codecs.push_back(kIsacCodec);
693 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200694 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695
696 int channel_num2 = voe_.GetLastChannel();
697 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800698 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 gcodec.plfreq = 16000;
700 gcodec.channels = 1;
701 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
702 EXPECT_EQ(106, gcodec.pltype);
703 EXPECT_STREQ("ISAC", gcodec.plname);
704}
705
706// Test that we can apply the same set of codecs again while playing.
707TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700708 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200709 cricket::AudioRecvParameters parameters;
710 parameters.codecs.push_back(kIsacCodec);
711 parameters.codecs.push_back(kCn16000Codec);
712 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200714 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715
716 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200717 parameters.codecs[0].id = 127;
718 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
719 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 EXPECT_TRUE(voe_.GetPlayout(channel_num));
721}
722
723// Test that we can add a codec while playing.
724TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700725 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200726 cricket::AudioRecvParameters parameters;
727 parameters.codecs.push_back(kIsacCodec);
728 parameters.codecs.push_back(kCn16000Codec);
729 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 EXPECT_TRUE(channel_->SetPlayout(true));
731
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200732 parameters.codecs.push_back(kOpusCodec);
733 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
734 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 EXPECT_TRUE(voe_.GetPlayout(channel_num));
736 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800737 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000738 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
739}
740
741TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700742 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000744 // Test that when autobw is enabled, bitrate is kept as the default
745 // value. autobw is enabled for the following tests because the target
746 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747
748 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000749 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750
751 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000752 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000755 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756}
757
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000758TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700759 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000761 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762
763 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000764 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
765 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000768 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
769 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770}
771
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000772TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700773 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000774
775 // Test that we can only set a maximum bitrate for a fixed-rate codec
776 // if it's bigger than the fixed rate.
777
778 // PCMU, fixed bitrate == 64000.
779 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
780 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
781 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
782 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
783 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
784 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
785 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
786}
787
788TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700789 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200790 const int kDesiredBitrate = 128000;
791 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700792 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200793 parameters.max_bandwidth_bps = kDesiredBitrate;
794 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000795
796 EXPECT_TRUE(channel_->AddSendStream(
797 cricket::StreamParams::CreateLegacy(kSsrc1)));
798
799 int channel_num = voe_.GetLastChannel();
800 webrtc::CodecInst codec;
801 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200802 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000803}
804
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805// Test that bitrate cannot be set for CBR codecs.
806// Bitrate is ignored if it is higher than the fixed bitrate.
807// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000808TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700809 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810
811 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200812 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
813 int channel_num = voe_.GetLastChannel();
814 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
816 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200817
818 send_parameters_.max_bandwidth_bps = 128000;
819 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
821 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200822
823 send_parameters_.max_bandwidth_bps = 128;
824 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
826 EXPECT_EQ(64000, codec.rate);
827}
828
skvlade0d46372016-04-07 22:59:22 -0700829// Test that the per-stream bitrate limit and the global
830// bitrate limit both apply.
831TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
832 EXPECT_TRUE(SetupSendStream());
833
834 // opus, default bitrate == 64000.
835 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
836 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
837 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
838 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
839
840 // CBR codecs allow both maximums to exceed the bitrate.
841 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
842 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
843 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
844 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
845
846 // CBR codecs don't allow per stream maximums to be too low.
847 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
848 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
849}
850
851// Test that an attempt to set RtpParameters for a stream that does not exist
852// fails.
853TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
854 EXPECT_TRUE(SetupChannel());
855 webrtc::RtpParameters nonexistent_parameters =
856 channel_->GetRtpParameters(kSsrc1);
857 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
858
859 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
860 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, nonexistent_parameters));
861}
862
863TEST_F(WebRtcVoiceEngineTestFake,
864 CannotSetRtpParametersWithIncorrectNumberOfEncodings) {
865 // This test verifies that setting RtpParameters succeeds only if
866 // the structure contains exactly one encoding.
867 // TODO(skvlad): Update this test when we start supporting setting parameters
868 // for each encoding individually.
869
870 EXPECT_TRUE(SetupSendStream());
871 // Setting RtpParameters with no encoding is expected to fail.
872 webrtc::RtpParameters parameters;
873 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
874 // Setting RtpParameters with exactly one encoding should succeed.
875 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
876 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
877 // Two or more encodings should result in failure.
878 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
879 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
880}
881
882// Test that SetRtpParameters configures the correct encoding channel for each
883// SSRC.
884TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
885 SetupForMultiSendStream();
886 // Create send streams.
887 for (uint32_t ssrc : kSsrcs4) {
888 EXPECT_TRUE(
889 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
890 }
891 // Configure one stream to be limited by the stream config, another to be
892 // limited by the global max, and the third one with no per-stream limit
893 // (still subject to the global limit).
894 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
895 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
896 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
897 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
898
899 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
900 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
901 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
902
903 // Remove the global cap; the streams should switch to their respective
904 // maximums (or remain unchanged if there was no other limit on them.)
905 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
906 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
907 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
908 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
909}
910
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000911// Test that we apply codecs properly.
912TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700913 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200914 cricket::AudioSendParameters parameters;
915 parameters.codecs.push_back(kIsacCodec);
916 parameters.codecs.push_back(kPcmuCodec);
917 parameters.codecs.push_back(kRedCodec);
918 parameters.codecs[0].id = 96;
919 parameters.codecs[0].bitrate = 48000;
920 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000921 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200922 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 webrtc::CodecInst gcodec;
924 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
925 EXPECT_EQ(96, gcodec.pltype);
926 EXPECT_EQ(48000, gcodec.rate);
927 EXPECT_STREQ("ISAC", gcodec.plname);
928 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000929 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
931 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100932 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000933}
934
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000935// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
936// to apply.
937TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700938 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200939 cricket::AudioSendParameters parameters;
940 parameters.codecs.push_back(kIsacCodec);
941 parameters.codecs.push_back(kPcmuCodec);
942 parameters.codecs.push_back(kRedCodec);
943 parameters.codecs[0].id = 96;
944 parameters.codecs[0].bitrate = 48000;
945 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000946 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
947 // Calling SetSendCodec again with same codec which is already set.
948 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200949 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000950 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
951}
952
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000953// Verify that G722 is set with 16000 samples per second to WebRTC.
954TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -0700955 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000956 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200957 cricket::AudioSendParameters parameters;
958 parameters.codecs.push_back(kG722CodecSdp);
959 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000960 webrtc::CodecInst gcodec;
961 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
962 EXPECT_STREQ("G722", gcodec.plname);
963 EXPECT_EQ(1, gcodec.channels);
964 EXPECT_EQ(16000, gcodec.plfreq);
965}
966
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000967// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000968TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -0700969 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200970 cricket::AudioSendParameters parameters;
971 parameters.codecs.push_back(kOpusCodec);
972 parameters.codecs[0].bitrate = 0;
973 parameters.codecs[0].clockrate = 50000;
974 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975}
976
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000977// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
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].channels = 0;
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, SetSendCodecOpusBad0Channels1Stereo) {
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 parameters.codecs[0].params["stereo"] = "1";
995 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996}
997
998// Test that if channel is 1 for opus and there's no stereo, we fail.
999TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001000 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001001 cricket::AudioSendParameters parameters;
1002 parameters.codecs.push_back(kOpusCodec);
1003 parameters.codecs[0].bitrate = 0;
1004 parameters.codecs[0].channels = 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 stereo=0, we fail.
1009TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
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 parameters.codecs[0].params["stereo"] = "0";
1016 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017}
1018
1019// Test that if channel is 1 for opus and stereo=1, we fail.
1020TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001021 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001022 cricket::AudioSendParameters parameters;
1023 parameters.codecs.push_back(kOpusCodec);
1024 parameters.codecs[0].bitrate = 0;
1025 parameters.codecs[0].channels = 1;
1026 parameters.codecs[0].params["stereo"] = "1";
1027 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001028}
1029
1030// Test that with bitrate=0 and no stereo,
1031// channels and bitrate are 1 and 32000.
1032TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001033 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001034 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001035 cricket::AudioSendParameters parameters;
1036 parameters.codecs.push_back(kOpusCodec);
1037 parameters.codecs[0].bitrate = 0;
1038 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001039 webrtc::CodecInst gcodec;
1040 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1041 EXPECT_STREQ("opus", gcodec.plname);
1042 EXPECT_EQ(1, gcodec.channels);
1043 EXPECT_EQ(32000, gcodec.rate);
1044}
1045
1046// Test that with bitrate=0 and stereo=0,
1047// channels and bitrate are 1 and 32000.
1048TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001049 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001050 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001051 cricket::AudioSendParameters parameters;
1052 parameters.codecs.push_back(kOpusCodec);
1053 parameters.codecs[0].bitrate = 0;
1054 parameters.codecs[0].params["stereo"] = "0";
1055 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056 webrtc::CodecInst gcodec;
1057 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1058 EXPECT_STREQ("opus", gcodec.plname);
1059 EXPECT_EQ(1, gcodec.channels);
1060 EXPECT_EQ(32000, gcodec.rate);
1061}
1062
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001063// Test that with bitrate=invalid and stereo=0,
1064// channels and bitrate are 1 and 32000.
1065TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001066 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001067 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 cricket::AudioSendParameters parameters;
1069 parameters.codecs.push_back(kOpusCodec);
1070 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001071 webrtc::CodecInst gcodec;
1072
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001073 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001074 parameters.codecs[0].bitrate = 5999;
1075 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001076 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1077 EXPECT_STREQ("opus", gcodec.plname);
1078 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001079 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001080
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001081 parameters.codecs[0].bitrate = 510001;
1082 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001083 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1084 EXPECT_STREQ("opus", gcodec.plname);
1085 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001086 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001087}
1088
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001089// Test that with bitrate=0 and stereo=1,
1090// channels and bitrate are 2 and 64000.
1091TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001092 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001094 cricket::AudioSendParameters parameters;
1095 parameters.codecs.push_back(kOpusCodec);
1096 parameters.codecs[0].bitrate = 0;
1097 parameters.codecs[0].params["stereo"] = "1";
1098 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099 webrtc::CodecInst gcodec;
1100 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1101 EXPECT_STREQ("opus", gcodec.plname);
1102 EXPECT_EQ(2, gcodec.channels);
1103 EXPECT_EQ(64000, gcodec.rate);
1104}
1105
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001106// Test that with bitrate=invalid and stereo=1,
1107// channels and bitrate are 2 and 64000.
1108TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001109 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001110 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001111 cricket::AudioSendParameters parameters;
1112 parameters.codecs.push_back(kOpusCodec);
1113 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001114 webrtc::CodecInst gcodec;
1115
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001116 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001117 parameters.codecs[0].bitrate = 5999;
1118 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001119 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1120 EXPECT_STREQ("opus", gcodec.plname);
1121 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001122 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001123
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001124 parameters.codecs[0].bitrate = 510001;
1125 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001126 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1127 EXPECT_STREQ("opus", gcodec.plname);
1128 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001129 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001130}
1131
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132// Test that with bitrate=N and stereo unset,
1133// channels and bitrate are 1 and N.
1134TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001135 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001137 cricket::AudioSendParameters parameters;
1138 parameters.codecs.push_back(kOpusCodec);
1139 parameters.codecs[0].bitrate = 96000;
1140 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001141 webrtc::CodecInst gcodec;
1142 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1143 EXPECT_EQ(111, gcodec.pltype);
1144 EXPECT_EQ(96000, gcodec.rate);
1145 EXPECT_STREQ("opus", gcodec.plname);
1146 EXPECT_EQ(1, gcodec.channels);
1147 EXPECT_EQ(48000, gcodec.plfreq);
1148}
1149
1150// Test that with bitrate=N and stereo=0,
1151// channels and bitrate are 1 and N.
1152TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001153 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001155 cricket::AudioSendParameters parameters;
1156 parameters.codecs.push_back(kOpusCodec);
1157 parameters.codecs[0].bitrate = 30000;
1158 parameters.codecs[0].params["stereo"] = "0";
1159 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160 webrtc::CodecInst gcodec;
1161 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1162 EXPECT_EQ(1, gcodec.channels);
1163 EXPECT_EQ(30000, gcodec.rate);
1164 EXPECT_STREQ("opus", gcodec.plname);
1165}
1166
1167// Test that with bitrate=N and without any parameters,
1168// channels and bitrate are 1 and N.
1169TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001170 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001171 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001172 cricket::AudioSendParameters parameters;
1173 parameters.codecs.push_back(kOpusCodec);
1174 parameters.codecs[0].bitrate = 30000;
1175 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 webrtc::CodecInst gcodec;
1177 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1178 EXPECT_EQ(1, gcodec.channels);
1179 EXPECT_EQ(30000, gcodec.rate);
1180 EXPECT_STREQ("opus", gcodec.plname);
1181}
1182
1183// Test that with bitrate=N and stereo=1,
1184// channels and bitrate are 2 and N.
1185TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001186 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001188 cricket::AudioSendParameters parameters;
1189 parameters.codecs.push_back(kOpusCodec);
1190 parameters.codecs[0].bitrate = 30000;
1191 parameters.codecs[0].params["stereo"] = "1";
1192 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001193 webrtc::CodecInst gcodec;
1194 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1195 EXPECT_EQ(2, gcodec.channels);
1196 EXPECT_EQ(30000, gcodec.rate);
1197 EXPECT_STREQ("opus", gcodec.plname);
1198}
1199
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001200// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1201// Also test that the "maxaveragebitrate" can't be set to values outside the
1202// range of 6000 and 510000
1203TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001204 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001205 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001206 cricket::AudioSendParameters parameters;
1207 parameters.codecs.push_back(kOpusCodec);
1208 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001209 webrtc::CodecInst gcodec;
1210
1211 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001212 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1213 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001214 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001215 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216
1217 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001218 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1219 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001220 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001221 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001222
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001223 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1224 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001225 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1226 EXPECT_EQ(200000, gcodec.rate);
1227}
1228
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001229// Test that we can enable NACK with opus as caller.
1230TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001231 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001232 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001233 cricket::AudioSendParameters parameters;
1234 parameters.codecs.push_back(kOpusCodec);
1235 parameters.codecs[0].AddFeedbackParam(
1236 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1237 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001239 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240 EXPECT_TRUE(voe_.GetNACK(channel_num));
1241}
1242
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001243// Test that we can enable NACK with opus as callee.
1244TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001245 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001246 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001247 cricket::AudioSendParameters parameters;
1248 parameters.codecs.push_back(kOpusCodec);
1249 parameters.codecs[0].AddFeedbackParam(
1250 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1251 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001252 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001254 EXPECT_FALSE(voe_.GetNACK(channel_num));
1255
1256 EXPECT_TRUE(channel_->AddSendStream(
1257 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001258 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001259}
1260
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261// Test that we can enable NACK on receive streams.
1262TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001263 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001264 int channel_num1 = voe_.GetLastChannel();
1265 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1266 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001267 cricket::AudioSendParameters parameters;
1268 parameters.codecs.push_back(kOpusCodec);
1269 parameters.codecs[0].AddFeedbackParam(
1270 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1271 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1273 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001274 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001275 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1276 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1277}
1278
1279// Test that we can disable NACK.
1280TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001281 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001282 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001283 cricket::AudioSendParameters parameters;
1284 parameters.codecs.push_back(kOpusCodec);
1285 parameters.codecs[0].AddFeedbackParam(
1286 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1287 cricket::kParamValueEmpty));
1288 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001289 EXPECT_TRUE(voe_.GetNACK(channel_num));
1290
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001291 parameters.codecs.clear();
1292 parameters.codecs.push_back(kOpusCodec);
1293 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001294 EXPECT_FALSE(voe_.GetNACK(channel_num));
1295}
1296
1297// Test that we can disable NACK on receive streams.
1298TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001299 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 int channel_num1 = voe_.GetLastChannel();
1301 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1302 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001303 cricket::AudioSendParameters parameters;
1304 parameters.codecs.push_back(kOpusCodec);
1305 parameters.codecs[0].AddFeedbackParam(
1306 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1307 cricket::kParamValueEmpty));
1308 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1310 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1311
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001312 parameters.codecs.clear();
1313 parameters.codecs.push_back(kOpusCodec);
1314 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1316 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1317}
1318
1319// Test that NACK is enabled on a new receive stream.
1320TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001321 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001322 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001323 cricket::AudioSendParameters parameters;
1324 parameters.codecs.push_back(kIsacCodec);
1325 parameters.codecs.push_back(kCn16000Codec);
1326 parameters.codecs[0].AddFeedbackParam(
1327 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1328 cricket::kParamValueEmpty));
1329 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001330 EXPECT_TRUE(voe_.GetNACK(channel_num));
1331
1332 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1333 channel_num = voe_.GetLastChannel();
1334 EXPECT_TRUE(voe_.GetNACK(channel_num));
1335 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1336 channel_num = voe_.GetLastChannel();
1337 EXPECT_TRUE(voe_.GetNACK(channel_num));
1338}
1339
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001340// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001341TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001342 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001343 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001344 cricket::AudioSendParameters parameters;
1345 parameters.codecs.push_back(kOpusCodec);
1346 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001347 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1348}
1349
1350// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001351TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
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 parameters.codecs[0].bitrate = 0;
1357 parameters.codecs[0].params["useinbandfec"] = "0";
1358 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001359 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1360 webrtc::CodecInst gcodec;
1361 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1362 EXPECT_STREQ("opus", gcodec.plname);
1363 EXPECT_EQ(1, gcodec.channels);
1364 EXPECT_EQ(32000, gcodec.rate);
1365}
1366
1367// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001368TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001369 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001370 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 cricket::AudioSendParameters parameters;
1372 parameters.codecs.push_back(kOpusCodec);
1373 parameters.codecs[0].bitrate = 0;
1374 parameters.codecs[0].params["useinbandfec"] = "1";
1375 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001376 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1377 webrtc::CodecInst gcodec;
1378 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1379 EXPECT_STREQ("opus", gcodec.plname);
1380 EXPECT_EQ(1, gcodec.channels);
1381 EXPECT_EQ(32000, gcodec.rate);
1382}
1383
1384// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001385TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001386 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001387 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001388 cricket::AudioSendParameters parameters;
1389 parameters.codecs.push_back(kOpusCodec);
1390 parameters.codecs[0].bitrate = 0;
1391 parameters.codecs[0].params["stereo"] = "1";
1392 parameters.codecs[0].params["useinbandfec"] = "1";
1393 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001394 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1395 webrtc::CodecInst gcodec;
1396 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1397 EXPECT_STREQ("opus", gcodec.plname);
1398 EXPECT_EQ(2, gcodec.channels);
1399 EXPECT_EQ(64000, gcodec.rate);
1400}
1401
1402// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001403TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001404 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001405 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001406 cricket::AudioSendParameters parameters;
1407 parameters.codecs.push_back(kIsacCodec);
1408 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001409 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1410}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001411
1412// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1413TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001414 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001415 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001416 cricket::AudioSendParameters parameters;
1417 parameters.codecs.push_back(kIsacCodec);
1418 parameters.codecs[0].params["useinbandfec"] = "1";
1419 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001420 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1421}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001422
1423// Test that Opus FEC status can be changed.
1424TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001425 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001426 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001427 cricket::AudioSendParameters parameters;
1428 parameters.codecs.push_back(kOpusCodec);
1429 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001430 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001431 parameters.codecs[0].params["useinbandfec"] = "1";
1432 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001433 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1434}
1435
stefanba4c0e42016-02-04 04:12:24 -08001436TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001437 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001438 cricket::AudioSendParameters send_parameters;
1439 send_parameters.codecs.push_back(kOpusCodec);
1440 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1441 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1442
1443 cricket::AudioRecvParameters recv_parameters;
1444 recv_parameters.codecs.push_back(kIsacCodec);
1445 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1446 EXPECT_TRUE(
1447 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1448 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1449 EXPECT_FALSE(
1450 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1451
solenbergbc37fc82016-04-04 09:54:44 -07001452 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001453 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1454 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1455 EXPECT_TRUE(
1456 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1457}
1458
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001459// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1460TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001461 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001462 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001463 cricket::AudioSendParameters parameters;
1464 parameters.codecs.push_back(kOpusCodec);
1465 parameters.codecs[0].bitrate = 0;
1466 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1467 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001468 EXPECT_EQ(cricket::kOpusBandwidthNb,
1469 voe_.GetMaxEncodingBandwidth(channel_num));
1470 webrtc::CodecInst gcodec;
1471 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1472 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001473
1474 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001475 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1476 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001477 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1478 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001479}
1480
1481// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1482TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001483 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001484 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters parameters;
1486 parameters.codecs.push_back(kOpusCodec);
1487 parameters.codecs[0].bitrate = 0;
1488 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1489 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001490 EXPECT_EQ(cricket::kOpusBandwidthMb,
1491 voe_.GetMaxEncodingBandwidth(channel_num));
1492 webrtc::CodecInst gcodec;
1493 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1494 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001495
1496 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001497 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1498 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001499 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1500 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001501}
1502
1503// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1504TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001505 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001506 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001507 cricket::AudioSendParameters parameters;
1508 parameters.codecs.push_back(kOpusCodec);
1509 parameters.codecs[0].bitrate = 0;
1510 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1511 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001512 EXPECT_EQ(cricket::kOpusBandwidthWb,
1513 voe_.GetMaxEncodingBandwidth(channel_num));
1514 webrtc::CodecInst gcodec;
1515 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1516 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001517
1518 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001519 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1520 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001521 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1522 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001523}
1524
1525// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1526TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001527 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001528 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 cricket::AudioSendParameters parameters;
1530 parameters.codecs.push_back(kOpusCodec);
1531 parameters.codecs[0].bitrate = 0;
1532 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1533 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001534 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1535 voe_.GetMaxEncodingBandwidth(channel_num));
1536 webrtc::CodecInst gcodec;
1537 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1538 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001539
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001540 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001541 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1542 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001543 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1544 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001545}
1546
1547// Test 24000 < maxplaybackrate triggers Opus full band mode.
1548TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001549 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001550 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001551 cricket::AudioSendParameters parameters;
1552 parameters.codecs.push_back(kOpusCodec);
1553 parameters.codecs[0].bitrate = 0;
1554 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1555 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001556 EXPECT_EQ(cricket::kOpusBandwidthFb,
1557 voe_.GetMaxEncodingBandwidth(channel_num));
1558 webrtc::CodecInst gcodec;
1559 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1560 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001561
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001562 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001563 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1564 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001565 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1566 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001567}
1568
1569// Test Opus that without maxplaybackrate, default playback rate is used.
1570TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001571 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001572 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 cricket::AudioSendParameters parameters;
1574 parameters.codecs.push_back(kOpusCodec);
1575 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001576 EXPECT_EQ(cricket::kOpusBandwidthFb,
1577 voe_.GetMaxEncodingBandwidth(channel_num));
1578}
1579
1580// Test the with non-Opus, maxplaybackrate has no effect.
1581TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001582 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001583 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001584 cricket::AudioSendParameters parameters;
1585 parameters.codecs.push_back(kIsacCodec);
1586 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1587 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001588 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1589}
1590
1591// Test maxplaybackrate can be set on two streams.
1592TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001593 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001594 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001595 cricket::AudioSendParameters parameters;
1596 parameters.codecs.push_back(kOpusCodec);
1597 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598 // Default bandwidth is 24000.
1599 EXPECT_EQ(cricket::kOpusBandwidthFb,
1600 voe_.GetMaxEncodingBandwidth(channel_num));
1601
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001602 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001603
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001604 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001605 EXPECT_EQ(cricket::kOpusBandwidthNb,
1606 voe_.GetMaxEncodingBandwidth(channel_num));
1607
1608 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1609 channel_num = voe_.GetLastChannel();
1610 EXPECT_EQ(cricket::kOpusBandwidthNb,
1611 voe_.GetMaxEncodingBandwidth(channel_num));
1612}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001613
Minyue Li7100dcd2015-03-27 05:05:59 +01001614// Test that with usedtx=0, Opus DTX is off.
1615TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001616 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001617 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001618 cricket::AudioSendParameters parameters;
1619 parameters.codecs.push_back(kOpusCodec);
1620 parameters.codecs[0].params["usedtx"] = "0";
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001622 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1623}
1624
1625// Test that with usedtx=1, Opus DTX is on.
1626TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001627 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001628 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001629 cricket::AudioSendParameters parameters;
1630 parameters.codecs.push_back(kOpusCodec);
1631 parameters.codecs[0].params["usedtx"] = "1";
1632 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001633 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1634 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1635}
1636
1637// Test that usedtx=1 works with stereo Opus.
1638TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001639 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001640 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 cricket::AudioSendParameters parameters;
1642 parameters.codecs.push_back(kOpusCodec);
1643 parameters.codecs[0].params["usedtx"] = "1";
1644 parameters.codecs[0].params["stereo"] = "1";
1645 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001646 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1647 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1648}
1649
1650// Test that usedtx=1 does not work with non Opus.
1651TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001652 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001653 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001654 cricket::AudioSendParameters parameters;
1655 parameters.codecs.push_back(kIsacCodec);
1656 parameters.codecs[0].params["usedtx"] = "1";
1657 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001658 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1659}
1660
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001661// Test that we can switch back and forth between Opus and ISAC with CN.
1662TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001663 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001665 cricket::AudioSendParameters opus_parameters;
1666 opus_parameters.codecs.push_back(kOpusCodec);
1667 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668 webrtc::CodecInst gcodec;
1669 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001670 EXPECT_EQ(111, gcodec.pltype);
1671 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001673 cricket::AudioSendParameters isac_parameters;
1674 isac_parameters.codecs.push_back(kIsacCodec);
1675 isac_parameters.codecs.push_back(kCn16000Codec);
1676 isac_parameters.codecs.push_back(kOpusCodec);
1677 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1679 EXPECT_EQ(103, gcodec.pltype);
1680 EXPECT_STREQ("ISAC", gcodec.plname);
1681
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001684 EXPECT_EQ(111, gcodec.pltype);
1685 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686}
1687
1688// Test that we handle various ways of specifying bitrate.
1689TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001690 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001692 cricket::AudioSendParameters parameters;
1693 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1694 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695 webrtc::CodecInst gcodec;
1696 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1697 EXPECT_EQ(103, gcodec.pltype);
1698 EXPECT_STREQ("ISAC", gcodec.plname);
1699 EXPECT_EQ(32000, gcodec.rate);
1700
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001701 parameters.codecs[0].bitrate = 0; // bitrate == default
1702 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1704 EXPECT_EQ(103, gcodec.pltype);
1705 EXPECT_STREQ("ISAC", gcodec.plname);
1706 EXPECT_EQ(-1, gcodec.rate);
1707
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001708 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1709 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1711 EXPECT_EQ(103, gcodec.pltype);
1712 EXPECT_STREQ("ISAC", gcodec.plname);
1713 EXPECT_EQ(28000, gcodec.rate);
1714
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001715 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1716 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1718 EXPECT_EQ(0, gcodec.pltype);
1719 EXPECT_STREQ("PCMU", gcodec.plname);
1720 EXPECT_EQ(64000, gcodec.rate);
1721
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001722 parameters.codecs[0].bitrate = 0; // bitrate == default
1723 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001724 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1725 EXPECT_EQ(0, gcodec.pltype);
1726 EXPECT_STREQ("PCMU", gcodec.plname);
1727 EXPECT_EQ(64000, gcodec.rate);
1728
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001729 parameters.codecs[0] = kOpusCodec;
1730 parameters.codecs[0].bitrate = 0; // bitrate == default
1731 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001732 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1733 EXPECT_EQ(111, gcodec.pltype);
1734 EXPECT_STREQ("opus", gcodec.plname);
1735 EXPECT_EQ(32000, gcodec.rate);
1736}
1737
Brave Yao5225dd82015-03-26 07:39:19 +08001738// Test that we could set packet size specified in kCodecParamPTime.
1739TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001740 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001741 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001742 cricket::AudioSendParameters parameters;
1743 parameters.codecs.push_back(kOpusCodec);
1744 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1745 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001746 webrtc::CodecInst gcodec;
1747 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1748 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1749
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001750 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1751 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001752 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1753 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1754
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001755 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1756 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001757 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1758 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1759
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001760 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1761 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001763 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1764 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1765
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001766 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1767 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1768 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001769 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1770 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1771}
1772
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001773// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001775 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001776 cricket::AudioSendParameters parameters;
1777 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001778}
1779
1780// Test that we can set send codecs even with telephone-event codec as the first
1781// one on the list.
1782TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001783 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001785 cricket::AudioSendParameters parameters;
1786 parameters.codecs.push_back(kTelephoneEventCodec);
1787 parameters.codecs.push_back(kIsacCodec);
1788 parameters.codecs.push_back(kPcmuCodec);
1789 parameters.codecs[0].id = 98; // DTMF
1790 parameters.codecs[1].id = 96;
1791 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 webrtc::CodecInst gcodec;
1793 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001794 EXPECT_EQ(96, gcodec.pltype);
1795 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001796 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001797}
1798
solenberg31642aa2016-03-14 08:00:37 -07001799// Test that payload type range is limited for telephone-event codec.
1800TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001801 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001802 cricket::AudioSendParameters parameters;
1803 parameters.codecs.push_back(kTelephoneEventCodec);
1804 parameters.codecs.push_back(kIsacCodec);
1805 parameters.codecs[0].id = 0; // DTMF
1806 parameters.codecs[1].id = 96;
1807 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1808 EXPECT_TRUE(channel_->CanInsertDtmf());
1809 parameters.codecs[0].id = 128; // DTMF
1810 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1811 EXPECT_FALSE(channel_->CanInsertDtmf());
1812 parameters.codecs[0].id = 127;
1813 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1814 EXPECT_TRUE(channel_->CanInsertDtmf());
1815 parameters.codecs[0].id = -1; // DTMF
1816 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1817 EXPECT_FALSE(channel_->CanInsertDtmf());
1818}
1819
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001820// Test that we can set send codecs even with CN codec as the first
1821// one on the list.
1822TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001823 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001824 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001825 cricket::AudioSendParameters parameters;
1826 parameters.codecs.push_back(kCn16000Codec);
1827 parameters.codecs.push_back(kIsacCodec);
1828 parameters.codecs.push_back(kPcmuCodec);
1829 parameters.codecs[0].id = 98; // wideband CN
1830 parameters.codecs[1].id = 96;
1831 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001832 webrtc::CodecInst gcodec;
1833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1834 EXPECT_EQ(96, gcodec.pltype);
1835 EXPECT_STREQ("ISAC", gcodec.plname);
1836 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837}
1838
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001839// Test that we set VAD and DTMF types correctly as caller.
1840TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001841 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 cricket::AudioSendParameters parameters;
1844 parameters.codecs.push_back(kIsacCodec);
1845 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001846 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001847 parameters.codecs.push_back(kCn16000Codec);
1848 parameters.codecs.push_back(kCn8000Codec);
1849 parameters.codecs.push_back(kTelephoneEventCodec);
1850 parameters.codecs.push_back(kRedCodec);
1851 parameters.codecs[0].id = 96;
1852 parameters.codecs[2].id = 97; // wideband CN
1853 parameters.codecs[4].id = 98; // DTMF
1854 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 webrtc::CodecInst gcodec;
1856 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1857 EXPECT_EQ(96, gcodec.pltype);
1858 EXPECT_STREQ("ISAC", gcodec.plname);
1859 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001860 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001861 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1862 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001863 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001864}
1865
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001866// Test that we set VAD and DTMF types correctly as callee.
1867TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001868 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001869 cricket::AudioSendParameters parameters;
1870 parameters.codecs.push_back(kIsacCodec);
1871 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001872 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001873 parameters.codecs.push_back(kCn16000Codec);
1874 parameters.codecs.push_back(kCn8000Codec);
1875 parameters.codecs.push_back(kTelephoneEventCodec);
1876 parameters.codecs.push_back(kRedCodec);
1877 parameters.codecs[0].id = 96;
1878 parameters.codecs[2].id = 97; // wideband CN
1879 parameters.codecs[4].id = 98; // DTMF
1880 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001881 EXPECT_TRUE(channel_->AddSendStream(
1882 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001883 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001884
1885 webrtc::CodecInst gcodec;
1886 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1887 EXPECT_EQ(96, gcodec.pltype);
1888 EXPECT_STREQ("ISAC", gcodec.plname);
1889 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001890 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001891 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1892 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001893 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001894}
1895
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001896// Test that we only apply VAD if we have a CN codec that matches the
1897// send codec clockrate.
1898TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001899 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001901 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001902 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001903 parameters.codecs.push_back(kIsacCodec);
1904 parameters.codecs.push_back(kCn16000Codec);
1905 parameters.codecs[1].id = 97;
1906 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907 webrtc::CodecInst gcodec;
1908 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1909 EXPECT_STREQ("ISAC", gcodec.plname);
1910 EXPECT_TRUE(voe_.GetVAD(channel_num));
1911 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1912 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001913 parameters.codecs[0] = kPcmuCodec;
1914 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1916 EXPECT_STREQ("PCMU", gcodec.plname);
1917 EXPECT_FALSE(voe_.GetVAD(channel_num));
1918 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001919 parameters.codecs[1] = kCn8000Codec;
1920 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1922 EXPECT_STREQ("PCMU", gcodec.plname);
1923 EXPECT_TRUE(voe_.GetVAD(channel_num));
1924 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001925 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001926 parameters.codecs[0] = kIsacCodec;
1927 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001928 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1929 EXPECT_STREQ("ISAC", gcodec.plname);
1930 EXPECT_FALSE(voe_.GetVAD(channel_num));
1931}
1932
1933// Test that we perform case-insensitive matching of codec names.
1934TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001935 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001937 cricket::AudioSendParameters parameters;
1938 parameters.codecs.push_back(kIsacCodec);
1939 parameters.codecs.push_back(kPcmuCodec);
1940 parameters.codecs.push_back(kCn16000Codec);
1941 parameters.codecs.push_back(kCn8000Codec);
1942 parameters.codecs.push_back(kTelephoneEventCodec);
1943 parameters.codecs.push_back(kRedCodec);
1944 parameters.codecs[0].name = "iSaC";
1945 parameters.codecs[0].id = 96;
1946 parameters.codecs[2].id = 97; // wideband CN
1947 parameters.codecs[4].id = 98; // DTMF
1948 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 webrtc::CodecInst gcodec;
1950 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1951 EXPECT_EQ(96, gcodec.pltype);
1952 EXPECT_STREQ("ISAC", gcodec.plname);
1953 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001954 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1956 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001957 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958}
1959
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001960// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001961TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001962 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001964 cricket::AudioSendParameters parameters;
1965 parameters.codecs.push_back(kRedCodec);
1966 parameters.codecs.push_back(kIsacCodec);
1967 parameters.codecs.push_back(kPcmuCodec);
1968 parameters.codecs[0].id = 127;
1969 parameters.codecs[0].params[""] = "96/96";
1970 parameters.codecs[1].id = 96;
1971 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 webrtc::CodecInst gcodec;
1973 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1974 EXPECT_EQ(96, gcodec.pltype);
1975 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001976 EXPECT_TRUE(voe_.GetRED(channel_num));
1977 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978}
1979
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001980// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001981TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001982 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001983 cricket::AudioSendParameters parameters;
1984 parameters.codecs.push_back(kRedCodec);
1985 parameters.codecs.push_back(kIsacCodec);
1986 parameters.codecs.push_back(kPcmuCodec);
1987 parameters.codecs[0].id = 127;
1988 parameters.codecs[0].params[""] = "96/96";
1989 parameters.codecs[1].id = 96;
1990 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001991 EXPECT_TRUE(channel_->AddSendStream(
1992 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001993 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001994 webrtc::CodecInst gcodec;
1995 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1996 EXPECT_EQ(96, gcodec.pltype);
1997 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001998 EXPECT_TRUE(voe_.GetRED(channel_num));
1999 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002000}
2001
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002002// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002003TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002004 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002005 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002006 cricket::AudioSendParameters parameters;
2007 parameters.codecs.push_back(kRedCodec);
2008 parameters.codecs.push_back(kIsacCodec);
2009 parameters.codecs.push_back(kPcmuCodec);
2010 parameters.codecs[0].id = 127;
2011 parameters.codecs[1].id = 96;
2012 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002013 webrtc::CodecInst gcodec;
2014 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2015 EXPECT_EQ(96, gcodec.pltype);
2016 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002017 EXPECT_TRUE(voe_.GetRED(channel_num));
2018 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002019}
2020
2021// Test that we ignore RED if the parameters aren't named the way we expect.
2022TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002023 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002024 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002025 cricket::AudioSendParameters parameters;
2026 parameters.codecs.push_back(kRedCodec);
2027 parameters.codecs.push_back(kIsacCodec);
2028 parameters.codecs.push_back(kPcmuCodec);
2029 parameters.codecs[0].id = 127;
2030 parameters.codecs[0].params["ABC"] = "96/96";
2031 parameters.codecs[1].id = 96;
2032 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002033 webrtc::CodecInst gcodec;
2034 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2035 EXPECT_EQ(96, gcodec.pltype);
2036 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002037 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002038}
2039
2040// Test that we ignore RED if it uses different primary/secondary encoding.
2041TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002042 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002043 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002044 cricket::AudioSendParameters parameters;
2045 parameters.codecs.push_back(kRedCodec);
2046 parameters.codecs.push_back(kIsacCodec);
2047 parameters.codecs.push_back(kPcmuCodec);
2048 parameters.codecs[0].id = 127;
2049 parameters.codecs[0].params[""] = "96/0";
2050 parameters.codecs[1].id = 96;
2051 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002052 webrtc::CodecInst gcodec;
2053 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2054 EXPECT_EQ(96, gcodec.pltype);
2055 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002056 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002057}
2058
2059// Test that we ignore RED if it uses more than 2 encodings.
2060TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002061 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002063 cricket::AudioSendParameters parameters;
2064 parameters.codecs.push_back(kRedCodec);
2065 parameters.codecs.push_back(kIsacCodec);
2066 parameters.codecs.push_back(kPcmuCodec);
2067 parameters.codecs[0].id = 127;
2068 parameters.codecs[0].params[""] = "96/96/96";
2069 parameters.codecs[1].id = 96;
2070 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002071 webrtc::CodecInst gcodec;
2072 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2073 EXPECT_EQ(96, gcodec.pltype);
2074 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002075 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002076}
2077
2078// Test that we ignore RED if it has bogus codec ids.
2079TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002080 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002081 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002082 cricket::AudioSendParameters parameters;
2083 parameters.codecs.push_back(kRedCodec);
2084 parameters.codecs.push_back(kIsacCodec);
2085 parameters.codecs.push_back(kPcmuCodec);
2086 parameters.codecs[0].id = 127;
2087 parameters.codecs[0].params[""] = "ABC/ABC";
2088 parameters.codecs[1].id = 96;
2089 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090 webrtc::CodecInst gcodec;
2091 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2092 EXPECT_EQ(96, gcodec.pltype);
2093 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002094 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002095}
2096
2097// Test that we ignore RED if it refers to a codec that is not present.
2098TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002099 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002100 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002101 cricket::AudioSendParameters parameters;
2102 parameters.codecs.push_back(kRedCodec);
2103 parameters.codecs.push_back(kIsacCodec);
2104 parameters.codecs.push_back(kPcmuCodec);
2105 parameters.codecs[0].id = 127;
2106 parameters.codecs[0].params[""] = "97/97";
2107 parameters.codecs[1].id = 96;
2108 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002109 webrtc::CodecInst gcodec;
2110 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2111 EXPECT_EQ(96, gcodec.pltype);
2112 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002113 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114}
2115
stefanba4c0e42016-02-04 04:12:24 -08002116class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2117 public:
2118 WebRtcVoiceEngineWithSendSideBweTest()
2119 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2120};
2121
2122TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2123 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002124 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002125 ASSERT_FALSE(capabilities.header_extensions.empty());
2126 for (const cricket::RtpHeaderExtension& extension :
2127 capabilities.header_extensions) {
2128 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2129 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2130 extension.id);
2131 return;
2132 }
2133 }
2134 FAIL() << "Transport sequence number extension not in header-extension list.";
2135}
2136
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002137// Test support for audio level header extension.
2138TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2139 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002140}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002141TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2142 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2143}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002144
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002145// Test support for absolute send time header extension.
2146TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2147 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2148}
2149TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2150 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002151}
2152
solenberg1ac56142015-10-13 03:58:19 -07002153// Test that we can create a channel and start sending on it.
2154TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002155 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002156 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002157 channel_->SetSend(true);
2158 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2159 channel_->SetSend(false);
2160 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2161}
2162
2163// Test that a channel will send if and only if it has a source and is enabled
2164// for sending.
2165TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002166 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002167 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2168 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2169 channel_->SetSend(true);
2170 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2171 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2172 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2173 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2174 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002175}
2176
solenberg6d6e7c52016-04-13 09:07:30 -07002177// Test that SetSendParameters() does not alter a stream's send state.
2178TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2179 EXPECT_TRUE(SetupSendStream());
2180 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2181
2182 // Turn on sending.
2183 channel_->SetSend(true);
2184 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2185
2186 // Changing RTP header extensions will recreate the AudioSendStream.
2187 send_parameters_.extensions.push_back(
2188 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2189 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2190 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2191
2192 // Turn off sending.
2193 channel_->SetSend(false);
2194 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2195
2196 // Changing RTP header extensions will recreate the AudioSendStream.
2197 send_parameters_.extensions.clear();
2198 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2199 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2200}
2201
solenberg1ac56142015-10-13 03:58:19 -07002202// Test that we can create a channel and start playing out on it.
2203TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002204 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002205 int channel_num = voe_.GetLastChannel();
2206 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2207 EXPECT_TRUE(channel_->SetPlayout(true));
2208 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209 EXPECT_TRUE(channel_->SetPlayout(false));
2210 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2211}
2212
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213// Test that we can add and remove send streams.
2214TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2215 SetupForMultiSendStream();
2216
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002217 // Set the global state for sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002218 channel_->SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002219
solenbergc96df772015-10-21 13:01:53 -07002220 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002221 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002222 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002223 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002224 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002225 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002226 }
tfarina5237aaf2015-11-10 23:44:30 -08002227 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002228
solenbergc96df772015-10-21 13:01:53 -07002229 // Delete the send streams.
2230 for (uint32_t ssrc : kSsrcs4) {
2231 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002232 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002233 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002234 }
solenbergc96df772015-10-21 13:01:53 -07002235 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002236}
2237
2238// Test SetSendCodecs correctly configure the codecs in all send streams.
2239TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2240 SetupForMultiSendStream();
2241
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002242 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002243 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002244 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002245 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002246 }
2247
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002248 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002249 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002250 parameters.codecs.push_back(kIsacCodec);
2251 parameters.codecs.push_back(kCn16000Codec);
2252 parameters.codecs[1].id = 97;
2253 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002254
2255 // Verify ISAC and VAD are corrected configured on all send channels.
2256 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002257 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002258 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2260 EXPECT_STREQ("ISAC", gcodec.plname);
2261 EXPECT_TRUE(voe_.GetVAD(channel_num));
2262 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2263 }
2264
2265 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002266 parameters.codecs[0] = kPcmuCodec;
2267 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002268 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002269 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002270 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2271 EXPECT_STREQ("PCMU", gcodec.plname);
2272 EXPECT_FALSE(voe_.GetVAD(channel_num));
2273 }
2274}
2275
2276// Test we can SetSend on all send streams correctly.
2277TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2278 SetupForMultiSendStream();
2279
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002280 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002281 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002283 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002284 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2285 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002286 }
2287
2288 // Set the global state for starting sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002289 channel_->SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002290 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002291 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002292 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002293 }
2294
2295 // Set the global state for stopping sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002296 channel_->SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002297 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002298 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002299 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002300 }
2301}
2302
2303// Test we can set the correct statistics on all send streams.
2304TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2305 SetupForMultiSendStream();
2306
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002307 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002308 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002309 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002310 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002311 }
solenberg85a04962015-10-27 03:35:21 -07002312 SetAudioSendStreamStats();
2313
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002314 // Create a receive stream to check that none of the send streams end up in
2315 // the receive stream stats.
2316 EXPECT_TRUE(channel_->AddRecvStream(
2317 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002318 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002319 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2320 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002321
solenberg85a04962015-10-27 03:35:21 -07002322 // Check stats for the added streams.
2323 {
2324 cricket::VoiceMediaInfo info;
2325 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002326
solenberg85a04962015-10-27 03:35:21 -07002327 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002328 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002329 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002330 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002331 }
2332
2333 // We have added one receive stream. We should see empty stats.
2334 EXPECT_EQ(info.receivers.size(), 1u);
2335 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002336 }
solenberg1ac56142015-10-13 03:58:19 -07002337
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002338 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002339 {
2340 cricket::VoiceMediaInfo info;
2341 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2342 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002343 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002344 EXPECT_EQ(0u, info.receivers.size());
2345 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002346
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002347 // Deliver a new packet - a default receive stream should be created and we
2348 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002349 {
2350 cricket::VoiceMediaInfo info;
2351 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2352 SetAudioReceiveStreamStats();
2353 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002354 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002355 EXPECT_EQ(1u, info.receivers.size());
2356 VerifyVoiceReceiverInfo(info.receivers[0]);
2357 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002358}
2359
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002360// Test that we can add and remove receive streams, and do proper send/playout.
2361// We can receive on multiple streams while sending one stream.
2362TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002363 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364 int channel_num1 = voe_.GetLastChannel();
2365
solenberg1ac56142015-10-13 03:58:19 -07002366 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002367 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002369 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370
solenberg1ac56142015-10-13 03:58:19 -07002371 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002372 EXPECT_TRUE(
2373 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374 int channel_num2 = voe_.GetLastChannel();
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002375 channel_->SetSend(true);
2376 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377
solenberg1ac56142015-10-13 03:58:19 -07002378 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2380 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2381
2382 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002383 EXPECT_TRUE(
2384 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002385 int channel_num3 = voe_.GetLastChannel();
2386 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2387 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2388 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389
2390 // Stop sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002391 channel_->SetSend(false);
2392 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002393
2394 // Stop playout.
2395 EXPECT_TRUE(channel_->SetPlayout(false));
2396 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2397 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2398 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2399
solenberg1ac56142015-10-13 03:58:19 -07002400 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002401 EXPECT_TRUE(channel_->SetPlayout(true));
2402 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2403 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2404 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2405
solenberg1ac56142015-10-13 03:58:19 -07002406 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002407 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2408 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002409 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002410}
2411
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002413// and start sending on it.
2414TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002415 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002416 cricket::AudioOptions options_adjust_agc;
2417 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 webrtc::AgcConfig agc_config;
2419 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2420 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002421 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002422 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002423 channel_->SetSend(true);
2424 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2426 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002427 channel_->SetSend(false);
2428 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430}
2431
wu@webrtc.org97077a32013-10-25 21:18:33 +00002432TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002433 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002434 EXPECT_CALL(adm_,
2435 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002436 webrtc::AgcConfig agc_config;
2437 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2438 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002439 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2440 send_parameters_.options.tx_agc_digital_compression_gain =
2441 rtc::Optional<uint16_t>(9);
2442 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2443 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2444 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002445 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2446 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2447 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2448 EXPECT_TRUE(agc_config.limiterEnable);
2449
2450 // Check interaction with adjust_agc_delta. Both should be respected, for
2451 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002452 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2453 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002454 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2455 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2456}
2457
wu@webrtc.org97077a32013-10-25 21:18:33 +00002458TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002459 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002460 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2461 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002462 send_parameters_.options.recording_sample_rate =
2463 rtc::Optional<uint32_t>(48000);
2464 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2465 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002466}
2467
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002468// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002469// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002471 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002472 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002473}
2474
2475TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2476 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002477 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002478 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002479 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002480 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002481 EXPECT_TRUE(channel_->AddRecvStream(
2482 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002483 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2484 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002485
solenberg85a04962015-10-27 03:35:21 -07002486 // Check stats for the added streams.
2487 {
2488 cricket::VoiceMediaInfo info;
2489 EXPECT_EQ(true, channel_->GetStats(&info));
2490
2491 // We have added one send stream. We should see the stats we've set.
2492 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002493 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002494 // We have added one receive stream. We should see empty stats.
2495 EXPECT_EQ(info.receivers.size(), 1u);
2496 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2497 }
solenberg1ac56142015-10-13 03:58:19 -07002498
solenberg566ef242015-11-06 15:34:49 -08002499 // Start sending - this affects some reported stats.
2500 {
2501 cricket::VoiceMediaInfo info;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002502 channel_->SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002503 EXPECT_EQ(true, channel_->GetStats(&info));
2504 VerifyVoiceSenderInfo(info.senders[0], true);
2505 }
2506
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002507 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002508 {
2509 cricket::VoiceMediaInfo info;
2510 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2511 EXPECT_EQ(true, channel_->GetStats(&info));
2512 EXPECT_EQ(1u, info.senders.size());
2513 EXPECT_EQ(0u, info.receivers.size());
2514 }
solenberg1ac56142015-10-13 03:58:19 -07002515
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002516 // Deliver a new packet - a default receive stream should be created and we
2517 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002518 {
2519 cricket::VoiceMediaInfo info;
2520 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2521 SetAudioReceiveStreamStats();
2522 EXPECT_EQ(true, channel_->GetStats(&info));
2523 EXPECT_EQ(1u, info.senders.size());
2524 EXPECT_EQ(1u, info.receivers.size());
2525 VerifyVoiceReceiverInfo(info.receivers[0]);
2526 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002527}
2528
2529// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002530// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002531TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002532 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002533 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002534 EXPECT_TRUE(channel_->AddRecvStream(
2535 cricket::StreamParams::CreateLegacy(kSsrc2)));
2536 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537}
2538
2539// Test that the local SSRC is the same on sending and receiving channels if the
2540// receive channel is created before the send channel.
2541TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002542 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002543 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2544 int receive_channel_num = voe_.GetLastChannel();
2545 EXPECT_TRUE(channel_->AddSendStream(
2546 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547
solenberg3a941542015-11-16 07:34:50 -08002548 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002549 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550}
2551
2552// Test that we can properly receive packets.
2553TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002554 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002555 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002557 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002558 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559}
2560
2561// Test that we can properly receive packets on multiple streams.
2562TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002563 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002564 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2565 int channel_num1 = voe_.GetLastChannel();
2566 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2567 int channel_num2 = voe_.GetLastChannel();
2568 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2569 int channel_num3 = voe_.GetLastChannel();
2570 // Create packets with the right SSRCs.
2571 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002572 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002574 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002575 }
2576 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2577 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2578 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002579
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580 DeliverPacket(packets[0], sizeof(packets[0]));
2581 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2582 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2583 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002584
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002585 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002586 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002587 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[2], sizeof(packets[2]));
2591 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002592 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002593 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002594
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595 DeliverPacket(packets[3], sizeof(packets[3]));
2596 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2597 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002598 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2599
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2601 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2602 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2603}
2604
solenberg7e63ef02015-11-20 00:19:43 -08002605// Test that receiving on an unsignalled stream works (default channel will be
2606// created).
2607TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002608 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002609 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2610 int channel_num = voe_.GetLastChannel();
2611 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2612}
2613
2614// Test that receiving on an unsignalled stream works (default channel will be
2615// created), and that packets will be forwarded to the default channel
2616// regardless of their SSRCs.
2617TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002618 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002619 char packet[sizeof(kPcmuFrame)];
2620 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2621
2622 // Note that the first unknown SSRC cannot be 0, because we only support
2623 // creating receive streams for SSRC!=0.
2624 DeliverPacket(packet, sizeof(packet));
2625 int channel_num = voe_.GetLastChannel();
2626 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2627 // Once we have the default channel, SSRC==0 will be ok.
2628 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2629 rtc::SetBE32(&packet[8], ssrc);
2630 DeliverPacket(packet, sizeof(packet));
2631 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2632 }
2633}
2634
2635// Test that a default channel is created even after a signalled stream has been
2636// added, and that this stream will get any packets for unknown SSRCs.
2637TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002638 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002639 char packet[sizeof(kPcmuFrame)];
2640 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2641
2642 // Add a known stream, send packet and verify we got it.
2643 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2644 int signalled_channel_num = voe_.GetLastChannel();
2645 DeliverPacket(packet, sizeof(packet));
2646 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2647
2648 // Note that the first unknown SSRC cannot be 0, because we only support
2649 // creating receive streams for SSRC!=0.
2650 rtc::SetBE32(&packet[8], 7011);
2651 DeliverPacket(packet, sizeof(packet));
2652 int channel_num = voe_.GetLastChannel();
2653 EXPECT_NE(channel_num, signalled_channel_num);
2654 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2655 // Once we have the default channel, SSRC==0 will be ok.
2656 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2657 rtc::SetBE32(&packet[8], ssrc);
2658 DeliverPacket(packet, sizeof(packet));
2659 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2660 }
2661}
2662
solenberg0a617e22015-10-20 15:49:38 -07002663// Test that we properly handle failures to add a receive stream.
2664TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002665 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002666 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002668}
2669
solenberg0a617e22015-10-20 15:49:38 -07002670// Test that we properly handle failures to add a send stream.
2671TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002672 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002673 voe_.set_fail_create_channel(true);
2674 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2675}
2676
solenberg1ac56142015-10-13 03:58:19 -07002677// Test that AddRecvStream creates new stream.
2678TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002679 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680 int channel_num = voe_.GetLastChannel();
2681 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002682 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002683}
2684
2685// Test that after adding a recv stream, we do not decode more codecs than
2686// those previously passed into SetRecvCodecs.
2687TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002688 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002689 cricket::AudioRecvParameters parameters;
2690 parameters.codecs.push_back(kIsacCodec);
2691 parameters.codecs.push_back(kPcmuCodec);
2692 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693 EXPECT_TRUE(channel_->AddRecvStream(
2694 cricket::StreamParams::CreateLegacy(kSsrc1)));
2695 int channel_num2 = voe_.GetLastChannel();
2696 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002697 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002698 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002699 gcodec.channels = 2;
2700 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2701}
2702
2703// Test that we properly clean up any streams that were added, even if
2704// not explicitly removed.
2705TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002706 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002707 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002708 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2709 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2710 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2711 delete channel_;
2712 channel_ = NULL;
2713 EXPECT_EQ(0, voe_.GetNumChannels());
2714}
2715
wu@webrtc.org78187522013-10-07 23:32:02 +00002716TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002717 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002718 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2719}
2720
2721TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002722 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002723 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002724 // Manually delete channel to simulate a failure.
2725 int channel = voe_.GetLastChannel();
2726 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2727 // Add recv stream 2 should work.
2728 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002729 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002730 EXPECT_NE(channel, new_channel);
2731 // The last created channel is deleted too.
2732 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002733}
2734
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002735// Test the InsertDtmf on default send stream as caller.
2736TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2737 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002738}
2739
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002740// Test the InsertDtmf on default send stream as callee
2741TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2742 TestInsertDtmf(0, false);
2743}
2744
2745// Test the InsertDtmf on specified send stream as caller.
2746TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2747 TestInsertDtmf(kSsrc1, true);
2748}
2749
2750// Test the InsertDtmf on specified send stream as callee.
2751TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2752 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002753}
2754
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002756 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002757 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002758 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002759 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2760 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2761 EXPECT_TRUE(channel_->SetPlayout(true));
2762 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2763 EXPECT_TRUE(channel_->SetPlayout(false));
2764 EXPECT_FALSE(channel_->SetPlayout(true));
2765}
2766
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002768 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002769 EXPECT_CALL(adm_,
2770 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2771 EXPECT_CALL(adm_,
2772 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2773 EXPECT_CALL(adm_,
2774 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002775 bool ec_enabled;
2776 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777 webrtc::AecmModes aecm_mode;
2778 bool cng_enabled;
2779 bool agc_enabled;
2780 webrtc::AgcModes agc_mode;
2781 webrtc::AgcConfig agc_config;
2782 bool ns_enabled;
2783 webrtc::NsModes ns_mode;
2784 bool highpass_filter_enabled;
2785 bool stereo_swapping_enabled;
2786 bool typing_detection_enabled;
2787 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002788 voe_.GetAecmMode(aecm_mode, cng_enabled);
2789 voe_.GetAgcStatus(agc_enabled, agc_mode);
2790 voe_.GetAgcConfig(agc_config);
2791 voe_.GetNsStatus(ns_enabled, ns_mode);
2792 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2793 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2794 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2795 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002796 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002797 EXPECT_FALSE(cng_enabled);
2798 EXPECT_TRUE(agc_enabled);
2799 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2800 EXPECT_TRUE(ns_enabled);
2801 EXPECT_TRUE(highpass_filter_enabled);
2802 EXPECT_FALSE(stereo_swapping_enabled);
2803 EXPECT_TRUE(typing_detection_enabled);
2804 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2805 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002806 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2807 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002808
solenberg246b8172015-12-08 09:50:23 -08002809 // Nothing set in AudioOptions, so everything should be as default.
2810 send_parameters_.options = cricket::AudioOptions();
2811 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002812 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002813 voe_.GetAecmMode(aecm_mode, cng_enabled);
2814 voe_.GetAgcStatus(agc_enabled, agc_mode);
2815 voe_.GetAgcConfig(agc_config);
2816 voe_.GetNsStatus(ns_enabled, ns_mode);
2817 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2818 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2819 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2820 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002821 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822 EXPECT_FALSE(cng_enabled);
2823 EXPECT_TRUE(agc_enabled);
2824 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2825 EXPECT_TRUE(ns_enabled);
2826 EXPECT_TRUE(highpass_filter_enabled);
2827 EXPECT_FALSE(stereo_swapping_enabled);
2828 EXPECT_TRUE(typing_detection_enabled);
2829 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2830 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002831 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2832 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002833
2834 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002835 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2836 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002837 voe_.GetEcStatus(ec_enabled, ec_mode);
2838 EXPECT_FALSE(ec_enabled);
2839
2840 // Turn echo cancellation back on, with settings, and make sure
2841 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002842 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2843 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002844 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845 voe_.GetAecmMode(aecm_mode, cng_enabled);
2846 voe_.GetAgcStatus(agc_enabled, agc_mode);
2847 voe_.GetAgcConfig(agc_config);
2848 voe_.GetNsStatus(ns_enabled, ns_mode);
2849 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2850 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2851 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2852 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002853 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002854 EXPECT_TRUE(agc_enabled);
2855 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2856 EXPECT_TRUE(ns_enabled);
2857 EXPECT_TRUE(highpass_filter_enabled);
2858 EXPECT_FALSE(stereo_swapping_enabled);
2859 EXPECT_TRUE(typing_detection_enabled);
2860 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2861 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2862
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002863 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2864 // control.
solenberg246b8172015-12-08 09:50:23 -08002865 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2866 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002867 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002868 voe_.GetAecmMode(aecm_mode, cng_enabled);
2869 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002870 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002871 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2872
2873 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002874 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2875 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2876 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2877 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002878 voe_.GetEcStatus(ec_enabled, ec_mode);
2879 EXPECT_FALSE(ec_enabled);
2880 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002881 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2882 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002883 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002884 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002885 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002886 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2887
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002888 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002889 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2890 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002891 voe_.GetAgcStatus(agc_enabled, agc_mode);
2892 EXPECT_FALSE(agc_enabled);
2893
2894 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002895 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2896 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2897 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 voe_.GetAgcStatus(agc_enabled, agc_mode);
2899 EXPECT_TRUE(agc_enabled);
2900 voe_.GetAgcConfig(agc_config);
2901 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2902
2903 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002904 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2905 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2906 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2907 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2908 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909 voe_.GetNsStatus(ns_enabled, ns_mode);
2910 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2911 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2912 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2913 EXPECT_FALSE(ns_enabled);
2914 EXPECT_FALSE(highpass_filter_enabled);
2915 EXPECT_FALSE(typing_detection_enabled);
2916 EXPECT_TRUE(stereo_swapping_enabled);
2917
solenberg1ac56142015-10-13 03:58:19 -07002918 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002919 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002920 voe_.GetEcStatus(ec_enabled, ec_mode);
2921 voe_.GetNsStatus(ns_enabled, ns_mode);
2922 EXPECT_TRUE(ec_enabled);
2923 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2924 EXPECT_FALSE(ns_enabled);
2925 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2926}
2927
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002928TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002929 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930
2931 bool ec_enabled;
2932 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933 bool agc_enabled;
2934 webrtc::AgcModes agc_mode;
2935 bool ns_enabled;
2936 webrtc::NsModes ns_mode;
2937 bool highpass_filter_enabled;
2938 bool stereo_swapping_enabled;
2939 bool typing_detection_enabled;
2940
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942 voe_.GetAgcStatus(agc_enabled, agc_mode);
2943 voe_.GetNsStatus(ns_enabled, ns_mode);
2944 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2945 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2946 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2947 EXPECT_TRUE(ec_enabled);
2948 EXPECT_TRUE(agc_enabled);
2949 EXPECT_TRUE(ns_enabled);
2950 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002951 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002952 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953}
2954
2955TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2956 webrtc::AgcConfig set_config = {0};
2957 set_config.targetLeveldBOv = 3;
2958 set_config.digitalCompressionGaindB = 9;
2959 set_config.limiterEnable = true;
2960 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002961
2962 webrtc::AgcConfig config = {0};
2963 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2964 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2965 EXPECT_EQ(set_config.digitalCompressionGaindB,
2966 config.digitalCompressionGaindB);
2967 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2968}
2969
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002970TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002971 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002972 EXPECT_CALL(adm_,
2973 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2974 EXPECT_CALL(adm_,
2975 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2976 EXPECT_CALL(adm_,
2977 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2978
kwiberg686a8ef2016-02-26 03:00:35 -08002979 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002980 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002981 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002982 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002983 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002984 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002985
2986 // Have to add a stream to make SetSend work.
2987 cricket::StreamParams stream1;
2988 stream1.ssrcs.push_back(1);
2989 channel1->AddSendStream(stream1);
2990 cricket::StreamParams stream2;
2991 stream2.ssrcs.push_back(2);
2992 channel2->AddSendStream(stream2);
2993
2994 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002995 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002996 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2997 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2998 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002999 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3000 EXPECT_EQ(parameters_options_all.options, channel1->options());
3001 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3002 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003
3004 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003005 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003006 parameters_options_no_ns.options.noise_suppression =
3007 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003008 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3009 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003010 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3011 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3012 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003013 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003014
3015 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003016 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003017 parameters_options_no_agc.options.auto_gain_control =
3018 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003019 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
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>(false);
3022 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003023 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003024
solenberg246b8172015-12-08 09:50:23 -08003025 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003026 bool ec_enabled;
3027 webrtc::EcModes ec_mode;
3028 bool agc_enabled;
3029 webrtc::AgcModes agc_mode;
3030 bool ns_enabled;
3031 webrtc::NsModes ns_mode;
3032 voe_.GetEcStatus(ec_enabled, ec_mode);
3033 voe_.GetAgcStatus(agc_enabled, agc_mode);
3034 voe_.GetNsStatus(ns_enabled, ns_mode);
3035 EXPECT_TRUE(ec_enabled);
3036 EXPECT_TRUE(agc_enabled);
3037 EXPECT_TRUE(ns_enabled);
3038
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003039 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003040 voe_.GetEcStatus(ec_enabled, ec_mode);
3041 voe_.GetAgcStatus(agc_enabled, agc_mode);
3042 voe_.GetNsStatus(ns_enabled, ns_mode);
3043 EXPECT_TRUE(ec_enabled);
3044 EXPECT_TRUE(agc_enabled);
3045 EXPECT_FALSE(ns_enabled);
3046
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003047 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003048 voe_.GetEcStatus(ec_enabled, ec_mode);
3049 voe_.GetAgcStatus(agc_enabled, agc_mode);
3050 voe_.GetNsStatus(ns_enabled, ns_mode);
3051 EXPECT_TRUE(ec_enabled);
3052 EXPECT_FALSE(agc_enabled);
3053 EXPECT_TRUE(ns_enabled);
3054
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003055 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003056 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003057 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3058 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003059 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003060 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003061 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003062 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003063 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003064 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003065 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3066 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3067 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003068 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003069 voe_.GetEcStatus(ec_enabled, ec_mode);
3070 voe_.GetAgcStatus(agc_enabled, agc_mode);
3071 voe_.GetNsStatus(ns_enabled, ns_mode);
3072 EXPECT_TRUE(ec_enabled);
3073 EXPECT_FALSE(agc_enabled);
3074 EXPECT_FALSE(ns_enabled);
3075}
3076
wu@webrtc.orgde305012013-10-31 15:40:38 +00003077// This test verifies DSCP settings are properly applied on voice media channel.
3078TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003079 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003080 cricket::FakeNetworkInterface network_interface;
3081 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003082 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003083
solenbergbc37fc82016-04-04 09:54:44 -07003084 channel.reset(
3085 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003086 channel->SetInterface(&network_interface);
3087 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3088 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3089
3090 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003091 channel.reset(
3092 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003093 channel->SetInterface(&network_interface);
3094 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3095
3096 // Verify that setting the option to false resets the
3097 // DiffServCodePoint.
3098 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003099 channel.reset(
3100 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003101 channel->SetInterface(&network_interface);
3102 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3103 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3104
3105 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003106}
3107
solenberg1ac56142015-10-13 03:58:19 -07003108TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003109 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003110 cricket::WebRtcVoiceMediaChannel* media_channel =
3111 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003112 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3113 EXPECT_TRUE(channel_->AddRecvStream(
3114 cricket::StreamParams::CreateLegacy(kSsrc1)));
3115 int channel_id = voe_.GetLastChannel();
3116 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3117 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3118 EXPECT_TRUE(channel_->AddRecvStream(
3119 cricket::StreamParams::CreateLegacy(kSsrc2)));
3120 int channel_id2 = voe_.GetLastChannel();
3121 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003122}
3123
solenberg1ac56142015-10-13 03:58:19 -07003124TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003125 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003126 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003127 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3128 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3129 EXPECT_TRUE(channel_->AddSendStream(
3130 cricket::StreamParams::CreateLegacy(kSsrc1)));
3131 int channel_id = voe_.GetLastChannel();
3132 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3133 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3134 EXPECT_TRUE(channel_->AddSendStream(
3135 cricket::StreamParams::CreateLegacy(kSsrc2)));
3136 int channel_id2 = voe_.GetLastChannel();
3137 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003138}
3139
solenberg4bac9c52015-10-09 02:32:53 -07003140TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003141 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003142 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003143 cricket::StreamParams stream;
3144 stream.ssrcs.push_back(kSsrc2);
3145 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003146 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003147 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003148 float scale = 0;
3149 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3150 EXPECT_DOUBLE_EQ(3, scale);
3151}
3152
3153TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003154 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003155 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3156 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3157 int channel_id = voe_.GetLastChannel();
3158 float scale = 0;
3159 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3160 EXPECT_DOUBLE_EQ(2, scale);
3161 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003162 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003163 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003164}
3165
pbos8fc7fa72015-07-15 08:02:58 -07003166TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003167 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003168 const std::string kSyncLabel = "AvSyncLabel";
3169
solenbergff976312016-03-30 23:28:51 -07003170 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003171 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3172 sp.sync_label = kSyncLabel;
3173 // Creating two channels to make sure that sync label is set properly for both
3174 // the default voice channel and following ones.
3175 EXPECT_TRUE(channel_->AddRecvStream(sp));
3176 sp.ssrcs[0] += 1;
3177 EXPECT_TRUE(channel_->AddRecvStream(sp));
3178
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003179 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003180 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003181 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003182 << "SyncGroup should be set based on sync_label";
3183 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003184 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003185 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003186}
3187
solenberg3a941542015-11-16 07:34:50 -08003188// TODO(solenberg): Remove, once recv streams are configured through Call.
3189// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003190TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003191 // Test that setting the header extensions results in the expected state
3192 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003193 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003194 ssrcs.push_back(223);
3195 ssrcs.push_back(224);
3196
solenbergff976312016-03-30 23:28:51 -07003197 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003198 cricket::WebRtcVoiceMediaChannel* media_channel =
3199 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003200 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003201 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003202 EXPECT_TRUE(media_channel->AddRecvStream(
3203 cricket::StreamParams::CreateLegacy(ssrc)));
3204 }
3205
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003206 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003207 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003208 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003209 EXPECT_NE(nullptr, s);
3210 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3211 }
3212
3213 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003214 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003215 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003216 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003217 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003218 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003219 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003220 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003221 EXPECT_NE(nullptr, s);
3222 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003223 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3224 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003225 for (const auto& s_ext : s_exts) {
3226 if (e_ext.id == s_ext.id) {
3227 EXPECT_EQ(e_ext.uri, s_ext.name);
3228 }
3229 }
3230 }
3231 }
3232
3233 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003234 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003235 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003236 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003237 EXPECT_NE(nullptr, s);
3238 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3239 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003240}
3241
3242TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3243 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003244 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003245 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003246 static const unsigned char kRtcp[] = {
3247 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3248 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3251 };
jbaucheec21bd2016-03-20 06:15:43 -07003252 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003253
solenbergff976312016-03-30 23:28:51 -07003254 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003255 cricket::WebRtcVoiceMediaChannel* media_channel =
3256 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003257 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003258 EXPECT_TRUE(media_channel->AddRecvStream(
3259 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3260
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003261 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003262 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003263 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003264 EXPECT_EQ(0, s->received_packets());
3265 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3266 EXPECT_EQ(1, s->received_packets());
3267 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3268 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003269}
Minyue2013aec2015-05-13 14:14:42 +02003270
solenberg0a617e22015-10-20 15:49:38 -07003271// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003272// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003273TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003274 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003275 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003276 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003277 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3278 int recv_ch = voe_.GetLastChannel();
3279 EXPECT_NE(recv_ch, default_channel);
3280 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3281 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3282 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003283 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3284 recv_ch = voe_.GetLastChannel();
3285 EXPECT_NE(recv_ch, default_channel);
3286 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003287}
3288
3289TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003290 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003291 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003292
3293 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3294 int recv_ch = voe_.GetLastChannel();
3295
3296 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3297 int send_ch = voe_.GetLastChannel();
3298
3299 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3300 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3301 // channel of |recv_ch|.This is not a common case, since, normally, only the
3302 // default channel can be associated. However, the default is not deletable.
3303 // So we force the |recv_ch| to associate with a non-default channel.
3304 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3305 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3306
3307 EXPECT_TRUE(channel_->RemoveSendStream(2));
3308 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3309}
stefan658910c2015-09-03 05:48:32 -07003310
deadbeef884f5852016-01-15 09:20:04 -08003311TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003312 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003313 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3314 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003315
3316 // Setting the sink before a recv stream exists should do nothing.
3317 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3318 EXPECT_TRUE(
3319 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3320 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3321
3322 // Now try actually setting the sink.
3323 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3324 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3325
3326 // Now try resetting it.
3327 channel_->SetRawAudioSink(kSsrc1, nullptr);
3328 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3329}
3330
3331TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003332 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003333 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3334 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003335
3336 // Should be able to set a default sink even when no stream exists.
3337 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3338
3339 // Create default channel and ensure it's assigned the default sink.
3340 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3341 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3342
3343 // Try resetting the default sink.
3344 channel_->SetRawAudioSink(0, nullptr);
3345 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3346
3347 // Try setting the default sink while the default stream exists.
3348 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3349 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3350
3351 // If we remove and add a default stream, it should get the same sink.
3352 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3353 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3354 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3355}
3356
skvlad7a43d252016-03-22 15:32:27 -07003357// Test that, just like the video channel, the voice channel communicates the
3358// network state to the call.
3359TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003360 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003361
3362 EXPECT_EQ(webrtc::kNetworkUp,
3363 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3364 EXPECT_EQ(webrtc::kNetworkUp,
3365 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3366
3367 channel_->OnReadyToSend(false);
3368 EXPECT_EQ(webrtc::kNetworkDown,
3369 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3370 EXPECT_EQ(webrtc::kNetworkUp,
3371 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3372
3373 channel_->OnReadyToSend(true);
3374 EXPECT_EQ(webrtc::kNetworkUp,
3375 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3376 EXPECT_EQ(webrtc::kNetworkUp,
3377 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3378}
3379
stefan658910c2015-09-03 05:48:32 -07003380// Tests that the library initializes and shuts down properly.
3381TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003382 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003383 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003384 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003385 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3386 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003387 EXPECT_TRUE(channel != nullptr);
3388 delete channel;
solenbergff976312016-03-30 23:28:51 -07003389}
stefan658910c2015-09-03 05:48:32 -07003390
solenbergff976312016-03-30 23:28:51 -07003391// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003392TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3393 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3394 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3395 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003396 {
3397 cricket::WebRtcVoiceEngine engine(&adm);
3398 std::unique_ptr<webrtc::Call> call(
3399 webrtc::Call::Create(webrtc::Call::Config()));
3400 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3401 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3402 EXPECT_TRUE(channel != nullptr);
3403 delete channel;
3404 }
stefan658910c2015-09-03 05:48:32 -07003405}
3406
3407// Tests that the library is configured with the codecs we want.
3408TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003409 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003410 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003411 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003412 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003413 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003414 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003415 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003416 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003417 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003418 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003419 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003420 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003421 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003422 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003423 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003424 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003425 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003426 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003427 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003428 cricket::AudioCodec(96, "red", 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, "CN", 32000, 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, "CN", 16000, 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, "CN", 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, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003437 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003438 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003439 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003440 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003441 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003442 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003443 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003444 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003445 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003446 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003447 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003448 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003449 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003450 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003451 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003452 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003453 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003454 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003455 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003456 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003457 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003458 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003459 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003460
stefan658910c2015-09-03 05:48:32 -07003461 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003462 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003463 for (std::vector<cricket::AudioCodec>::const_iterator it =
3464 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3465 if (it->name == "CN" && it->clockrate == 16000) {
3466 EXPECT_EQ(105, it->id);
3467 } else if (it->name == "CN" && it->clockrate == 32000) {
3468 EXPECT_EQ(106, it->id);
3469 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3470 EXPECT_EQ(103, it->id);
3471 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3472 EXPECT_EQ(104, it->id);
3473 } else if (it->name == "G722" && it->clockrate == 8000) {
3474 EXPECT_EQ(9, it->id);
3475 } else if (it->name == "telephone-event") {
3476 EXPECT_EQ(126, it->id);
3477 } else if (it->name == "red") {
3478 EXPECT_EQ(127, it->id);
3479 } else if (it->name == "opus") {
3480 EXPECT_EQ(111, it->id);
3481 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3482 EXPECT_EQ("10", it->params.find("minptime")->second);
3483 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3484 EXPECT_EQ("60", it->params.find("maxptime")->second);
3485 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3486 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3487 }
3488 }
stefan658910c2015-09-03 05:48:32 -07003489}
3490
3491// Tests that VoE supports at least 32 channels
3492TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003493 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003494 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003495 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003496
3497 cricket::VoiceMediaChannel* channels[32];
3498 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003499 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003500 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3501 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003502 if (!channel)
3503 break;
stefan658910c2015-09-03 05:48:32 -07003504 channels[num_channels++] = channel;
3505 }
3506
tfarina5237aaf2015-11-10 23:44:30 -08003507 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003508 EXPECT_EQ(expected, num_channels);
3509
3510 while (num_channels > 0) {
3511 delete channels[--num_channels];
3512 }
stefan658910c2015-09-03 05:48:32 -07003513}
3514
3515// Test that we set our preferred codecs properly.
3516TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003517 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003518 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003519 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003520 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3521 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003522 cricket::AudioRecvParameters parameters;
3523 parameters.codecs = engine.codecs();
3524 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003525}