blob: e5af99fca7fbbcea92563a1c163cbeaa71d66adc [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakenetworkinterface.h"
22#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080023#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
solenbergbc37fc82016-04-04 09:54:44 -070027#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000029using cricket::kRtpAudioLevelHeaderExtension;
30using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
deadbeef67cf2c12016-04-13 10:07:16 -070036const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
44const cricket::AudioCodec kTelephoneEventCodec(106,
45 "telephone-event",
46 8000,
47 0,
48 1);
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080050const uint32_t kSsrc2 = 2;
51const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070052const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053
54class FakeVoEWrapper : public cricket::VoEWrapper {
55 public:
56 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
57 : cricket::VoEWrapper(engine, // processing
58 engine, // base
59 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 engine) { // volume
63 }
64};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
solenbergff976312016-03-30 23:28:51 -070067// Tests that our stub library "works".
68TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070069 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
70 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
71 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070072 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
73 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070075 cricket::FakeWebRtcVoiceEngine voe;
76 EXPECT_FALSE(voe.IsInited());
77 {
solenbergbc37fc82016-04-04 09:54:44 -070078 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070079 EXPECT_TRUE(voe.IsInited());
80 }
81 EXPECT_FALSE(voe.IsInited());
82}
83
deadbeef884f5852016-01-15 09:20:04 -080084class FakeAudioSink : public webrtc::AudioSinkInterface {
85 public:
86 void OnData(const Data& audio) override {}
87};
88
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080089class FakeAudioSource : public cricket::AudioSource {
90 void SetSink(Sink* sink) override {}
91};
92
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093class WebRtcVoiceEngineTestFake : public testing::Test {
94 public:
stefanba4c0e42016-02-04 04:12:24 -080095 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
96
97 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070098 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
99 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
100 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700101 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
102 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
103 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergbc37fc82016-04-04 09:54:44 -0700104 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
105 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200106 send_parameters_.codecs.push_back(kPcmuCodec);
107 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 }
solenbergff976312016-03-30 23:28:51 -0700109 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700110 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
111 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200112 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000113 }
solenbergff976312016-03-30 23:28:51 -0700114 bool SetupRecvStream() {
115 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700116 return false;
117 }
118 return channel_->AddRecvStream(
119 cricket::StreamParams::CreateLegacy(kSsrc1));
120 }
solenbergff976312016-03-30 23:28:51 -0700121 bool SetupSendStream() {
122 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000123 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800125 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
126 return false;
127 }
128 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000130 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700131 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700132 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800133 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700134 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700135 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800136 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000137 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700139 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000140 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200142 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 }
145
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100146 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
147 const auto* send_stream = call_.GetAudioSendStream(ssrc);
148 EXPECT_TRUE(send_stream);
149 return *send_stream;
150 }
151
deadbeef884f5852016-01-15 09:20:04 -0800152 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
153 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
154 EXPECT_TRUE(recv_stream);
155 return *recv_stream;
156 }
157
solenberg3a941542015-11-16 07:34:50 -0800158 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800159 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800160 }
161
solenberg7add0582015-11-20 09:59:34 -0800162 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800163 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800164 }
165
solenbergd53a3f92016-04-14 13:56:37 -0700166 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
167 ASSERT_TRUE(channel);
168 if (enable) {
169 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
170 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
171 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
172 }
173 channel->SetSend(enable);
174 }
175
Peter Boström0c4e06b2015-10-07 12:23:21 +0200176 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700177 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000178 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700179 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000180 // send stream.
181 EXPECT_TRUE(channel_->AddSendStream(
182 cricket::StreamParams::CreateLegacy(kSsrc1)));
183 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000184
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200186 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700187 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000188 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800189 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200190 send_parameters_.codecs.push_back(kTelephoneEventCodec);
191 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000192 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000193
194 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700195 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800196 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000197 EXPECT_TRUE(channel_->AddSendStream(
198 cricket::StreamParams::CreateLegacy(kSsrc1)));
199 }
200
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800202 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000203
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100204 // Test send.
205 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
206 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
207 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800208 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100209 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
210 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
211 EXPECT_EQ(2, telephone_event.event_code);
212 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 }
214
215 // Test that send bandwidth is set correctly.
216 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000217 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
218 // |expected_result| is the expected result from SetMaxSendBandwidth().
219 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700220 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
221 int max_bitrate,
222 bool expected_result,
223 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 cricket::AudioSendParameters parameters;
225 parameters.codecs.push_back(codec);
226 parameters.max_bandwidth_bps = max_bitrate;
227 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
228
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000230 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000232 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 }
234
skvlade0d46372016-04-07 22:59:22 -0700235 // Sets the per-stream maximum bitrate limit for the specified SSRC.
236 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
237 webrtc::RtpParameters parameters = channel_->GetRtpParameters(ssrc);
238 EXPECT_EQ(1UL, parameters.encodings.size());
239
240 parameters.encodings[0].max_bitrate_bps = bitrate;
241 return channel_->SetRtpParameters(ssrc, parameters);
242 }
243
244 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
245 cricket::AudioSendParameters send_parameters;
246 send_parameters.codecs.push_back(codec);
247 send_parameters.max_bandwidth_bps = bitrate;
248 return channel_->SetSendParameters(send_parameters);
249 }
250
251 int GetCodecBitrate(int32_t ssrc) {
252 cricket::WebRtcVoiceMediaChannel* media_channel =
253 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
254 int channel = media_channel->GetSendChannelId(ssrc);
255 EXPECT_NE(-1, channel);
256 webrtc::CodecInst codec;
257 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
258 return codec.rate;
259 }
260
261 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
262 int global_max,
263 int stream_max,
264 bool expected_result,
265 int expected_codec_bitrate) {
266 // Clear the bitrate limit from the previous test case.
267 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
268
269 // Attempt to set the requested bitrate limits.
270 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
271 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
272
273 // Verify that reading back the parameters gives results
274 // consistent with the Set() result.
275 webrtc::RtpParameters resulting_parameters =
276 channel_->GetRtpParameters(kSsrc1);
277 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
278 EXPECT_EQ(expected_result ? stream_max : -1,
279 resulting_parameters.encodings[0].max_bitrate_bps);
280
281 // Verify that the codec settings have the expected bitrate.
282 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
283 }
284
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000285 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700286 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000287
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000288 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800289 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000290
291 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200292 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000293 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200294 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800295 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000296
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000297 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200298 send_parameters_.extensions.clear();
299 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800300 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000301
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000302 // Ensure extension is set properly.
303 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200304 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
305 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800306 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
307 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
308 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000309
solenberg7add0582015-11-20 09:59:34 -0800310 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000311 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700312 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800313 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
314 call_.GetAudioSendStream(kSsrc2));
315 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
316 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
317 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000318
319 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200320 send_parameters_.codecs.push_back(kPcmuCodec);
321 send_parameters_.extensions.clear();
322 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800323 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
324 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000325 }
326
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000327 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700328 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000329
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000330 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800331 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000332
333 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800334 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000335 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800336 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
337 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000338
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000339 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800340 recv_parameters_.extensions.clear();
341 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
342 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000343
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000344 // Ensure extension is set properly.
345 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800346 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
347 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
348 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
349 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
350 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000351
solenberg7add0582015-11-20 09:59:34 -0800352 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000353 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700354 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800355 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
356 call_.GetAudioReceiveStream(kSsrc2));
357 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
358 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
359 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000360
361 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800362 recv_parameters_.extensions.clear();
363 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
364 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
365 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000366 }
367
solenberg85a04962015-10-27 03:35:21 -0700368 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
369 webrtc::AudioSendStream::Stats stats;
370 stats.local_ssrc = 12;
371 stats.bytes_sent = 345;
372 stats.packets_sent = 678;
373 stats.packets_lost = 9012;
374 stats.fraction_lost = 34.56f;
375 stats.codec_name = "codec_name_send";
376 stats.ext_seqnum = 789;
377 stats.jitter_ms = 12;
378 stats.rtt_ms = 345;
379 stats.audio_level = 678;
380 stats.aec_quality_min = 9.01f;
381 stats.echo_delay_median_ms = 234;
382 stats.echo_delay_std_ms = 567;
383 stats.echo_return_loss = 890;
384 stats.echo_return_loss_enhancement = 1234;
385 stats.typing_noise_detected = true;
386 return stats;
387 }
388 void SetAudioSendStreamStats() {
389 for (auto* s : call_.GetAudioSendStreams()) {
390 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200391 }
solenberg85a04962015-10-27 03:35:21 -0700392 }
solenberg566ef242015-11-06 15:34:49 -0800393 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
394 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700395 const auto stats = GetAudioSendStreamStats();
396 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
397 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
398 EXPECT_EQ(info.packets_sent, stats.packets_sent);
399 EXPECT_EQ(info.packets_lost, stats.packets_lost);
400 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
401 EXPECT_EQ(info.codec_name, stats.codec_name);
402 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
403 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
404 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
405 EXPECT_EQ(info.audio_level, stats.audio_level);
406 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
407 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
408 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
409 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
410 EXPECT_EQ(info.echo_return_loss_enhancement,
411 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800412 EXPECT_EQ(info.typing_noise_detected,
413 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700414 }
415
416 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
417 webrtc::AudioReceiveStream::Stats stats;
418 stats.remote_ssrc = 123;
419 stats.bytes_rcvd = 456;
420 stats.packets_rcvd = 768;
421 stats.packets_lost = 101;
422 stats.fraction_lost = 23.45f;
423 stats.codec_name = "codec_name_recv";
424 stats.ext_seqnum = 678;
425 stats.jitter_ms = 901;
426 stats.jitter_buffer_ms = 234;
427 stats.jitter_buffer_preferred_ms = 567;
428 stats.delay_estimate_ms = 890;
429 stats.audio_level = 1234;
430 stats.expand_rate = 5.67f;
431 stats.speech_expand_rate = 8.90f;
432 stats.secondary_decoded_rate = 1.23f;
433 stats.accelerate_rate = 4.56f;
434 stats.preemptive_expand_rate = 7.89f;
435 stats.decoding_calls_to_silence_generator = 12;
436 stats.decoding_calls_to_neteq = 345;
437 stats.decoding_normal = 67890;
438 stats.decoding_plc = 1234;
439 stats.decoding_cng = 5678;
440 stats.decoding_plc_cng = 9012;
441 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200442 return stats;
443 }
444 void SetAudioReceiveStreamStats() {
445 for (auto* s : call_.GetAudioReceiveStreams()) {
446 s->SetStats(GetAudioReceiveStreamStats());
447 }
448 }
449 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700450 const auto stats = GetAudioReceiveStreamStats();
451 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
452 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
453 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
454 EXPECT_EQ(info.packets_lost, stats.packets_lost);
455 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
456 EXPECT_EQ(info.codec_name, stats.codec_name);
457 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
458 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
459 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200460 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700461 stats.jitter_buffer_preferred_ms);
462 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
463 EXPECT_EQ(info.audio_level, stats.audio_level);
464 EXPECT_EQ(info.expand_rate, stats.expand_rate);
465 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
466 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
467 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
468 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200469 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700470 stats.decoding_calls_to_silence_generator);
471 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
472 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
473 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
474 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
475 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
476 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200477 }
478
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700480 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200481 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700483 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700484 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200485 cricket::AudioSendParameters send_parameters_;
486 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800487 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800488 private:
489 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490};
491
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492// Tests that we can create and destroy a channel.
493TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700494 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000495}
496
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700498// correctly (such that opus appears first).
499TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700500 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000501 ASSERT_FALSE(codecs.empty());
502 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
503 EXPECT_EQ(48000, codecs[0].clockrate);
504 EXPECT_EQ(2, codecs[0].channels);
505 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506}
507
stefanba4c0e42016-02-04 04:12:24 -0800508TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700509 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800510 bool opus_found = false;
511 for (cricket::AudioCodec codec : codecs) {
512 if (codec.name == "opus") {
513 EXPECT_TRUE(HasTransportCc(codec));
514 opus_found = true;
515 }
516 }
517 EXPECT_TRUE(opus_found);
518}
519
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520// Tests that we can find codecs by name or id, and that we interpret the
521// clockrate and bitrate fields properly.
522TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
523 cricket::AudioCodec codec;
524 webrtc::CodecInst codec_inst;
525 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800526 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800528 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000529 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800530 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
531 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 // Find ISAC with a different payload id.
533 codec = kIsacCodec;
534 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800535 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000536 EXPECT_EQ(codec.id, codec_inst.pltype);
537 // Find PCMU with a 0 clockrate.
538 codec = kPcmuCodec;
539 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800540 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 EXPECT_EQ(codec.id, codec_inst.pltype);
542 EXPECT_EQ(8000, codec_inst.plfreq);
543 // Find PCMU with a 0 bitrate.
544 codec = kPcmuCodec;
545 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800546 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547 EXPECT_EQ(codec.id, codec_inst.pltype);
548 EXPECT_EQ(64000, codec_inst.rate);
549 // Find ISAC with an explicit bitrate.
550 codec = kIsacCodec;
551 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800552 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 EXPECT_EQ(codec.id, codec_inst.pltype);
554 EXPECT_EQ(32000, codec_inst.rate);
555}
556
557// Test that we set our inbound codecs properly, including changing PT.
558TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700559 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200560 cricket::AudioRecvParameters parameters;
561 parameters.codecs.push_back(kIsacCodec);
562 parameters.codecs.push_back(kPcmuCodec);
563 parameters.codecs.push_back(kTelephoneEventCodec);
564 parameters.codecs[0].id = 106; // collide with existing telephone-event
565 parameters.codecs[2].id = 126;
566 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700567 EXPECT_TRUE(channel_->AddRecvStream(
568 cricket::StreamParams::CreateLegacy(kSsrc1)));
569 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800571 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 gcodec.plfreq = 16000;
573 gcodec.channels = 1;
574 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
575 EXPECT_EQ(106, gcodec.pltype);
576 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800577 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578 gcodec.plfreq = 8000;
579 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
580 EXPECT_EQ(126, gcodec.pltype);
581 EXPECT_STREQ("telephone-event", gcodec.plname);
582}
583
584// Test that we fail to set an unknown inbound codec.
585TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700586 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200587 cricket::AudioRecvParameters parameters;
588 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700589 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200590 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591}
592
593// Test that we fail if we have duplicate types in the inbound list.
594TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700595 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200596 cricket::AudioRecvParameters parameters;
597 parameters.codecs.push_back(kIsacCodec);
598 parameters.codecs.push_back(kCn16000Codec);
599 parameters.codecs[1].id = kIsacCodec.id;
600 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601}
602
603// Test that we can decode OPUS without stereo parameters.
604TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700605 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200606 cricket::AudioRecvParameters parameters;
607 parameters.codecs.push_back(kIsacCodec);
608 parameters.codecs.push_back(kPcmuCodec);
609 parameters.codecs.push_back(kOpusCodec);
610 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 EXPECT_TRUE(channel_->AddRecvStream(
612 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700613 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800615 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616 // Even without stereo parameters, recv codecs still specify channels = 2.
617 EXPECT_EQ(2, opus.channels);
618 EXPECT_EQ(111, opus.pltype);
619 EXPECT_STREQ("opus", opus.plname);
620 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700621 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 EXPECT_EQ(111, opus.pltype);
623}
624
625// Test that we can decode OPUS with stereo = 0.
626TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700627 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200628 cricket::AudioRecvParameters parameters;
629 parameters.codecs.push_back(kIsacCodec);
630 parameters.codecs.push_back(kPcmuCodec);
631 parameters.codecs.push_back(kOpusCodec);
632 parameters.codecs[2].params["stereo"] = "0";
633 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 EXPECT_TRUE(channel_->AddRecvStream(
635 cricket::StreamParams::CreateLegacy(kSsrc1)));
636 int channel_num2 = voe_.GetLastChannel();
637 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800638 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 // Even when stereo is off, recv codecs still specify channels = 2.
640 EXPECT_EQ(2, opus.channels);
641 EXPECT_EQ(111, opus.pltype);
642 EXPECT_STREQ("opus", opus.plname);
643 opus.pltype = 0;
644 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
645 EXPECT_EQ(111, opus.pltype);
646}
647
648// Test that we can decode OPUS with stereo = 1.
649TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700650 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200651 cricket::AudioRecvParameters parameters;
652 parameters.codecs.push_back(kIsacCodec);
653 parameters.codecs.push_back(kPcmuCodec);
654 parameters.codecs.push_back(kOpusCodec);
655 parameters.codecs[2].params["stereo"] = "1";
656 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657 EXPECT_TRUE(channel_->AddRecvStream(
658 cricket::StreamParams::CreateLegacy(kSsrc1)));
659 int channel_num2 = voe_.GetLastChannel();
660 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800661 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_EQ(2, opus.channels);
663 EXPECT_EQ(111, opus.pltype);
664 EXPECT_STREQ("opus", opus.plname);
665 opus.pltype = 0;
666 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
667 EXPECT_EQ(111, opus.pltype);
668}
669
670// Test that changes to recv codecs are applied to all streams.
671TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700672 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200673 cricket::AudioRecvParameters parameters;
674 parameters.codecs.push_back(kIsacCodec);
675 parameters.codecs.push_back(kPcmuCodec);
676 parameters.codecs.push_back(kTelephoneEventCodec);
677 parameters.codecs[0].id = 106; // collide with existing telephone-event
678 parameters.codecs[2].id = 126;
679 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 EXPECT_TRUE(channel_->AddRecvStream(
681 cricket::StreamParams::CreateLegacy(kSsrc1)));
682 int channel_num2 = voe_.GetLastChannel();
683 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800684 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 gcodec.plfreq = 16000;
686 gcodec.channels = 1;
687 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
688 EXPECT_EQ(106, gcodec.pltype);
689 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800690 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 gcodec.plfreq = 8000;
692 gcodec.channels = 1;
693 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
694 EXPECT_EQ(126, gcodec.pltype);
695 EXPECT_STREQ("telephone-event", gcodec.plname);
696}
697
698TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700699 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200700 cricket::AudioRecvParameters parameters;
701 parameters.codecs.push_back(kIsacCodec);
702 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200703 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704
705 int channel_num2 = voe_.GetLastChannel();
706 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800707 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 gcodec.plfreq = 16000;
709 gcodec.channels = 1;
710 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
711 EXPECT_EQ(106, gcodec.pltype);
712 EXPECT_STREQ("ISAC", gcodec.plname);
713}
714
715// Test that we can apply the same set of codecs again while playing.
716TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700717 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200718 cricket::AudioRecvParameters parameters;
719 parameters.codecs.push_back(kIsacCodec);
720 parameters.codecs.push_back(kCn16000Codec);
721 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200723 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724
725 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200726 parameters.codecs[0].id = 127;
727 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
728 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000729 EXPECT_TRUE(voe_.GetPlayout(channel_num));
730}
731
732// Test that we can add a codec while playing.
733TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700734 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200735 cricket::AudioRecvParameters parameters;
736 parameters.codecs.push_back(kIsacCodec);
737 parameters.codecs.push_back(kCn16000Codec);
738 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 EXPECT_TRUE(channel_->SetPlayout(true));
740
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200741 parameters.codecs.push_back(kOpusCodec);
742 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
743 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 EXPECT_TRUE(voe_.GetPlayout(channel_num));
745 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800746 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
748}
749
750TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700751 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000753 // Test that when autobw is enabled, bitrate is kept as the default
754 // value. autobw is enabled for the following tests because the target
755 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756
757 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700758 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759
760 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700761 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700764 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765}
766
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000767TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700768 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000770 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771
772 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700773 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
774 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
775 // Rates above the max (56000) should be capped.
776 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700779 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
780 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
781 // Rates above the max (510000) should be capped.
782 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783}
784
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000785TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700786 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000787
788 // Test that we can only set a maximum bitrate for a fixed-rate codec
789 // if it's bigger than the fixed rate.
790
791 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700792 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
793 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
794 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
795 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
796 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
797 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
798 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000799}
800
801TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700802 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200803 const int kDesiredBitrate = 128000;
804 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700805 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200806 parameters.max_bandwidth_bps = kDesiredBitrate;
807 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000808
809 EXPECT_TRUE(channel_->AddSendStream(
810 cricket::StreamParams::CreateLegacy(kSsrc1)));
811
812 int channel_num = voe_.GetLastChannel();
813 webrtc::CodecInst codec;
814 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200815 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000816}
817
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818// Test that bitrate cannot be set for CBR codecs.
819// Bitrate is ignored if it is higher than the fixed bitrate.
820// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000821TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700822 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823
824 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200825 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
826 int channel_num = voe_.GetLastChannel();
827 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
829 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200830
831 send_parameters_.max_bandwidth_bps = 128000;
832 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
834 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835
836 send_parameters_.max_bandwidth_bps = 128;
837 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
839 EXPECT_EQ(64000, codec.rate);
840}
841
skvlade0d46372016-04-07 22:59:22 -0700842// Test that the per-stream bitrate limit and the global
843// bitrate limit both apply.
844TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
845 EXPECT_TRUE(SetupSendStream());
846
847 // opus, default bitrate == 64000.
848 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
849 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
850 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
851 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
852
853 // CBR codecs allow both maximums to exceed the bitrate.
854 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
855 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
856 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
857 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
858
859 // CBR codecs don't allow per stream maximums to be too low.
860 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
861 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
862}
863
864// Test that an attempt to set RtpParameters for a stream that does not exist
865// fails.
866TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
867 EXPECT_TRUE(SetupChannel());
868 webrtc::RtpParameters nonexistent_parameters =
869 channel_->GetRtpParameters(kSsrc1);
870 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
871
872 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
873 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, nonexistent_parameters));
874}
875
876TEST_F(WebRtcVoiceEngineTestFake,
877 CannotSetRtpParametersWithIncorrectNumberOfEncodings) {
878 // This test verifies that setting RtpParameters succeeds only if
879 // the structure contains exactly one encoding.
880 // TODO(skvlad): Update this test when we start supporting setting parameters
881 // for each encoding individually.
882
883 EXPECT_TRUE(SetupSendStream());
884 // Setting RtpParameters with no encoding is expected to fail.
885 webrtc::RtpParameters parameters;
886 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
887 // Setting RtpParameters with exactly one encoding should succeed.
888 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
889 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
890 // Two or more encodings should result in failure.
891 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
892 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
893}
894
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700895// Test that a stream will not be sending if its encoding is made
896// inactive through SetRtpParameters.
897TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
898 EXPECT_TRUE(SetupSendStream());
899 SetSend(channel_, true);
900 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
901 // Get current parameters and change "active" to false.
902 webrtc::RtpParameters parameters = channel_->GetRtpParameters(kSsrc1);
903 ASSERT_EQ(1u, parameters.encodings.size());
904 ASSERT_TRUE(parameters.encodings[0].active);
905 parameters.encodings[0].active = false;
906 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
907 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
908
909 // Now change it back to active and verify we resume sending.
910 parameters.encodings[0].active = true;
911 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
912 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
913}
914
skvlade0d46372016-04-07 22:59:22 -0700915// Test that SetRtpParameters configures the correct encoding channel for each
916// SSRC.
917TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
918 SetupForMultiSendStream();
919 // Create send streams.
920 for (uint32_t ssrc : kSsrcs4) {
921 EXPECT_TRUE(
922 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
923 }
924 // Configure one stream to be limited by the stream config, another to be
925 // limited by the global max, and the third one with no per-stream limit
926 // (still subject to the global limit).
927 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
928 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
929 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
930 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
931
932 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
933 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
934 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
935
936 // Remove the global cap; the streams should switch to their respective
937 // maximums (or remain unchanged if there was no other limit on them.)
938 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
939 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
940 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
941 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
942}
943
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700944// Test that GetRtpParameters returns the currently configured codecs.
945TEST_F(WebRtcVoiceEngineTestFake, GetRtpParametersCodecs) {
946 EXPECT_TRUE(SetupSendStream());
947 cricket::AudioSendParameters parameters;
948 parameters.codecs.push_back(kIsacCodec);
949 parameters.codecs.push_back(kPcmuCodec);
950 EXPECT_TRUE(channel_->SetSendParameters(parameters));
951
952 webrtc::RtpParameters rtp_parameters = channel_->GetRtpParameters(kSsrc1);
953 ASSERT_EQ(2u, rtp_parameters.codecs.size());
954 EXPECT_EQ(kIsacCodec.id, rtp_parameters.codecs[0].payload_type);
955 EXPECT_EQ(kIsacCodec.name, rtp_parameters.codecs[0].mime_type);
956 EXPECT_EQ(kIsacCodec.clockrate, rtp_parameters.codecs[0].clock_rate);
957 EXPECT_EQ(kIsacCodec.channels, rtp_parameters.codecs[0].channels);
958 EXPECT_EQ(kPcmuCodec.id, rtp_parameters.codecs[1].payload_type);
959 EXPECT_EQ(kPcmuCodec.name, rtp_parameters.codecs[1].mime_type);
960 EXPECT_EQ(kPcmuCodec.clockrate, rtp_parameters.codecs[1].clock_rate);
961 EXPECT_EQ(kPcmuCodec.channels, rtp_parameters.codecs[1].channels);
962}
963
964// Test that if we set/get parameters multiple times, we get the same results.
965TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpParameters) {
966 EXPECT_TRUE(SetupSendStream());
967 cricket::AudioSendParameters parameters;
968 parameters.codecs.push_back(kIsacCodec);
969 parameters.codecs.push_back(kPcmuCodec);
970 EXPECT_TRUE(channel_->SetSendParameters(parameters));
971
972 webrtc::RtpParameters initial_params = channel_->GetRtpParameters(kSsrc1);
973
974 // We should be able to set the params we just got.
975 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, initial_params));
976
977 // ... And this shouldn't change the params returned by GetRtpParameters.
978 webrtc::RtpParameters new_params = channel_->GetRtpParameters(kSsrc1);
979 EXPECT_EQ(initial_params, channel_->GetRtpParameters(kSsrc1));
980}
981
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000982// Test that we apply codecs properly.
983TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700984 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200985 cricket::AudioSendParameters parameters;
986 parameters.codecs.push_back(kIsacCodec);
987 parameters.codecs.push_back(kPcmuCodec);
988 parameters.codecs.push_back(kRedCodec);
989 parameters.codecs[0].id = 96;
990 parameters.codecs[0].bitrate = 48000;
991 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000992 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200993 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000994 webrtc::CodecInst gcodec;
995 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
996 EXPECT_EQ(96, gcodec.pltype);
997 EXPECT_EQ(48000, gcodec.rate);
998 EXPECT_STREQ("ISAC", gcodec.plname);
999 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001000 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1002 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001003 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004}
1005
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001006// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1007// to apply.
1008TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001009 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001010 cricket::AudioSendParameters parameters;
1011 parameters.codecs.push_back(kIsacCodec);
1012 parameters.codecs.push_back(kPcmuCodec);
1013 parameters.codecs.push_back(kRedCodec);
1014 parameters.codecs[0].id = 96;
1015 parameters.codecs[0].bitrate = 48000;
1016 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001017 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1018 // Calling SetSendCodec again with same codec which is already set.
1019 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001020 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001021 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1022}
1023
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001024// Verify that G722 is set with 16000 samples per second to WebRTC.
1025TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001026 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001027 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001028 cricket::AudioSendParameters parameters;
1029 parameters.codecs.push_back(kG722CodecSdp);
1030 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001031 webrtc::CodecInst gcodec;
1032 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1033 EXPECT_STREQ("G722", gcodec.plname);
1034 EXPECT_EQ(1, gcodec.channels);
1035 EXPECT_EQ(16000, gcodec.plfreq);
1036}
1037
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001038// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001039TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001040 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001041 cricket::AudioSendParameters parameters;
1042 parameters.codecs.push_back(kOpusCodec);
1043 parameters.codecs[0].bitrate = 0;
1044 parameters.codecs[0].clockrate = 50000;
1045 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046}
1047
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001048// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001049TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001050 EXPECT_TRUE(SetupSendStream());
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].channels = 0;
1055 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056}
1057
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001058// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001059TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001060 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001061 cricket::AudioSendParameters parameters;
1062 parameters.codecs.push_back(kOpusCodec);
1063 parameters.codecs[0].bitrate = 0;
1064 parameters.codecs[0].channels = 0;
1065 parameters.codecs[0].params["stereo"] = "1";
1066 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067}
1068
1069// Test that if channel is 1 for opus and there's no stereo, we fail.
1070TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001071 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001072 cricket::AudioSendParameters parameters;
1073 parameters.codecs.push_back(kOpusCodec);
1074 parameters.codecs[0].bitrate = 0;
1075 parameters.codecs[0].channels = 1;
1076 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001077}
1078
1079// Test that if channel is 1 for opus and stereo=0, we fail.
1080TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001081 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001082 cricket::AudioSendParameters parameters;
1083 parameters.codecs.push_back(kOpusCodec);
1084 parameters.codecs[0].bitrate = 0;
1085 parameters.codecs[0].channels = 1;
1086 parameters.codecs[0].params["stereo"] = "0";
1087 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088}
1089
1090// Test that if channel is 1 for opus and stereo=1, we fail.
1091TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001092 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001093 cricket::AudioSendParameters parameters;
1094 parameters.codecs.push_back(kOpusCodec);
1095 parameters.codecs[0].bitrate = 0;
1096 parameters.codecs[0].channels = 1;
1097 parameters.codecs[0].params["stereo"] = "1";
1098 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099}
1100
1101// Test that with bitrate=0 and no stereo,
1102// channels and bitrate are 1 and 32000.
1103TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001104 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 cricket::AudioSendParameters parameters;
1107 parameters.codecs.push_back(kOpusCodec);
1108 parameters.codecs[0].bitrate = 0;
1109 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 webrtc::CodecInst gcodec;
1111 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1112 EXPECT_STREQ("opus", gcodec.plname);
1113 EXPECT_EQ(1, gcodec.channels);
1114 EXPECT_EQ(32000, gcodec.rate);
1115}
1116
1117// Test that with bitrate=0 and stereo=0,
1118// channels and bitrate are 1 and 32000.
1119TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001120 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001122 cricket::AudioSendParameters parameters;
1123 parameters.codecs.push_back(kOpusCodec);
1124 parameters.codecs[0].bitrate = 0;
1125 parameters.codecs[0].params["stereo"] = "0";
1126 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127 webrtc::CodecInst gcodec;
1128 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1129 EXPECT_STREQ("opus", gcodec.plname);
1130 EXPECT_EQ(1, gcodec.channels);
1131 EXPECT_EQ(32000, gcodec.rate);
1132}
1133
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001134// Test that with bitrate=invalid and stereo=0,
1135// channels and bitrate are 1 and 32000.
1136TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001137 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001138 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001139 cricket::AudioSendParameters parameters;
1140 parameters.codecs.push_back(kOpusCodec);
1141 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001142 webrtc::CodecInst gcodec;
1143
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001144 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001145 parameters.codecs[0].bitrate = 5999;
1146 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001147 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1148 EXPECT_STREQ("opus", gcodec.plname);
1149 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001150 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001151
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001152 parameters.codecs[0].bitrate = 510001;
1153 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001154 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1155 EXPECT_STREQ("opus", gcodec.plname);
1156 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001157 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001158}
1159
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160// Test that with bitrate=0 and stereo=1,
1161// channels and bitrate are 2 and 64000.
1162TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001163 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001165 cricket::AudioSendParameters parameters;
1166 parameters.codecs.push_back(kOpusCodec);
1167 parameters.codecs[0].bitrate = 0;
1168 parameters.codecs[0].params["stereo"] = "1";
1169 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 webrtc::CodecInst gcodec;
1171 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1172 EXPECT_STREQ("opus", gcodec.plname);
1173 EXPECT_EQ(2, gcodec.channels);
1174 EXPECT_EQ(64000, gcodec.rate);
1175}
1176
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001177// Test that with bitrate=invalid and stereo=1,
1178// channels and bitrate are 2 and 64000.
1179TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001180 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001181 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001182 cricket::AudioSendParameters parameters;
1183 parameters.codecs.push_back(kOpusCodec);
1184 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001185 webrtc::CodecInst gcodec;
1186
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001187 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001188 parameters.codecs[0].bitrate = 5999;
1189 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001190 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1191 EXPECT_STREQ("opus", gcodec.plname);
1192 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001193 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001194
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001195 parameters.codecs[0].bitrate = 510001;
1196 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001197 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1198 EXPECT_STREQ("opus", gcodec.plname);
1199 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001200 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001201}
1202
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203// Test that with bitrate=N and stereo unset,
1204// channels and bitrate are 1 and N.
1205TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001206 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001207 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 parameters.codecs[0].bitrate = 96000;
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001212 webrtc::CodecInst gcodec;
1213 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1214 EXPECT_EQ(111, gcodec.pltype);
1215 EXPECT_EQ(96000, gcodec.rate);
1216 EXPECT_STREQ("opus", gcodec.plname);
1217 EXPECT_EQ(1, gcodec.channels);
1218 EXPECT_EQ(48000, gcodec.plfreq);
1219}
1220
1221// Test that with bitrate=N and stereo=0,
1222// channels and bitrate are 1 and N.
1223TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001224 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001225 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001226 cricket::AudioSendParameters parameters;
1227 parameters.codecs.push_back(kOpusCodec);
1228 parameters.codecs[0].bitrate = 30000;
1229 parameters.codecs[0].params["stereo"] = "0";
1230 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001231 webrtc::CodecInst gcodec;
1232 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1233 EXPECT_EQ(1, gcodec.channels);
1234 EXPECT_EQ(30000, gcodec.rate);
1235 EXPECT_STREQ("opus", gcodec.plname);
1236}
1237
1238// Test that with bitrate=N and without any parameters,
1239// channels and bitrate are 1 and N.
1240TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001241 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001242 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001243 cricket::AudioSendParameters parameters;
1244 parameters.codecs.push_back(kOpusCodec);
1245 parameters.codecs[0].bitrate = 30000;
1246 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247 webrtc::CodecInst gcodec;
1248 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1249 EXPECT_EQ(1, gcodec.channels);
1250 EXPECT_EQ(30000, gcodec.rate);
1251 EXPECT_STREQ("opus", gcodec.plname);
1252}
1253
1254// Test that with bitrate=N and stereo=1,
1255// channels and bitrate are 2 and N.
1256TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001257 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001258 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001259 cricket::AudioSendParameters parameters;
1260 parameters.codecs.push_back(kOpusCodec);
1261 parameters.codecs[0].bitrate = 30000;
1262 parameters.codecs[0].params["stereo"] = "1";
1263 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001264 webrtc::CodecInst gcodec;
1265 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1266 EXPECT_EQ(2, gcodec.channels);
1267 EXPECT_EQ(30000, gcodec.rate);
1268 EXPECT_STREQ("opus", gcodec.plname);
1269}
1270
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001271// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1272// Also test that the "maxaveragebitrate" can't be set to values outside the
1273// range of 6000 and 510000
1274TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001275 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001276 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 cricket::AudioSendParameters parameters;
1278 parameters.codecs.push_back(kOpusCodec);
1279 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001280 webrtc::CodecInst gcodec;
1281
1282 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001283 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1284 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001285 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001286 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001287
1288 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001289 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001291 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001292 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001293
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001294 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1295 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001296 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1297 EXPECT_EQ(200000, gcodec.rate);
1298}
1299
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001300// Test that we can enable NACK with opus as caller.
1301TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001302 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001303 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001304 cricket::AudioSendParameters parameters;
1305 parameters.codecs.push_back(kOpusCodec);
1306 parameters.codecs[0].AddFeedbackParam(
1307 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1308 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001310 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001311 EXPECT_TRUE(voe_.GetNACK(channel_num));
1312}
1313
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001314// Test that we can enable NACK with opus as callee.
1315TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001316 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001317 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001318 cricket::AudioSendParameters parameters;
1319 parameters.codecs.push_back(kOpusCodec);
1320 parameters.codecs[0].AddFeedbackParam(
1321 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1322 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001323 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001324 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001325 EXPECT_FALSE(voe_.GetNACK(channel_num));
1326
1327 EXPECT_TRUE(channel_->AddSendStream(
1328 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001329 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001330}
1331
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001332// Test that we can enable NACK on receive streams.
1333TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001334 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335 int channel_num1 = voe_.GetLastChannel();
1336 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1337 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001338 cricket::AudioSendParameters parameters;
1339 parameters.codecs.push_back(kOpusCodec);
1340 parameters.codecs[0].AddFeedbackParam(
1341 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1342 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001343 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1344 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001345 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001346 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1347 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1348}
1349
1350// Test that we can disable NACK.
1351TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001352 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +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].AddFeedbackParam(
1357 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1358 cricket::kParamValueEmpty));
1359 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001360 EXPECT_TRUE(voe_.GetNACK(channel_num));
1361
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001362 parameters.codecs.clear();
1363 parameters.codecs.push_back(kOpusCodec);
1364 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 EXPECT_FALSE(voe_.GetNACK(channel_num));
1366}
1367
1368// Test that we can disable NACK on receive streams.
1369TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001370 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371 int channel_num1 = voe_.GetLastChannel();
1372 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1373 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 cricket::AudioSendParameters parameters;
1375 parameters.codecs.push_back(kOpusCodec);
1376 parameters.codecs[0].AddFeedbackParam(
1377 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1378 cricket::kParamValueEmpty));
1379 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001380 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1381 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1382
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001383 parameters.codecs.clear();
1384 parameters.codecs.push_back(kOpusCodec);
1385 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001386 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1387 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1388}
1389
1390// Test that NACK is enabled on a new receive stream.
1391TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001392 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001393 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001394 cricket::AudioSendParameters parameters;
1395 parameters.codecs.push_back(kIsacCodec);
1396 parameters.codecs.push_back(kCn16000Codec);
1397 parameters.codecs[0].AddFeedbackParam(
1398 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1399 cricket::kParamValueEmpty));
1400 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001401 EXPECT_TRUE(voe_.GetNACK(channel_num));
1402
1403 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1404 channel_num = voe_.GetLastChannel();
1405 EXPECT_TRUE(voe_.GetNACK(channel_num));
1406 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1407 channel_num = voe_.GetLastChannel();
1408 EXPECT_TRUE(voe_.GetNACK(channel_num));
1409}
1410
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001411// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001412TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001413 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001414 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kOpusCodec);
1417 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001418 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1419}
1420
1421// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001422TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001423 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001424 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001425 cricket::AudioSendParameters parameters;
1426 parameters.codecs.push_back(kOpusCodec);
1427 parameters.codecs[0].bitrate = 0;
1428 parameters.codecs[0].params["useinbandfec"] = "0";
1429 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001430 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1431 webrtc::CodecInst gcodec;
1432 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1433 EXPECT_STREQ("opus", gcodec.plname);
1434 EXPECT_EQ(1, gcodec.channels);
1435 EXPECT_EQ(32000, gcodec.rate);
1436}
1437
1438// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001439TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001440 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001441 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001442 cricket::AudioSendParameters parameters;
1443 parameters.codecs.push_back(kOpusCodec);
1444 parameters.codecs[0].bitrate = 0;
1445 parameters.codecs[0].params["useinbandfec"] = "1";
1446 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001447 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1448 webrtc::CodecInst gcodec;
1449 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1450 EXPECT_STREQ("opus", gcodec.plname);
1451 EXPECT_EQ(1, gcodec.channels);
1452 EXPECT_EQ(32000, gcodec.rate);
1453}
1454
1455// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001456TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001457 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001458 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001459 cricket::AudioSendParameters parameters;
1460 parameters.codecs.push_back(kOpusCodec);
1461 parameters.codecs[0].bitrate = 0;
1462 parameters.codecs[0].params["stereo"] = "1";
1463 parameters.codecs[0].params["useinbandfec"] = "1";
1464 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001465 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1466 webrtc::CodecInst gcodec;
1467 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1468 EXPECT_STREQ("opus", gcodec.plname);
1469 EXPECT_EQ(2, gcodec.channels);
1470 EXPECT_EQ(64000, gcodec.rate);
1471}
1472
1473// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001474TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001475 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001476 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001477 cricket::AudioSendParameters parameters;
1478 parameters.codecs.push_back(kIsacCodec);
1479 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001480 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1481}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001482
1483// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1484TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001485 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001486 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001487 cricket::AudioSendParameters parameters;
1488 parameters.codecs.push_back(kIsacCodec);
1489 parameters.codecs[0].params["useinbandfec"] = "1";
1490 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001491 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1492}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001493
1494// Test that Opus FEC status can be changed.
1495TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001496 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001497 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001498 cricket::AudioSendParameters parameters;
1499 parameters.codecs.push_back(kOpusCodec);
1500 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001501 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001502 parameters.codecs[0].params["useinbandfec"] = "1";
1503 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001504 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1505}
1506
stefanba4c0e42016-02-04 04:12:24 -08001507TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001508 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001509 cricket::AudioSendParameters send_parameters;
1510 send_parameters.codecs.push_back(kOpusCodec);
1511 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1512 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1513
1514 cricket::AudioRecvParameters recv_parameters;
1515 recv_parameters.codecs.push_back(kIsacCodec);
1516 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1517 EXPECT_TRUE(
1518 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1519 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1520 EXPECT_FALSE(
1521 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1522
solenbergbc37fc82016-04-04 09:54:44 -07001523 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001524 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1525 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1526 EXPECT_TRUE(
1527 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1528}
1529
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001530// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1531TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001532 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001533 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001534 cricket::AudioSendParameters parameters;
1535 parameters.codecs.push_back(kOpusCodec);
1536 parameters.codecs[0].bitrate = 0;
1537 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1538 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001539 EXPECT_EQ(cricket::kOpusBandwidthNb,
1540 voe_.GetMaxEncodingBandwidth(channel_num));
1541 webrtc::CodecInst gcodec;
1542 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1543 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001544
1545 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1547 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001548 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1549 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001550}
1551
1552// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1553TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001554 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001555 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001556 cricket::AudioSendParameters parameters;
1557 parameters.codecs.push_back(kOpusCodec);
1558 parameters.codecs[0].bitrate = 0;
1559 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1560 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001561 EXPECT_EQ(cricket::kOpusBandwidthMb,
1562 voe_.GetMaxEncodingBandwidth(channel_num));
1563 webrtc::CodecInst gcodec;
1564 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1565 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001566
1567 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001568 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1569 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001570 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1571 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001572}
1573
1574// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1575TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001576 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001577 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001578 cricket::AudioSendParameters parameters;
1579 parameters.codecs.push_back(kOpusCodec);
1580 parameters.codecs[0].bitrate = 0;
1581 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1582 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001583 EXPECT_EQ(cricket::kOpusBandwidthWb,
1584 voe_.GetMaxEncodingBandwidth(channel_num));
1585 webrtc::CodecInst gcodec;
1586 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1587 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001588
1589 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001590 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1591 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001592 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1593 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001594}
1595
1596// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1597TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001598 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001599 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001600 cricket::AudioSendParameters parameters;
1601 parameters.codecs.push_back(kOpusCodec);
1602 parameters.codecs[0].bitrate = 0;
1603 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1604 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001605 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1606 voe_.GetMaxEncodingBandwidth(channel_num));
1607 webrtc::CodecInst gcodec;
1608 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1609 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001610
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001611 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001612 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1613 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001614 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1615 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001616}
1617
1618// Test 24000 < maxplaybackrate triggers Opus full band mode.
1619TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001620 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001621 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001622 cricket::AudioSendParameters parameters;
1623 parameters.codecs.push_back(kOpusCodec);
1624 parameters.codecs[0].bitrate = 0;
1625 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1626 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001627 EXPECT_EQ(cricket::kOpusBandwidthFb,
1628 voe_.GetMaxEncodingBandwidth(channel_num));
1629 webrtc::CodecInst gcodec;
1630 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1631 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001632
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001633 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001634 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1635 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001636 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1637 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001638}
1639
1640// Test Opus that without maxplaybackrate, default playback rate is used.
1641TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001642 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001643 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001644 cricket::AudioSendParameters parameters;
1645 parameters.codecs.push_back(kOpusCodec);
1646 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001647 EXPECT_EQ(cricket::kOpusBandwidthFb,
1648 voe_.GetMaxEncodingBandwidth(channel_num));
1649}
1650
1651// Test the with non-Opus, maxplaybackrate has no effect.
1652TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001653 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001654 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001655 cricket::AudioSendParameters parameters;
1656 parameters.codecs.push_back(kIsacCodec);
1657 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1658 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001659 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1660}
1661
1662// Test maxplaybackrate can be set on two streams.
1663TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001664 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001665 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001666 cricket::AudioSendParameters parameters;
1667 parameters.codecs.push_back(kOpusCodec);
1668 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001669 // Default bandwidth is 24000.
1670 EXPECT_EQ(cricket::kOpusBandwidthFb,
1671 voe_.GetMaxEncodingBandwidth(channel_num));
1672
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001673 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001674
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001675 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001676 EXPECT_EQ(cricket::kOpusBandwidthNb,
1677 voe_.GetMaxEncodingBandwidth(channel_num));
1678
1679 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1680 channel_num = voe_.GetLastChannel();
1681 EXPECT_EQ(cricket::kOpusBandwidthNb,
1682 voe_.GetMaxEncodingBandwidth(channel_num));
1683}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001684
Minyue Li7100dcd2015-03-27 05:05:59 +01001685// Test that with usedtx=0, Opus DTX is off.
1686TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001687 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001688 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001689 cricket::AudioSendParameters parameters;
1690 parameters.codecs.push_back(kOpusCodec);
1691 parameters.codecs[0].params["usedtx"] = "0";
1692 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001693 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1694}
1695
1696// Test that with usedtx=1, Opus DTX is on.
1697TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001698 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001699 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001700 cricket::AudioSendParameters parameters;
1701 parameters.codecs.push_back(kOpusCodec);
1702 parameters.codecs[0].params["usedtx"] = "1";
1703 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001704 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1705 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1706}
1707
1708// Test that usedtx=1 works with stereo Opus.
1709TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001710 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001711 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001712 cricket::AudioSendParameters parameters;
1713 parameters.codecs.push_back(kOpusCodec);
1714 parameters.codecs[0].params["usedtx"] = "1";
1715 parameters.codecs[0].params["stereo"] = "1";
1716 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001717 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1718 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1719}
1720
1721// Test that usedtx=1 does not work with non Opus.
1722TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001723 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001724 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 cricket::AudioSendParameters parameters;
1726 parameters.codecs.push_back(kIsacCodec);
1727 parameters.codecs[0].params["usedtx"] = "1";
1728 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001729 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1730}
1731
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001732// Test that we can switch back and forth between Opus and ISAC with CN.
1733TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001734 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001735 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001736 cricket::AudioSendParameters opus_parameters;
1737 opus_parameters.codecs.push_back(kOpusCodec);
1738 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739 webrtc::CodecInst gcodec;
1740 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001741 EXPECT_EQ(111, gcodec.pltype);
1742 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001744 cricket::AudioSendParameters isac_parameters;
1745 isac_parameters.codecs.push_back(kIsacCodec);
1746 isac_parameters.codecs.push_back(kCn16000Codec);
1747 isac_parameters.codecs.push_back(kOpusCodec);
1748 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1750 EXPECT_EQ(103, gcodec.pltype);
1751 EXPECT_STREQ("ISAC", gcodec.plname);
1752
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001753 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001754 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001755 EXPECT_EQ(111, gcodec.pltype);
1756 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757}
1758
1759// Test that we handle various ways of specifying bitrate.
1760TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001761 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001763 cricket::AudioSendParameters parameters;
1764 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1765 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766 webrtc::CodecInst gcodec;
1767 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1768 EXPECT_EQ(103, gcodec.pltype);
1769 EXPECT_STREQ("ISAC", gcodec.plname);
1770 EXPECT_EQ(32000, gcodec.rate);
1771
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001772 parameters.codecs[0].bitrate = 0; // bitrate == default
1773 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1775 EXPECT_EQ(103, gcodec.pltype);
1776 EXPECT_STREQ("ISAC", gcodec.plname);
1777 EXPECT_EQ(-1, gcodec.rate);
1778
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001779 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1780 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1782 EXPECT_EQ(103, gcodec.pltype);
1783 EXPECT_STREQ("ISAC", gcodec.plname);
1784 EXPECT_EQ(28000, gcodec.rate);
1785
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001786 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1787 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1789 EXPECT_EQ(0, gcodec.pltype);
1790 EXPECT_STREQ("PCMU", gcodec.plname);
1791 EXPECT_EQ(64000, gcodec.rate);
1792
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001793 parameters.codecs[0].bitrate = 0; // bitrate == default
1794 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1796 EXPECT_EQ(0, gcodec.pltype);
1797 EXPECT_STREQ("PCMU", gcodec.plname);
1798 EXPECT_EQ(64000, gcodec.rate);
1799
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001800 parameters.codecs[0] = kOpusCodec;
1801 parameters.codecs[0].bitrate = 0; // bitrate == default
1802 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1804 EXPECT_EQ(111, gcodec.pltype);
1805 EXPECT_STREQ("opus", gcodec.plname);
1806 EXPECT_EQ(32000, gcodec.rate);
1807}
1808
Brave Yao5225dd82015-03-26 07:39:19 +08001809// Test that we could set packet size specified in kCodecParamPTime.
1810TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001811 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001812 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001813 cricket::AudioSendParameters parameters;
1814 parameters.codecs.push_back(kOpusCodec);
1815 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1816 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001817 webrtc::CodecInst gcodec;
1818 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1819 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1820
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001821 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1822 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001823 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1824 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1825
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001826 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1827 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001828 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1829 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1830
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001831 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1832 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1833 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001834 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1835 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1836
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001837 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1838 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001840 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1841 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1842}
1843
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001844// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001846 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001847 cricket::AudioSendParameters parameters;
1848 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001849}
1850
1851// Test that we can set send codecs even with telephone-event codec as the first
1852// one on the list.
1853TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001854 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001856 cricket::AudioSendParameters parameters;
1857 parameters.codecs.push_back(kTelephoneEventCodec);
1858 parameters.codecs.push_back(kIsacCodec);
1859 parameters.codecs.push_back(kPcmuCodec);
1860 parameters.codecs[0].id = 98; // DTMF
1861 parameters.codecs[1].id = 96;
1862 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001863 webrtc::CodecInst gcodec;
1864 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001865 EXPECT_EQ(96, gcodec.pltype);
1866 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001867 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001868}
1869
solenberg31642aa2016-03-14 08:00:37 -07001870// Test that payload type range is limited for telephone-event codec.
1871TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001872 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001873 cricket::AudioSendParameters parameters;
1874 parameters.codecs.push_back(kTelephoneEventCodec);
1875 parameters.codecs.push_back(kIsacCodec);
1876 parameters.codecs[0].id = 0; // DTMF
1877 parameters.codecs[1].id = 96;
1878 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1879 EXPECT_TRUE(channel_->CanInsertDtmf());
1880 parameters.codecs[0].id = 128; // DTMF
1881 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1882 EXPECT_FALSE(channel_->CanInsertDtmf());
1883 parameters.codecs[0].id = 127;
1884 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1885 EXPECT_TRUE(channel_->CanInsertDtmf());
1886 parameters.codecs[0].id = -1; // DTMF
1887 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1888 EXPECT_FALSE(channel_->CanInsertDtmf());
1889}
1890
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001891// Test that we can set send codecs even with CN codec as the first
1892// one on the list.
1893TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001894 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001895 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 cricket::AudioSendParameters parameters;
1897 parameters.codecs.push_back(kCn16000Codec);
1898 parameters.codecs.push_back(kIsacCodec);
1899 parameters.codecs.push_back(kPcmuCodec);
1900 parameters.codecs[0].id = 98; // wideband CN
1901 parameters.codecs[1].id = 96;
1902 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001903 webrtc::CodecInst gcodec;
1904 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1905 EXPECT_EQ(96, gcodec.pltype);
1906 EXPECT_STREQ("ISAC", gcodec.plname);
1907 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908}
1909
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001910// Test that we set VAD and DTMF types correctly as caller.
1911TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001912 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001913 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001914 cricket::AudioSendParameters parameters;
1915 parameters.codecs.push_back(kIsacCodec);
1916 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001918 parameters.codecs.push_back(kCn16000Codec);
1919 parameters.codecs.push_back(kCn8000Codec);
1920 parameters.codecs.push_back(kTelephoneEventCodec);
1921 parameters.codecs.push_back(kRedCodec);
1922 parameters.codecs[0].id = 96;
1923 parameters.codecs[2].id = 97; // wideband CN
1924 parameters.codecs[4].id = 98; // DTMF
1925 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926 webrtc::CodecInst gcodec;
1927 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1928 EXPECT_EQ(96, gcodec.pltype);
1929 EXPECT_STREQ("ISAC", gcodec.plname);
1930 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001931 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001932 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1933 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001934 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935}
1936
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001937// Test that we set VAD and DTMF types correctly as callee.
1938TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001939 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001940 cricket::AudioSendParameters parameters;
1941 parameters.codecs.push_back(kIsacCodec);
1942 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001943 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001944 parameters.codecs.push_back(kCn16000Codec);
1945 parameters.codecs.push_back(kCn8000Codec);
1946 parameters.codecs.push_back(kTelephoneEventCodec);
1947 parameters.codecs.push_back(kRedCodec);
1948 parameters.codecs[0].id = 96;
1949 parameters.codecs[2].id = 97; // wideband CN
1950 parameters.codecs[4].id = 98; // DTMF
1951 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001952 EXPECT_TRUE(channel_->AddSendStream(
1953 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001954 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001955
1956 webrtc::CodecInst gcodec;
1957 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1958 EXPECT_EQ(96, gcodec.pltype);
1959 EXPECT_STREQ("ISAC", gcodec.plname);
1960 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001961 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001962 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1963 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001964 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001965}
1966
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967// Test that we only apply VAD if we have a CN codec that matches the
1968// send codec clockrate.
1969TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001970 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001972 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001974 parameters.codecs.push_back(kIsacCodec);
1975 parameters.codecs.push_back(kCn16000Codec);
1976 parameters.codecs[1].id = 97;
1977 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978 webrtc::CodecInst gcodec;
1979 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1980 EXPECT_STREQ("ISAC", gcodec.plname);
1981 EXPECT_TRUE(voe_.GetVAD(channel_num));
1982 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1983 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001984 parameters.codecs[0] = kPcmuCodec;
1985 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001986 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1987 EXPECT_STREQ("PCMU", gcodec.plname);
1988 EXPECT_FALSE(voe_.GetVAD(channel_num));
1989 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001990 parameters.codecs[1] = kCn8000Codec;
1991 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1993 EXPECT_STREQ("PCMU", gcodec.plname);
1994 EXPECT_TRUE(voe_.GetVAD(channel_num));
1995 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001996 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001997 parameters.codecs[0] = kIsacCodec;
1998 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001999 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2000 EXPECT_STREQ("ISAC", gcodec.plname);
2001 EXPECT_FALSE(voe_.GetVAD(channel_num));
2002}
2003
2004// Test that we perform case-insensitive matching of codec names.
2005TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002006 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002008 cricket::AudioSendParameters parameters;
2009 parameters.codecs.push_back(kIsacCodec);
2010 parameters.codecs.push_back(kPcmuCodec);
2011 parameters.codecs.push_back(kCn16000Codec);
2012 parameters.codecs.push_back(kCn8000Codec);
2013 parameters.codecs.push_back(kTelephoneEventCodec);
2014 parameters.codecs.push_back(kRedCodec);
2015 parameters.codecs[0].name = "iSaC";
2016 parameters.codecs[0].id = 96;
2017 parameters.codecs[2].id = 97; // wideband CN
2018 parameters.codecs[4].id = 98; // DTMF
2019 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002020 webrtc::CodecInst gcodec;
2021 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2022 EXPECT_EQ(96, gcodec.pltype);
2023 EXPECT_STREQ("ISAC", gcodec.plname);
2024 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002025 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2027 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002028 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029}
2030
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002031// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002032TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002033 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002034 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002035 cricket::AudioSendParameters parameters;
2036 parameters.codecs.push_back(kRedCodec);
2037 parameters.codecs.push_back(kIsacCodec);
2038 parameters.codecs.push_back(kPcmuCodec);
2039 parameters.codecs[0].id = 127;
2040 parameters.codecs[0].params[""] = "96/96";
2041 parameters.codecs[1].id = 96;
2042 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002043 webrtc::CodecInst gcodec;
2044 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2045 EXPECT_EQ(96, gcodec.pltype);
2046 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002047 EXPECT_TRUE(voe_.GetRED(channel_num));
2048 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002049}
2050
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002051// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002052TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002053 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002054 cricket::AudioSendParameters parameters;
2055 parameters.codecs.push_back(kRedCodec);
2056 parameters.codecs.push_back(kIsacCodec);
2057 parameters.codecs.push_back(kPcmuCodec);
2058 parameters.codecs[0].id = 127;
2059 parameters.codecs[0].params[""] = "96/96";
2060 parameters.codecs[1].id = 96;
2061 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002062 EXPECT_TRUE(channel_->AddSendStream(
2063 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002064 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002065 webrtc::CodecInst gcodec;
2066 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2067 EXPECT_EQ(96, gcodec.pltype);
2068 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002069 EXPECT_TRUE(voe_.GetRED(channel_num));
2070 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002071}
2072
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002073// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002074TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002075 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002076 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002077 cricket::AudioSendParameters parameters;
2078 parameters.codecs.push_back(kRedCodec);
2079 parameters.codecs.push_back(kIsacCodec);
2080 parameters.codecs.push_back(kPcmuCodec);
2081 parameters.codecs[0].id = 127;
2082 parameters.codecs[1].id = 96;
2083 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002084 webrtc::CodecInst gcodec;
2085 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2086 EXPECT_EQ(96, gcodec.pltype);
2087 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002088 EXPECT_TRUE(voe_.GetRED(channel_num));
2089 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090}
2091
2092// Test that we ignore RED if the parameters aren't named the way we expect.
2093TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002094 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002095 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002096 cricket::AudioSendParameters parameters;
2097 parameters.codecs.push_back(kRedCodec);
2098 parameters.codecs.push_back(kIsacCodec);
2099 parameters.codecs.push_back(kPcmuCodec);
2100 parameters.codecs[0].id = 127;
2101 parameters.codecs[0].params["ABC"] = "96/96";
2102 parameters.codecs[1].id = 96;
2103 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104 webrtc::CodecInst gcodec;
2105 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2106 EXPECT_EQ(96, gcodec.pltype);
2107 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002108 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002109}
2110
2111// Test that we ignore RED if it uses different primary/secondary encoding.
2112TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002113 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002115 cricket::AudioSendParameters parameters;
2116 parameters.codecs.push_back(kRedCodec);
2117 parameters.codecs.push_back(kIsacCodec);
2118 parameters.codecs.push_back(kPcmuCodec);
2119 parameters.codecs[0].id = 127;
2120 parameters.codecs[0].params[""] = "96/0";
2121 parameters.codecs[1].id = 96;
2122 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002123 webrtc::CodecInst gcodec;
2124 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2125 EXPECT_EQ(96, gcodec.pltype);
2126 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002127 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128}
2129
2130// Test that we ignore RED if it uses more than 2 encodings.
2131TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002132 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002134 cricket::AudioSendParameters parameters;
2135 parameters.codecs.push_back(kRedCodec);
2136 parameters.codecs.push_back(kIsacCodec);
2137 parameters.codecs.push_back(kPcmuCodec);
2138 parameters.codecs[0].id = 127;
2139 parameters.codecs[0].params[""] = "96/96/96";
2140 parameters.codecs[1].id = 96;
2141 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002142 webrtc::CodecInst gcodec;
2143 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2144 EXPECT_EQ(96, gcodec.pltype);
2145 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002146 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147}
2148
2149// Test that we ignore RED if it has bogus codec ids.
2150TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002151 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002153 cricket::AudioSendParameters parameters;
2154 parameters.codecs.push_back(kRedCodec);
2155 parameters.codecs.push_back(kIsacCodec);
2156 parameters.codecs.push_back(kPcmuCodec);
2157 parameters.codecs[0].id = 127;
2158 parameters.codecs[0].params[""] = "ABC/ABC";
2159 parameters.codecs[1].id = 96;
2160 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002161 webrtc::CodecInst gcodec;
2162 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2163 EXPECT_EQ(96, gcodec.pltype);
2164 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002165 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166}
2167
2168// Test that we ignore RED if it refers to a codec that is not present.
2169TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002170 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002172 cricket::AudioSendParameters parameters;
2173 parameters.codecs.push_back(kRedCodec);
2174 parameters.codecs.push_back(kIsacCodec);
2175 parameters.codecs.push_back(kPcmuCodec);
2176 parameters.codecs[0].id = 127;
2177 parameters.codecs[0].params[""] = "97/97";
2178 parameters.codecs[1].id = 96;
2179 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180 webrtc::CodecInst gcodec;
2181 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2182 EXPECT_EQ(96, gcodec.pltype);
2183 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002184 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185}
2186
stefanba4c0e42016-02-04 04:12:24 -08002187class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2188 public:
2189 WebRtcVoiceEngineWithSendSideBweTest()
2190 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2191};
2192
2193TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2194 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002195 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002196 ASSERT_FALSE(capabilities.header_extensions.empty());
2197 for (const cricket::RtpHeaderExtension& extension :
2198 capabilities.header_extensions) {
2199 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2200 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2201 extension.id);
2202 return;
2203 }
2204 }
2205 FAIL() << "Transport sequence number extension not in header-extension list.";
2206}
2207
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002208// Test support for audio level header extension.
2209TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2210 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002211}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002212TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2213 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2214}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002215
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002216// Test support for absolute send time header extension.
2217TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2218 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2219}
2220TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2221 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222}
2223
solenberg1ac56142015-10-13 03:58:19 -07002224// Test that we can create a channel and start sending on it.
2225TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002226 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002227 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002228 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002229 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002230 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002231 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2232}
2233
2234// Test that a channel will send if and only if it has a source and is enabled
2235// for sending.
2236TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002237 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002238 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2239 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002240 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002241 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2242 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2243 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2244 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2245 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002246}
2247
solenberg6d6e7c52016-04-13 09:07:30 -07002248// Test that SetSendParameters() does not alter a stream's send state.
2249TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2250 EXPECT_TRUE(SetupSendStream());
2251 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2252
2253 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002254 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002255 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2256
2257 // Changing RTP header extensions will recreate the AudioSendStream.
2258 send_parameters_.extensions.push_back(
2259 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2260 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2261 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2262
2263 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002264 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002265 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2266
2267 // Changing RTP header extensions will recreate the AudioSendStream.
2268 send_parameters_.extensions.clear();
2269 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2270 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2271}
2272
solenberg1ac56142015-10-13 03:58:19 -07002273// Test that we can create a channel and start playing out on it.
2274TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002275 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002276 int channel_num = voe_.GetLastChannel();
2277 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2278 EXPECT_TRUE(channel_->SetPlayout(true));
2279 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002280 EXPECT_TRUE(channel_->SetPlayout(false));
2281 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2282}
2283
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002284// Test that we can add and remove send streams.
2285TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2286 SetupForMultiSendStream();
2287
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002288 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002289 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002290
solenbergc96df772015-10-21 13:01:53 -07002291 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002292 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002293 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002294 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002295 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002296 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002297 }
tfarina5237aaf2015-11-10 23:44:30 -08002298 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002299
solenbergc96df772015-10-21 13:01:53 -07002300 // Delete the send streams.
2301 for (uint32_t ssrc : kSsrcs4) {
2302 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002303 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002304 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002305 }
solenbergc96df772015-10-21 13:01:53 -07002306 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002307}
2308
2309// Test SetSendCodecs correctly configure the codecs in all send streams.
2310TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2311 SetupForMultiSendStream();
2312
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002313 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002314 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002315 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002316 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002317 }
2318
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002319 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002320 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002321 parameters.codecs.push_back(kIsacCodec);
2322 parameters.codecs.push_back(kCn16000Codec);
2323 parameters.codecs[1].id = 97;
2324 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002325
2326 // Verify ISAC and VAD are corrected configured on all send channels.
2327 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002328 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002329 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002330 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2331 EXPECT_STREQ("ISAC", gcodec.plname);
2332 EXPECT_TRUE(voe_.GetVAD(channel_num));
2333 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2334 }
2335
2336 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002337 parameters.codecs[0] = kPcmuCodec;
2338 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002339 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002340 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002341 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2342 EXPECT_STREQ("PCMU", gcodec.plname);
2343 EXPECT_FALSE(voe_.GetVAD(channel_num));
2344 }
2345}
2346
2347// Test we can SetSend on all send streams correctly.
2348TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2349 SetupForMultiSendStream();
2350
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002351 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002352 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002353 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002354 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002355 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2356 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002357 }
2358
2359 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002360 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002361 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002362 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002363 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002364 }
2365
2366 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002367 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002368 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002369 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002370 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002371 }
2372}
2373
2374// Test we can set the correct statistics on all send streams.
2375TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2376 SetupForMultiSendStream();
2377
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002378 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002379 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002380 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002381 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002382 }
solenberg85a04962015-10-27 03:35:21 -07002383 SetAudioSendStreamStats();
2384
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002385 // Create a receive stream to check that none of the send streams end up in
2386 // the receive stream stats.
2387 EXPECT_TRUE(channel_->AddRecvStream(
2388 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002389 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002390 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2391 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002392
solenberg85a04962015-10-27 03:35:21 -07002393 // Check stats for the added streams.
2394 {
2395 cricket::VoiceMediaInfo info;
2396 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002397
solenberg85a04962015-10-27 03:35:21 -07002398 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002399 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002400 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002401 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002402 }
2403
2404 // We have added one receive stream. We should see empty stats.
2405 EXPECT_EQ(info.receivers.size(), 1u);
2406 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002407 }
solenberg1ac56142015-10-13 03:58:19 -07002408
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002409 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002410 {
2411 cricket::VoiceMediaInfo info;
2412 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2413 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002414 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002415 EXPECT_EQ(0u, info.receivers.size());
2416 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002417
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002418 // Deliver a new packet - a default receive stream should be created and we
2419 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002420 {
2421 cricket::VoiceMediaInfo info;
2422 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2423 SetAudioReceiveStreamStats();
2424 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002425 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002426 EXPECT_EQ(1u, info.receivers.size());
2427 VerifyVoiceReceiverInfo(info.receivers[0]);
2428 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002429}
2430
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002431// Test that we can add and remove receive streams, and do proper send/playout.
2432// We can receive on multiple streams while sending one stream.
2433TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002434 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002435 int channel_num1 = voe_.GetLastChannel();
2436
solenberg1ac56142015-10-13 03:58:19 -07002437 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002438 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002440 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441
solenberg1ac56142015-10-13 03:58:19 -07002442 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002443 EXPECT_TRUE(
2444 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002445 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002446 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002447 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448
solenberg1ac56142015-10-13 03:58:19 -07002449 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2451 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2452
2453 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002454 EXPECT_TRUE(
2455 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002456 int channel_num3 = voe_.GetLastChannel();
2457 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2458 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2459 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460
2461 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002462 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002463 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464
2465 // Stop playout.
2466 EXPECT_TRUE(channel_->SetPlayout(false));
2467 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2468 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2469 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2470
solenberg1ac56142015-10-13 03:58:19 -07002471 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002472 EXPECT_TRUE(channel_->SetPlayout(true));
2473 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2474 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2475 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2476
solenberg1ac56142015-10-13 03:58:19 -07002477 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2479 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002480 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481}
2482
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002484// and start sending on it.
2485TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002486 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002487 cricket::AudioOptions options_adjust_agc;
2488 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489 webrtc::AgcConfig agc_config;
2490 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2491 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002492 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002493 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002494 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002495 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2497 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002498 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002499 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501}
2502
wu@webrtc.org97077a32013-10-25 21:18:33 +00002503TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002504 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002505 EXPECT_CALL(adm_,
2506 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002507 webrtc::AgcConfig agc_config;
2508 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2509 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002510 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2511 send_parameters_.options.tx_agc_digital_compression_gain =
2512 rtc::Optional<uint16_t>(9);
2513 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2514 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2515 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002516 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2517 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2518 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2519 EXPECT_TRUE(agc_config.limiterEnable);
2520
2521 // Check interaction with adjust_agc_delta. Both should be respected, for
2522 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002523 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2524 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002525 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2526 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2527}
2528
wu@webrtc.org97077a32013-10-25 21:18:33 +00002529TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002530 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002531 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2532 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002533 send_parameters_.options.recording_sample_rate =
2534 rtc::Optional<uint32_t>(48000);
2535 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2536 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002537}
2538
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002540// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002542 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002543 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544}
2545
2546TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2547 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002548 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002549 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002550 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002551 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002552 EXPECT_TRUE(channel_->AddRecvStream(
2553 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002554 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2555 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556
solenberg85a04962015-10-27 03:35:21 -07002557 // Check stats for the added streams.
2558 {
2559 cricket::VoiceMediaInfo info;
2560 EXPECT_EQ(true, channel_->GetStats(&info));
2561
2562 // We have added one send stream. We should see the stats we've set.
2563 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002564 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002565 // We have added one receive stream. We should see empty stats.
2566 EXPECT_EQ(info.receivers.size(), 1u);
2567 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2568 }
solenberg1ac56142015-10-13 03:58:19 -07002569
solenberg566ef242015-11-06 15:34:49 -08002570 // Start sending - this affects some reported stats.
2571 {
2572 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002573 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002574 EXPECT_EQ(true, channel_->GetStats(&info));
2575 VerifyVoiceSenderInfo(info.senders[0], true);
2576 }
2577
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002578 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002579 {
2580 cricket::VoiceMediaInfo info;
2581 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2582 EXPECT_EQ(true, channel_->GetStats(&info));
2583 EXPECT_EQ(1u, info.senders.size());
2584 EXPECT_EQ(0u, info.receivers.size());
2585 }
solenberg1ac56142015-10-13 03:58:19 -07002586
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002587 // Deliver a new packet - a default receive stream should be created and we
2588 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002589 {
2590 cricket::VoiceMediaInfo info;
2591 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2592 SetAudioReceiveStreamStats();
2593 EXPECT_EQ(true, channel_->GetStats(&info));
2594 EXPECT_EQ(1u, info.senders.size());
2595 EXPECT_EQ(1u, info.receivers.size());
2596 VerifyVoiceReceiverInfo(info.receivers[0]);
2597 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598}
2599
2600// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002601// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002602TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002603 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002604 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002605 EXPECT_TRUE(channel_->AddRecvStream(
2606 cricket::StreamParams::CreateLegacy(kSsrc2)));
2607 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002608}
2609
2610// Test that the local SSRC is the same on sending and receiving channels if the
2611// receive channel is created before the send channel.
2612TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002613 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2615 int receive_channel_num = voe_.GetLastChannel();
2616 EXPECT_TRUE(channel_->AddSendStream(
2617 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618
solenberg3a941542015-11-16 07:34:50 -08002619 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002620 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002621}
2622
2623// Test that we can properly receive packets.
2624TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002625 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002626 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002628
2629 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2630 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002631}
2632
2633// Test that we can properly receive packets on multiple streams.
2634TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002635 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002636 const uint32_t ssrc1 = 1;
2637 const uint32_t ssrc2 = 2;
2638 const uint32_t ssrc3 = 3;
2639 EXPECT_TRUE(channel_->AddRecvStream(
2640 cricket::StreamParams::CreateLegacy(ssrc1)));
2641 EXPECT_TRUE(channel_->AddRecvStream(
2642 cricket::StreamParams::CreateLegacy(ssrc2)));
2643 EXPECT_TRUE(channel_->AddRecvStream(
2644 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002646 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002647 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002648 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002649 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002650 }
mflodman3d7db262016-04-29 00:57:13 -07002651
2652 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2653 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2654 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2655
2656 EXPECT_EQ(s1.received_packets(), 0);
2657 EXPECT_EQ(s2.received_packets(), 0);
2658 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002659
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002661 EXPECT_EQ(s1.received_packets(), 0);
2662 EXPECT_EQ(s2.received_packets(), 0);
2663 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002664
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002665 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002666 EXPECT_EQ(s1.received_packets(), 1);
2667 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2668 EXPECT_EQ(s2.received_packets(), 0);
2669 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002670
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002671 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002672 EXPECT_EQ(s1.received_packets(), 1);
2673 EXPECT_EQ(s2.received_packets(), 1);
2674 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2675 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002676
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002678 EXPECT_EQ(s1.received_packets(), 1);
2679 EXPECT_EQ(s2.received_packets(), 1);
2680 EXPECT_EQ(s3.received_packets(), 1);
2681 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002682
mflodman3d7db262016-04-29 00:57:13 -07002683 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2684 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2685 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002686}
2687
solenberg7e63ef02015-11-20 00:19:43 -08002688// Test that receiving on an unsignalled stream works (default channel will be
2689// created).
2690TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002691 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002692 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2693
solenberg7e63ef02015-11-20 00:19:43 -08002694 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002695
2696 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2697 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2698 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002699}
2700
2701// Test that receiving on an unsignalled stream works (default channel will be
2702// created), and that packets will be forwarded to the default channel
2703// regardless of their SSRCs.
2704TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002705 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002706 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002707 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2708
mflodman3d7db262016-04-29 00:57:13 -07002709 // Note that ssrc = 0 is not supported.
2710 uint32_t ssrc = 1;
2711 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002712 rtc::SetBE32(&packet[8], ssrc);
2713 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002714
2715 // Verify we only have one default stream.
2716 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2717 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2718 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002719 }
mflodman3d7db262016-04-29 00:57:13 -07002720
2721 // Sending the same ssrc again should not create a new stream.
2722 --ssrc;
2723 DeliverPacket(packet, sizeof(packet));
2724 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2725 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2726 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002727}
2728
2729// Test that a default channel is created even after a signalled stream has been
2730// added, and that this stream will get any packets for unknown SSRCs.
2731TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002732 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002733 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002734 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2735
2736 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002737 const uint32_t signaled_ssrc = 1;
2738 rtc::SetBE32(&packet[8], signaled_ssrc);
2739 EXPECT_TRUE(channel_->AddRecvStream(
2740 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002741 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002742 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2743 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002744
2745 // Note that the first unknown SSRC cannot be 0, because we only support
2746 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002747 const uint32_t unsignaled_ssrc = 7011;
2748 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002749 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002750 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2751 packet, sizeof(packet)));
2752 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2753
2754 DeliverPacket(packet, sizeof(packet));
2755 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2756
2757 rtc::SetBE32(&packet[8], signaled_ssrc);
2758 DeliverPacket(packet, sizeof(packet));
2759 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2760 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002761}
2762
solenberg0a617e22015-10-20 15:49:38 -07002763// Test that we properly handle failures to add a receive stream.
2764TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002765 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768}
2769
solenberg0a617e22015-10-20 15:49:38 -07002770// Test that we properly handle failures to add a send stream.
2771TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002772 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002773 voe_.set_fail_create_channel(true);
2774 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2775}
2776
solenberg1ac56142015-10-13 03:58:19 -07002777// Test that AddRecvStream creates new stream.
2778TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002779 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 int channel_num = voe_.GetLastChannel();
2781 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002782 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002783}
2784
2785// Test that after adding a recv stream, we do not decode more codecs than
2786// those previously passed into SetRecvCodecs.
2787TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002788 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002789 cricket::AudioRecvParameters parameters;
2790 parameters.codecs.push_back(kIsacCodec);
2791 parameters.codecs.push_back(kPcmuCodec);
2792 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002793 EXPECT_TRUE(channel_->AddRecvStream(
2794 cricket::StreamParams::CreateLegacy(kSsrc1)));
2795 int channel_num2 = voe_.GetLastChannel();
2796 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002797 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002798 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002799 gcodec.channels = 2;
2800 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2801}
2802
2803// Test that we properly clean up any streams that were added, even if
2804// not explicitly removed.
2805TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002806 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002807 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002808 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2809 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2810 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2811 delete channel_;
2812 channel_ = NULL;
2813 EXPECT_EQ(0, voe_.GetNumChannels());
2814}
2815
wu@webrtc.org78187522013-10-07 23:32:02 +00002816TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002817 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002818 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2819}
2820
2821TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002822 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002823 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002824 // Manually delete channel to simulate a failure.
2825 int channel = voe_.GetLastChannel();
2826 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2827 // Add recv stream 2 should work.
2828 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002829 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002830 EXPECT_NE(channel, new_channel);
2831 // The last created channel is deleted too.
2832 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002833}
2834
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002835// Test the InsertDtmf on default send stream as caller.
2836TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2837 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002838}
2839
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002840// Test the InsertDtmf on default send stream as callee
2841TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2842 TestInsertDtmf(0, false);
2843}
2844
2845// Test the InsertDtmf on specified send stream as caller.
2846TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2847 TestInsertDtmf(kSsrc1, true);
2848}
2849
2850// Test the InsertDtmf on specified send stream as callee.
2851TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2852 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002853}
2854
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002856 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002857 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002858 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002859 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2860 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2861 EXPECT_TRUE(channel_->SetPlayout(true));
2862 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2863 EXPECT_TRUE(channel_->SetPlayout(false));
2864 EXPECT_FALSE(channel_->SetPlayout(true));
2865}
2866
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002867TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002868 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002869 EXPECT_CALL(adm_,
2870 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2871 EXPECT_CALL(adm_,
2872 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2873 EXPECT_CALL(adm_,
2874 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002875 bool ec_enabled;
2876 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002877 webrtc::AecmModes aecm_mode;
2878 bool cng_enabled;
2879 bool agc_enabled;
2880 webrtc::AgcModes agc_mode;
2881 webrtc::AgcConfig agc_config;
2882 bool ns_enabled;
2883 webrtc::NsModes ns_mode;
2884 bool highpass_filter_enabled;
2885 bool stereo_swapping_enabled;
2886 bool typing_detection_enabled;
2887 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002888 voe_.GetAecmMode(aecm_mode, cng_enabled);
2889 voe_.GetAgcStatus(agc_enabled, agc_mode);
2890 voe_.GetAgcConfig(agc_config);
2891 voe_.GetNsStatus(ns_enabled, ns_mode);
2892 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2893 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2894 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2895 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002896 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897 EXPECT_FALSE(cng_enabled);
2898 EXPECT_TRUE(agc_enabled);
2899 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2900 EXPECT_TRUE(ns_enabled);
2901 EXPECT_TRUE(highpass_filter_enabled);
2902 EXPECT_FALSE(stereo_swapping_enabled);
2903 EXPECT_TRUE(typing_detection_enabled);
2904 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2905 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002906 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2907 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002908
solenberg246b8172015-12-08 09:50:23 -08002909 // Nothing set in AudioOptions, so everything should be as default.
2910 send_parameters_.options = cricket::AudioOptions();
2911 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002912 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002913 voe_.GetAecmMode(aecm_mode, cng_enabled);
2914 voe_.GetAgcStatus(agc_enabled, agc_mode);
2915 voe_.GetAgcConfig(agc_config);
2916 voe_.GetNsStatus(ns_enabled, ns_mode);
2917 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2918 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2919 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2920 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002921 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002922 EXPECT_FALSE(cng_enabled);
2923 EXPECT_TRUE(agc_enabled);
2924 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2925 EXPECT_TRUE(ns_enabled);
2926 EXPECT_TRUE(highpass_filter_enabled);
2927 EXPECT_FALSE(stereo_swapping_enabled);
2928 EXPECT_TRUE(typing_detection_enabled);
2929 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2930 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002931 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2932 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933
2934 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002935 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2936 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937 voe_.GetEcStatus(ec_enabled, ec_mode);
2938 EXPECT_FALSE(ec_enabled);
2939
2940 // Turn echo cancellation back on, with settings, and make sure
2941 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002942 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2943 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002945 voe_.GetAecmMode(aecm_mode, cng_enabled);
2946 voe_.GetAgcStatus(agc_enabled, agc_mode);
2947 voe_.GetAgcConfig(agc_config);
2948 voe_.GetNsStatus(ns_enabled, ns_mode);
2949 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2950 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2951 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2952 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002953 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002954 EXPECT_TRUE(agc_enabled);
2955 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2956 EXPECT_TRUE(ns_enabled);
2957 EXPECT_TRUE(highpass_filter_enabled);
2958 EXPECT_FALSE(stereo_swapping_enabled);
2959 EXPECT_TRUE(typing_detection_enabled);
2960 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2961 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2962
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002963 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2964 // control.
solenberg246b8172015-12-08 09:50:23 -08002965 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2966 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002967 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002968 voe_.GetAecmMode(aecm_mode, cng_enabled);
2969 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002970 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002971 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2972
2973 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002974 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2975 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2976 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2977 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002978 voe_.GetEcStatus(ec_enabled, ec_mode);
2979 EXPECT_FALSE(ec_enabled);
2980 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002981 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2982 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002983 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002984 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002985 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002986 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2987
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002988 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002989 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2990 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002991 voe_.GetAgcStatus(agc_enabled, agc_mode);
2992 EXPECT_FALSE(agc_enabled);
2993
2994 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002995 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2996 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2997 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998 voe_.GetAgcStatus(agc_enabled, agc_mode);
2999 EXPECT_TRUE(agc_enabled);
3000 voe_.GetAgcConfig(agc_config);
3001 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3002
3003 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08003004 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
3005 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
3006 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
3007 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
3008 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003009 voe_.GetNsStatus(ns_enabled, ns_mode);
3010 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3011 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3012 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3013 EXPECT_FALSE(ns_enabled);
3014 EXPECT_FALSE(highpass_filter_enabled);
3015 EXPECT_FALSE(typing_detection_enabled);
3016 EXPECT_TRUE(stereo_swapping_enabled);
3017
solenberg1ac56142015-10-13 03:58:19 -07003018 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08003019 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003020 voe_.GetEcStatus(ec_enabled, ec_mode);
3021 voe_.GetNsStatus(ns_enabled, ns_mode);
3022 EXPECT_TRUE(ec_enabled);
3023 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3024 EXPECT_FALSE(ns_enabled);
3025 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3026}
3027
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003028TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003029 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003030
3031 bool ec_enabled;
3032 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003033 bool agc_enabled;
3034 webrtc::AgcModes agc_mode;
3035 bool ns_enabled;
3036 webrtc::NsModes ns_mode;
3037 bool highpass_filter_enabled;
3038 bool stereo_swapping_enabled;
3039 bool typing_detection_enabled;
3040
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003041 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003042 voe_.GetAgcStatus(agc_enabled, agc_mode);
3043 voe_.GetNsStatus(ns_enabled, ns_mode);
3044 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3045 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3046 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3047 EXPECT_TRUE(ec_enabled);
3048 EXPECT_TRUE(agc_enabled);
3049 EXPECT_TRUE(ns_enabled);
3050 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003051 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003052 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003053}
3054
3055TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3056 webrtc::AgcConfig set_config = {0};
3057 set_config.targetLeveldBOv = 3;
3058 set_config.digitalCompressionGaindB = 9;
3059 set_config.limiterEnable = true;
3060 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003061
3062 webrtc::AgcConfig config = {0};
3063 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3064 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3065 EXPECT_EQ(set_config.digitalCompressionGaindB,
3066 config.digitalCompressionGaindB);
3067 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3068}
3069
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003070TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003071 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003072 EXPECT_CALL(adm_,
3073 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3074 EXPECT_CALL(adm_,
3075 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3076 EXPECT_CALL(adm_,
3077 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3078
kwiberg686a8ef2016-02-26 03:00:35 -08003079 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003080 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003081 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003082 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003083 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003084 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003085
3086 // Have to add a stream to make SetSend work.
3087 cricket::StreamParams stream1;
3088 stream1.ssrcs.push_back(1);
3089 channel1->AddSendStream(stream1);
3090 cricket::StreamParams stream2;
3091 stream2.ssrcs.push_back(2);
3092 channel2->AddSendStream(stream2);
3093
3094 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003095 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003096 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3097 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3098 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003099 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3100 EXPECT_EQ(parameters_options_all.options, channel1->options());
3101 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3102 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003103
3104 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003105 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003106 parameters_options_no_ns.options.noise_suppression =
3107 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003108 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3109 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003110 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3111 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3112 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003113 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003114
3115 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003116 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003117 parameters_options_no_agc.options.auto_gain_control =
3118 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003119 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003120 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3121 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3122 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003123 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003124
solenberg246b8172015-12-08 09:50:23 -08003125 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003126 bool ec_enabled;
3127 webrtc::EcModes ec_mode;
3128 bool agc_enabled;
3129 webrtc::AgcModes agc_mode;
3130 bool ns_enabled;
3131 webrtc::NsModes ns_mode;
3132 voe_.GetEcStatus(ec_enabled, ec_mode);
3133 voe_.GetAgcStatus(agc_enabled, agc_mode);
3134 voe_.GetNsStatus(ns_enabled, ns_mode);
3135 EXPECT_TRUE(ec_enabled);
3136 EXPECT_TRUE(agc_enabled);
3137 EXPECT_TRUE(ns_enabled);
3138
solenbergd53a3f92016-04-14 13:56:37 -07003139 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003140 voe_.GetEcStatus(ec_enabled, ec_mode);
3141 voe_.GetAgcStatus(agc_enabled, agc_mode);
3142 voe_.GetNsStatus(ns_enabled, ns_mode);
3143 EXPECT_TRUE(ec_enabled);
3144 EXPECT_TRUE(agc_enabled);
3145 EXPECT_FALSE(ns_enabled);
3146
solenbergd53a3f92016-04-14 13:56:37 -07003147 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003148 voe_.GetEcStatus(ec_enabled, ec_mode);
3149 voe_.GetAgcStatus(agc_enabled, agc_mode);
3150 voe_.GetNsStatus(ns_enabled, ns_mode);
3151 EXPECT_TRUE(ec_enabled);
3152 EXPECT_FALSE(agc_enabled);
3153 EXPECT_TRUE(ns_enabled);
3154
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003155 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003156 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003157 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3158 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003159 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003160 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003161 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003162 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003163 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003164 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003165 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3166 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3167 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003168 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003169 voe_.GetEcStatus(ec_enabled, ec_mode);
3170 voe_.GetAgcStatus(agc_enabled, agc_mode);
3171 voe_.GetNsStatus(ns_enabled, ns_mode);
3172 EXPECT_TRUE(ec_enabled);
3173 EXPECT_FALSE(agc_enabled);
3174 EXPECT_FALSE(ns_enabled);
3175}
3176
wu@webrtc.orgde305012013-10-31 15:40:38 +00003177// This test verifies DSCP settings are properly applied on voice media channel.
3178TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003179 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003180 cricket::FakeNetworkInterface network_interface;
3181 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003182 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003183
solenbergbc37fc82016-04-04 09:54:44 -07003184 channel.reset(
3185 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003186 channel->SetInterface(&network_interface);
3187 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3188 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3189
3190 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003191 channel.reset(
3192 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003193 channel->SetInterface(&network_interface);
3194 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3195
3196 // Verify that setting the option to false resets the
3197 // DiffServCodePoint.
3198 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003199 channel.reset(
3200 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003201 channel->SetInterface(&network_interface);
3202 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3203 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3204
3205 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003206}
3207
solenberg1ac56142015-10-13 03:58:19 -07003208TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003209 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003210 cricket::WebRtcVoiceMediaChannel* media_channel =
3211 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003212 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3213 EXPECT_TRUE(channel_->AddRecvStream(
3214 cricket::StreamParams::CreateLegacy(kSsrc1)));
3215 int channel_id = voe_.GetLastChannel();
3216 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3217 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3218 EXPECT_TRUE(channel_->AddRecvStream(
3219 cricket::StreamParams::CreateLegacy(kSsrc2)));
3220 int channel_id2 = voe_.GetLastChannel();
3221 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003222}
3223
solenberg1ac56142015-10-13 03:58:19 -07003224TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003225 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003226 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003227 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3228 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3229 EXPECT_TRUE(channel_->AddSendStream(
3230 cricket::StreamParams::CreateLegacy(kSsrc1)));
3231 int channel_id = voe_.GetLastChannel();
3232 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3233 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3234 EXPECT_TRUE(channel_->AddSendStream(
3235 cricket::StreamParams::CreateLegacy(kSsrc2)));
3236 int channel_id2 = voe_.GetLastChannel();
3237 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003238}
3239
solenberg4bac9c52015-10-09 02:32:53 -07003240TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003241 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003242 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003243 cricket::StreamParams stream;
3244 stream.ssrcs.push_back(kSsrc2);
3245 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003246 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003247 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003248 float scale = 0;
3249 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3250 EXPECT_DOUBLE_EQ(3, scale);
3251}
3252
3253TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003254 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003255 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3256 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3257 int channel_id = voe_.GetLastChannel();
3258 float scale = 0;
3259 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3260 EXPECT_DOUBLE_EQ(2, scale);
3261 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003262 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003263 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003264}
3265
pbos8fc7fa72015-07-15 08:02:58 -07003266TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003267 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003268 const std::string kSyncLabel = "AvSyncLabel";
3269
solenbergff976312016-03-30 23:28:51 -07003270 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003271 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3272 sp.sync_label = kSyncLabel;
3273 // Creating two channels to make sure that sync label is set properly for both
3274 // the default voice channel and following ones.
3275 EXPECT_TRUE(channel_->AddRecvStream(sp));
3276 sp.ssrcs[0] += 1;
3277 EXPECT_TRUE(channel_->AddRecvStream(sp));
3278
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003279 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003280 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003281 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003282 << "SyncGroup should be set based on sync_label";
3283 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003284 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003285 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003286}
3287
solenberg3a941542015-11-16 07:34:50 -08003288// TODO(solenberg): Remove, once recv streams are configured through Call.
3289// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003290TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003291 // Test that setting the header extensions results in the expected state
3292 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003293 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003294 ssrcs.push_back(223);
3295 ssrcs.push_back(224);
3296
solenbergff976312016-03-30 23:28:51 -07003297 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003298 cricket::WebRtcVoiceMediaChannel* media_channel =
3299 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003300 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003301 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003302 EXPECT_TRUE(media_channel->AddRecvStream(
3303 cricket::StreamParams::CreateLegacy(ssrc)));
3304 }
3305
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003306 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003307 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003308 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003309 EXPECT_NE(nullptr, s);
3310 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3311 }
3312
3313 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003314 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003315 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003316 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003317 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003318 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003319 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003320 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003321 EXPECT_NE(nullptr, s);
3322 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003323 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3324 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003325 for (const auto& s_ext : s_exts) {
3326 if (e_ext.id == s_ext.id) {
3327 EXPECT_EQ(e_ext.uri, s_ext.name);
3328 }
3329 }
3330 }
3331 }
3332
3333 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003334 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003335 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003336 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003337 EXPECT_NE(nullptr, s);
3338 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3339 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003340}
3341
3342TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3343 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003344 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003345 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003346 static const unsigned char kRtcp[] = {
3347 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3348 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3351 };
jbaucheec21bd2016-03-20 06:15:43 -07003352 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003353
solenbergff976312016-03-30 23:28:51 -07003354 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003355 cricket::WebRtcVoiceMediaChannel* media_channel =
3356 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003357 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003358 EXPECT_TRUE(media_channel->AddRecvStream(
3359 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3360
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003361 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003362 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003363 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003364 EXPECT_EQ(0, s->received_packets());
3365 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3366 EXPECT_EQ(1, s->received_packets());
3367 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3368 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003369}
Minyue2013aec2015-05-13 14:14:42 +02003370
solenberg0a617e22015-10-20 15:49:38 -07003371// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003372// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003373TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003374 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003375 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003376 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003377 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3378 int recv_ch = voe_.GetLastChannel();
3379 EXPECT_NE(recv_ch, default_channel);
3380 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3381 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3382 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003383 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3384 recv_ch = voe_.GetLastChannel();
3385 EXPECT_NE(recv_ch, default_channel);
3386 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003387}
3388
3389TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003390 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003391 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003392
3393 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3394 int recv_ch = voe_.GetLastChannel();
3395
3396 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3397 int send_ch = voe_.GetLastChannel();
3398
3399 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3400 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3401 // channel of |recv_ch|.This is not a common case, since, normally, only the
3402 // default channel can be associated. However, the default is not deletable.
3403 // So we force the |recv_ch| to associate with a non-default channel.
3404 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3405 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3406
3407 EXPECT_TRUE(channel_->RemoveSendStream(2));
3408 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3409}
stefan658910c2015-09-03 05:48:32 -07003410
deadbeef884f5852016-01-15 09:20:04 -08003411TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003412 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003413 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3414 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003415
3416 // Setting the sink before a recv stream exists should do nothing.
3417 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3418 EXPECT_TRUE(
3419 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3420 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3421
3422 // Now try actually setting the sink.
3423 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3424 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3425
3426 // Now try resetting it.
3427 channel_->SetRawAudioSink(kSsrc1, nullptr);
3428 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3429}
3430
3431TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003432 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003433 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3434 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003435
3436 // Should be able to set a default sink even when no stream exists.
3437 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3438
3439 // Create default channel and ensure it's assigned the default sink.
3440 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3441 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3442
3443 // Try resetting the default sink.
3444 channel_->SetRawAudioSink(0, nullptr);
3445 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3446
3447 // Try setting the default sink while the default stream exists.
3448 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3449 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3450
3451 // If we remove and add a default stream, it should get the same sink.
3452 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3453 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3454 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3455}
3456
skvlad7a43d252016-03-22 15:32:27 -07003457// Test that, just like the video channel, the voice channel communicates the
3458// network state to the call.
3459TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003460 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003461
3462 EXPECT_EQ(webrtc::kNetworkUp,
3463 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3464 EXPECT_EQ(webrtc::kNetworkUp,
3465 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3466
3467 channel_->OnReadyToSend(false);
3468 EXPECT_EQ(webrtc::kNetworkDown,
3469 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3470 EXPECT_EQ(webrtc::kNetworkUp,
3471 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3472
3473 channel_->OnReadyToSend(true);
3474 EXPECT_EQ(webrtc::kNetworkUp,
3475 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3476 EXPECT_EQ(webrtc::kNetworkUp,
3477 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3478}
3479
stefan658910c2015-09-03 05:48:32 -07003480// Tests that the library initializes and shuts down properly.
3481TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003482 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003483 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003484 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003485 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3486 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003487 EXPECT_TRUE(channel != nullptr);
3488 delete channel;
solenbergff976312016-03-30 23:28:51 -07003489}
stefan658910c2015-09-03 05:48:32 -07003490
solenbergff976312016-03-30 23:28:51 -07003491// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003492TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3493 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3494 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3495 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003496 {
3497 cricket::WebRtcVoiceEngine engine(&adm);
3498 std::unique_ptr<webrtc::Call> call(
3499 webrtc::Call::Create(webrtc::Call::Config()));
3500 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3501 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3502 EXPECT_TRUE(channel != nullptr);
3503 delete channel;
3504 }
stefan658910c2015-09-03 05:48:32 -07003505}
3506
3507// Tests that the library is configured with the codecs we want.
3508TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003509 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003510 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003511 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003512 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003513 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003514 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003515 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003516 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003517 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003518 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003519 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003520 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003521 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003522 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003523 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003524 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003525 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003526 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003527 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003528 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003529 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003530 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003531 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003532 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003533 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003534 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003535 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003536 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003537 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003538 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003539 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003540 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003541 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003542 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003543 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003544 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003545 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003546 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003547 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003548 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003549 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003550 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003551 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003552 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003553 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003554 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003555 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003556 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003557 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003558 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003559 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003560
stefan658910c2015-09-03 05:48:32 -07003561 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003562 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003563 for (std::vector<cricket::AudioCodec>::const_iterator it =
3564 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3565 if (it->name == "CN" && it->clockrate == 16000) {
3566 EXPECT_EQ(105, it->id);
3567 } else if (it->name == "CN" && it->clockrate == 32000) {
3568 EXPECT_EQ(106, it->id);
3569 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3570 EXPECT_EQ(103, it->id);
3571 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3572 EXPECT_EQ(104, it->id);
3573 } else if (it->name == "G722" && it->clockrate == 8000) {
3574 EXPECT_EQ(9, it->id);
3575 } else if (it->name == "telephone-event") {
3576 EXPECT_EQ(126, it->id);
3577 } else if (it->name == "red") {
3578 EXPECT_EQ(127, it->id);
3579 } else if (it->name == "opus") {
3580 EXPECT_EQ(111, it->id);
3581 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3582 EXPECT_EQ("10", it->params.find("minptime")->second);
3583 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3584 EXPECT_EQ("60", it->params.find("maxptime")->second);
3585 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3586 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3587 }
3588 }
stefan658910c2015-09-03 05:48:32 -07003589}
3590
3591// Tests that VoE supports at least 32 channels
3592TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003593 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003594 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003595 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003596
3597 cricket::VoiceMediaChannel* channels[32];
3598 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003599 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003600 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3601 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003602 if (!channel)
3603 break;
stefan658910c2015-09-03 05:48:32 -07003604 channels[num_channels++] = channel;
3605 }
3606
tfarina5237aaf2015-11-10 23:44:30 -08003607 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003608 EXPECT_EQ(expected, num_channels);
3609
3610 while (num_channels > 0) {
3611 delete channels[--num_channels];
3612 }
stefan658910c2015-09-03 05:48:32 -07003613}
3614
3615// Test that we set our preferred codecs properly.
3616TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003617 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003618 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003619 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003620 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3621 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003622 cricket::AudioRecvParameters parameters;
3623 parameters.codecs = engine.codecs();
3624 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003625}