blob: 4446e27c162195a767dce775d954d03ad0c6ba90 [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) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700237 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700238 EXPECT_EQ(1UL, parameters.encodings.size());
239
240 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700241 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700242 }
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 =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700276 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700277 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
solenberg31fec402016-05-06 02:13:12 -0700497// Test that we can add a send stream and that it has the correct defaults.
498TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
499 EXPECT_TRUE(SetupChannel());
500 EXPECT_TRUE(
501 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
502 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
503 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
504 EXPECT_EQ("", config.rtp.c_name);
505 EXPECT_EQ(0u, config.rtp.extensions.size());
506 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
507 config.send_transport);
508}
509
510// Test that we can add a receive stream and that it has the correct defaults.
511TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
512 EXPECT_TRUE(SetupChannel());
513 EXPECT_TRUE(
514 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
515 const webrtc::AudioReceiveStream::Config& config =
516 GetRecvStreamConfig(kSsrc1);
517 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
518 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
519 EXPECT_FALSE(config.rtp.transport_cc);
520 EXPECT_EQ(0u, config.rtp.extensions.size());
521 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
522 config.rtcp_send_transport);
523 EXPECT_EQ("", config.sync_group);
524}
525
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700527// correctly (such that opus appears first).
528TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700529 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 ASSERT_FALSE(codecs.empty());
531 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
532 EXPECT_EQ(48000, codecs[0].clockrate);
533 EXPECT_EQ(2, codecs[0].channels);
534 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535}
536
stefanba4c0e42016-02-04 04:12:24 -0800537TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700538 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800539 bool opus_found = false;
540 for (cricket::AudioCodec codec : codecs) {
541 if (codec.name == "opus") {
542 EXPECT_TRUE(HasTransportCc(codec));
543 opus_found = true;
544 }
545 }
546 EXPECT_TRUE(opus_found);
547}
548
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549// Tests that we can find codecs by name or id, and that we interpret the
550// clockrate and bitrate fields properly.
551TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
552 cricket::AudioCodec codec;
553 webrtc::CodecInst codec_inst;
554 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800555 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800557 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800559 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
560 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561 // Find ISAC with a different payload id.
562 codec = kIsacCodec;
563 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800564 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000565 EXPECT_EQ(codec.id, codec_inst.pltype);
566 // Find PCMU with a 0 clockrate.
567 codec = kPcmuCodec;
568 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800569 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 EXPECT_EQ(codec.id, codec_inst.pltype);
571 EXPECT_EQ(8000, codec_inst.plfreq);
572 // Find PCMU with a 0 bitrate.
573 codec = kPcmuCodec;
574 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800575 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000576 EXPECT_EQ(codec.id, codec_inst.pltype);
577 EXPECT_EQ(64000, codec_inst.rate);
578 // Find ISAC with an explicit bitrate.
579 codec = kIsacCodec;
580 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800581 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 EXPECT_EQ(codec.id, codec_inst.pltype);
583 EXPECT_EQ(32000, codec_inst.rate);
584}
585
586// Test that we set our inbound codecs properly, including changing PT.
587TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700588 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200589 cricket::AudioRecvParameters parameters;
590 parameters.codecs.push_back(kIsacCodec);
591 parameters.codecs.push_back(kPcmuCodec);
592 parameters.codecs.push_back(kTelephoneEventCodec);
593 parameters.codecs[0].id = 106; // collide with existing telephone-event
594 parameters.codecs[2].id = 126;
595 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700596 EXPECT_TRUE(channel_->AddRecvStream(
597 cricket::StreamParams::CreateLegacy(kSsrc1)));
598 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800600 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 gcodec.plfreq = 16000;
602 gcodec.channels = 1;
603 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
604 EXPECT_EQ(106, gcodec.pltype);
605 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800606 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 gcodec.plfreq = 8000;
608 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
609 EXPECT_EQ(126, gcodec.pltype);
610 EXPECT_STREQ("telephone-event", gcodec.plname);
611}
612
613// Test that we fail to set an unknown inbound codec.
614TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700615 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200616 cricket::AudioRecvParameters parameters;
617 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700618 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620}
621
622// Test that we fail if we have duplicate types in the inbound list.
623TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700624 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200625 cricket::AudioRecvParameters parameters;
626 parameters.codecs.push_back(kIsacCodec);
627 parameters.codecs.push_back(kCn16000Codec);
628 parameters.codecs[1].id = kIsacCodec.id;
629 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630}
631
632// Test that we can decode OPUS without stereo parameters.
633TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700634 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200635 cricket::AudioRecvParameters parameters;
636 parameters.codecs.push_back(kIsacCodec);
637 parameters.codecs.push_back(kPcmuCodec);
638 parameters.codecs.push_back(kOpusCodec);
639 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 EXPECT_TRUE(channel_->AddRecvStream(
641 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700642 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800644 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Even without stereo parameters, recv codecs still specify channels = 2.
646 EXPECT_EQ(2, opus.channels);
647 EXPECT_EQ(111, opus.pltype);
648 EXPECT_STREQ("opus", opus.plname);
649 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700650 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 EXPECT_EQ(111, opus.pltype);
652}
653
654// Test that we can decode OPUS with stereo = 0.
655TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700656 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200657 cricket::AudioRecvParameters parameters;
658 parameters.codecs.push_back(kIsacCodec);
659 parameters.codecs.push_back(kPcmuCodec);
660 parameters.codecs.push_back(kOpusCodec);
661 parameters.codecs[2].params["stereo"] = "0";
662 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 EXPECT_TRUE(channel_->AddRecvStream(
664 cricket::StreamParams::CreateLegacy(kSsrc1)));
665 int channel_num2 = voe_.GetLastChannel();
666 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800667 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 // Even when stereo is off, recv codecs still specify channels = 2.
669 EXPECT_EQ(2, opus.channels);
670 EXPECT_EQ(111, opus.pltype);
671 EXPECT_STREQ("opus", opus.plname);
672 opus.pltype = 0;
673 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
674 EXPECT_EQ(111, opus.pltype);
675}
676
677// Test that we can decode OPUS with stereo = 1.
678TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700679 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200680 cricket::AudioRecvParameters parameters;
681 parameters.codecs.push_back(kIsacCodec);
682 parameters.codecs.push_back(kPcmuCodec);
683 parameters.codecs.push_back(kOpusCodec);
684 parameters.codecs[2].params["stereo"] = "1";
685 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 EXPECT_TRUE(channel_->AddRecvStream(
687 cricket::StreamParams::CreateLegacy(kSsrc1)));
688 int channel_num2 = voe_.GetLastChannel();
689 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800690 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 EXPECT_EQ(2, opus.channels);
692 EXPECT_EQ(111, opus.pltype);
693 EXPECT_STREQ("opus", opus.plname);
694 opus.pltype = 0;
695 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
696 EXPECT_EQ(111, opus.pltype);
697}
698
699// Test that changes to recv codecs are applied to all streams.
700TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700701 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200702 cricket::AudioRecvParameters parameters;
703 parameters.codecs.push_back(kIsacCodec);
704 parameters.codecs.push_back(kPcmuCodec);
705 parameters.codecs.push_back(kTelephoneEventCodec);
706 parameters.codecs[0].id = 106; // collide with existing telephone-event
707 parameters.codecs[2].id = 126;
708 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_TRUE(channel_->AddRecvStream(
710 cricket::StreamParams::CreateLegacy(kSsrc1)));
711 int channel_num2 = voe_.GetLastChannel();
712 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800713 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714 gcodec.plfreq = 16000;
715 gcodec.channels = 1;
716 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
717 EXPECT_EQ(106, gcodec.pltype);
718 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800719 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 gcodec.plfreq = 8000;
721 gcodec.channels = 1;
722 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
723 EXPECT_EQ(126, gcodec.pltype);
724 EXPECT_STREQ("telephone-event", gcodec.plname);
725}
726
727TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700728 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200729 cricket::AudioRecvParameters parameters;
730 parameters.codecs.push_back(kIsacCodec);
731 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200732 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733
734 int channel_num2 = voe_.GetLastChannel();
735 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800736 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 gcodec.plfreq = 16000;
738 gcodec.channels = 1;
739 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
740 EXPECT_EQ(106, gcodec.pltype);
741 EXPECT_STREQ("ISAC", gcodec.plname);
742}
743
744// Test that we can apply the same set of codecs again while playing.
745TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700746 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200747 cricket::AudioRecvParameters parameters;
748 parameters.codecs.push_back(kIsacCodec);
749 parameters.codecs.push_back(kCn16000Codec);
750 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200752 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753
754 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755 parameters.codecs[0].id = 127;
756 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
757 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_TRUE(voe_.GetPlayout(channel_num));
759}
760
761// Test that we can add a codec while playing.
762TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700763 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764 cricket::AudioRecvParameters parameters;
765 parameters.codecs.push_back(kIsacCodec);
766 parameters.codecs.push_back(kCn16000Codec);
767 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768 EXPECT_TRUE(channel_->SetPlayout(true));
769
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200770 parameters.codecs.push_back(kOpusCodec);
771 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
772 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 EXPECT_TRUE(voe_.GetPlayout(channel_num));
774 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800775 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
777}
778
779TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700780 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000782 // Test that when autobw is enabled, bitrate is kept as the default
783 // value. autobw is enabled for the following tests because the target
784 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785
786 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700787 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788
789 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700790 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700793 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794}
795
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000796TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700797 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000799 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
801 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700802 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
803 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
804 // Rates above the max (56000) should be capped.
805 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000807 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700808 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
809 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
810 // Rates above the max (510000) should be capped.
811 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812}
813
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000814TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700815 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000816
817 // Test that we can only set a maximum bitrate for a fixed-rate codec
818 // if it's bigger than the fixed rate.
819
820 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700821 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
822 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
823 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
824 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
825 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
826 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
827 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000828}
829
830TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700831 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200832 const int kDesiredBitrate = 128000;
833 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700834 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835 parameters.max_bandwidth_bps = kDesiredBitrate;
836 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000837
838 EXPECT_TRUE(channel_->AddSendStream(
839 cricket::StreamParams::CreateLegacy(kSsrc1)));
840
841 int channel_num = voe_.GetLastChannel();
842 webrtc::CodecInst codec;
843 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000845}
846
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847// Test that bitrate cannot be set for CBR codecs.
848// Bitrate is ignored if it is higher than the fixed bitrate.
849// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000850TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700851 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852
853 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200854 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
855 int channel_num = voe_.GetLastChannel();
856 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
858 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200859
860 send_parameters_.max_bandwidth_bps = 128000;
861 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
863 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200864
865 send_parameters_.max_bandwidth_bps = 128;
866 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
868 EXPECT_EQ(64000, codec.rate);
869}
870
skvlade0d46372016-04-07 22:59:22 -0700871// Test that the per-stream bitrate limit and the global
872// bitrate limit both apply.
873TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
874 EXPECT_TRUE(SetupSendStream());
875
876 // opus, default bitrate == 64000.
877 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
878 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
879 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
880 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
881
882 // CBR codecs allow both maximums to exceed the bitrate.
883 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
884 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
885 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
886 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
887
888 // CBR codecs don't allow per stream maximums to be too low.
889 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
890 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
891}
892
893// Test that an attempt to set RtpParameters for a stream that does not exist
894// fails.
895TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
896 EXPECT_TRUE(SetupChannel());
897 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700898 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700899 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
900
901 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700902 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700903}
904
905TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700906 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700907 // This test verifies that setting RtpParameters succeeds only if
908 // the structure contains exactly one encoding.
909 // TODO(skvlad): Update this test when we start supporting setting parameters
910 // for each encoding individually.
911
912 EXPECT_TRUE(SetupSendStream());
913 // Setting RtpParameters with no encoding is expected to fail.
914 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700915 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700916 // Setting RtpParameters with exactly one encoding should succeed.
917 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700918 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700919 // Two or more encodings should result in failure.
920 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700921 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700922}
923
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700924// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700925// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700926TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
927 EXPECT_TRUE(SetupSendStream());
928 SetSend(channel_, true);
929 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
930 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700931 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700932 ASSERT_EQ(1u, parameters.encodings.size());
933 ASSERT_TRUE(parameters.encodings[0].active);
934 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700935 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700936 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
937
938 // Now change it back to active and verify we resume sending.
939 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700940 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700941 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
942}
943
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700944// Test that SetRtpSendParameters configures the correct encoding channel for
945// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700946TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
947 SetupForMultiSendStream();
948 // Create send streams.
949 for (uint32_t ssrc : kSsrcs4) {
950 EXPECT_TRUE(
951 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
952 }
953 // Configure one stream to be limited by the stream config, another to be
954 // limited by the global max, and the third one with no per-stream limit
955 // (still subject to the global limit).
956 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
957 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
958 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
959 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
960
961 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
962 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
963 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
964
965 // Remove the global cap; the streams should switch to their respective
966 // maximums (or remain unchanged if there was no other limit on them.)
967 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
968 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
969 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
970 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
971}
972
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700973// Test that GetRtpSendParameters returns the currently configured codecs.
974TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700975 EXPECT_TRUE(SetupSendStream());
976 cricket::AudioSendParameters parameters;
977 parameters.codecs.push_back(kIsacCodec);
978 parameters.codecs.push_back(kPcmuCodec);
979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
980
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700981 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700982 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700983 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
984 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700985}
986
987// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700988TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700989 EXPECT_TRUE(SetupSendStream());
990 cricket::AudioSendParameters parameters;
991 parameters.codecs.push_back(kIsacCodec);
992 parameters.codecs.push_back(kPcmuCodec);
993 EXPECT_TRUE(channel_->SetSendParameters(parameters));
994
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700995 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700996
997 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700998 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700999
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001000 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1001 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1002 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1003}
1004
1005// Test that GetRtpReceiveParameters returns the currently configured codecs.
1006TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1007 EXPECT_TRUE(SetupRecvStream());
1008 cricket::AudioRecvParameters parameters;
1009 parameters.codecs.push_back(kIsacCodec);
1010 parameters.codecs.push_back(kPcmuCodec);
1011 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1012
1013 webrtc::RtpParameters rtp_parameters =
1014 channel_->GetRtpReceiveParameters(kSsrc1);
1015 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1016 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1017 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1018}
1019
1020// Test that if we set/get parameters multiple times, we get the same results.
1021TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1022 EXPECT_TRUE(SetupRecvStream());
1023 cricket::AudioRecvParameters parameters;
1024 parameters.codecs.push_back(kIsacCodec);
1025 parameters.codecs.push_back(kPcmuCodec);
1026 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1027
1028 webrtc::RtpParameters initial_params =
1029 channel_->GetRtpReceiveParameters(kSsrc1);
1030
1031 // We should be able to set the params we just got.
1032 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1033
1034 // ... And this shouldn't change the params returned by
1035 // GetRtpReceiveParameters.
1036 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1037 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001038}
1039
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040// Test that we apply codecs properly.
1041TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001042 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001043 cricket::AudioSendParameters parameters;
1044 parameters.codecs.push_back(kIsacCodec);
1045 parameters.codecs.push_back(kPcmuCodec);
1046 parameters.codecs.push_back(kRedCodec);
1047 parameters.codecs[0].id = 96;
1048 parameters.codecs[0].bitrate = 48000;
1049 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001050 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001051 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 webrtc::CodecInst gcodec;
1053 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1054 EXPECT_EQ(96, gcodec.pltype);
1055 EXPECT_EQ(48000, gcodec.rate);
1056 EXPECT_STREQ("ISAC", gcodec.plname);
1057 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001058 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001059 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1060 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001061 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001062}
1063
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001064// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1065// to apply.
1066TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001067 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 cricket::AudioSendParameters parameters;
1069 parameters.codecs.push_back(kIsacCodec);
1070 parameters.codecs.push_back(kPcmuCodec);
1071 parameters.codecs.push_back(kRedCodec);
1072 parameters.codecs[0].id = 96;
1073 parameters.codecs[0].bitrate = 48000;
1074 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001075 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1076 // Calling SetSendCodec again with same codec which is already set.
1077 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001079 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1080}
1081
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001082// Verify that G722 is set with 16000 samples per second to WebRTC.
1083TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001084 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001085 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001086 cricket::AudioSendParameters parameters;
1087 parameters.codecs.push_back(kG722CodecSdp);
1088 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001089 webrtc::CodecInst gcodec;
1090 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1091 EXPECT_STREQ("G722", gcodec.plname);
1092 EXPECT_EQ(1, gcodec.channels);
1093 EXPECT_EQ(16000, gcodec.plfreq);
1094}
1095
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001096// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001098 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001099 cricket::AudioSendParameters parameters;
1100 parameters.codecs.push_back(kOpusCodec);
1101 parameters.codecs[0].bitrate = 0;
1102 parameters.codecs[0].clockrate = 50000;
1103 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104}
1105
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001106// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001108 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001109 cricket::AudioSendParameters parameters;
1110 parameters.codecs.push_back(kOpusCodec);
1111 parameters.codecs[0].bitrate = 0;
1112 parameters.codecs[0].channels = 0;
1113 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114}
1115
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001116// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001118 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001119 cricket::AudioSendParameters parameters;
1120 parameters.codecs.push_back(kOpusCodec);
1121 parameters.codecs[0].bitrate = 0;
1122 parameters.codecs[0].channels = 0;
1123 parameters.codecs[0].params["stereo"] = "1";
1124 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125}
1126
1127// Test that if channel is 1 for opus and there's no stereo, we fail.
1128TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001129 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001130 cricket::AudioSendParameters parameters;
1131 parameters.codecs.push_back(kOpusCodec);
1132 parameters.codecs[0].bitrate = 0;
1133 parameters.codecs[0].channels = 1;
1134 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135}
1136
1137// Test that if channel is 1 for opus and stereo=0, we fail.
1138TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001139 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001140 cricket::AudioSendParameters parameters;
1141 parameters.codecs.push_back(kOpusCodec);
1142 parameters.codecs[0].bitrate = 0;
1143 parameters.codecs[0].channels = 1;
1144 parameters.codecs[0].params["stereo"] = "0";
1145 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146}
1147
1148// Test that if channel is 1 for opus and stereo=1, we fail.
1149TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001150 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001151 cricket::AudioSendParameters parameters;
1152 parameters.codecs.push_back(kOpusCodec);
1153 parameters.codecs[0].bitrate = 0;
1154 parameters.codecs[0].channels = 1;
1155 parameters.codecs[0].params["stereo"] = "1";
1156 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157}
1158
1159// Test that with bitrate=0 and no stereo,
1160// channels and bitrate are 1 and 32000.
1161TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001162 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001164 cricket::AudioSendParameters parameters;
1165 parameters.codecs.push_back(kOpusCodec);
1166 parameters.codecs[0].bitrate = 0;
1167 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 webrtc::CodecInst gcodec;
1169 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1170 EXPECT_STREQ("opus", gcodec.plname);
1171 EXPECT_EQ(1, gcodec.channels);
1172 EXPECT_EQ(32000, gcodec.rate);
1173}
1174
1175// Test that with bitrate=0 and stereo=0,
1176// channels and bitrate are 1 and 32000.
1177TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001178 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001180 cricket::AudioSendParameters parameters;
1181 parameters.codecs.push_back(kOpusCodec);
1182 parameters.codecs[0].bitrate = 0;
1183 parameters.codecs[0].params["stereo"] = "0";
1184 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185 webrtc::CodecInst gcodec;
1186 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1187 EXPECT_STREQ("opus", gcodec.plname);
1188 EXPECT_EQ(1, gcodec.channels);
1189 EXPECT_EQ(32000, gcodec.rate);
1190}
1191
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001192// Test that with bitrate=invalid and stereo=0,
1193// channels and bitrate are 1 and 32000.
1194TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001195 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001196 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001197 cricket::AudioSendParameters parameters;
1198 parameters.codecs.push_back(kOpusCodec);
1199 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001200 webrtc::CodecInst gcodec;
1201
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001202 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001203 parameters.codecs[0].bitrate = 5999;
1204 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001205 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1206 EXPECT_STREQ("opus", gcodec.plname);
1207 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001208 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001209
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001210 parameters.codecs[0].bitrate = 510001;
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001212 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1213 EXPECT_STREQ("opus", gcodec.plname);
1214 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001215 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216}
1217
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218// Test that with bitrate=0 and stereo=1,
1219// channels and bitrate are 2 and 64000.
1220TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001221 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001223 cricket::AudioSendParameters parameters;
1224 parameters.codecs.push_back(kOpusCodec);
1225 parameters.codecs[0].bitrate = 0;
1226 parameters.codecs[0].params["stereo"] = "1";
1227 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 webrtc::CodecInst gcodec;
1229 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1230 EXPECT_STREQ("opus", gcodec.plname);
1231 EXPECT_EQ(2, gcodec.channels);
1232 EXPECT_EQ(64000, gcodec.rate);
1233}
1234
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001235// Test that with bitrate=invalid and stereo=1,
1236// channels and bitrate are 2 and 64000.
1237TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001238 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001239 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001240 cricket::AudioSendParameters parameters;
1241 parameters.codecs.push_back(kOpusCodec);
1242 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001243 webrtc::CodecInst gcodec;
1244
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001245 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001246 parameters.codecs[0].bitrate = 5999;
1247 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001248 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1249 EXPECT_STREQ("opus", gcodec.plname);
1250 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001251 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001252
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 parameters.codecs[0].bitrate = 510001;
1254 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001255 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1256 EXPECT_STREQ("opus", gcodec.plname);
1257 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001258 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001259}
1260
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261// Test that with bitrate=N and stereo unset,
1262// channels and bitrate are 1 and N.
1263TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001264 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001266 cricket::AudioSendParameters parameters;
1267 parameters.codecs.push_back(kOpusCodec);
1268 parameters.codecs[0].bitrate = 96000;
1269 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001270 webrtc::CodecInst gcodec;
1271 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1272 EXPECT_EQ(111, gcodec.pltype);
1273 EXPECT_EQ(96000, gcodec.rate);
1274 EXPECT_STREQ("opus", gcodec.plname);
1275 EXPECT_EQ(1, gcodec.channels);
1276 EXPECT_EQ(48000, gcodec.plfreq);
1277}
1278
1279// Test that with bitrate=N and stereo=0,
1280// channels and bitrate are 1 and N.
1281TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001282 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001283 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 cricket::AudioSendParameters parameters;
1285 parameters.codecs.push_back(kOpusCodec);
1286 parameters.codecs[0].bitrate = 30000;
1287 parameters.codecs[0].params["stereo"] = "0";
1288 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001289 webrtc::CodecInst gcodec;
1290 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1291 EXPECT_EQ(1, gcodec.channels);
1292 EXPECT_EQ(30000, gcodec.rate);
1293 EXPECT_STREQ("opus", gcodec.plname);
1294}
1295
1296// Test that with bitrate=N and without any parameters,
1297// channels and bitrate are 1 and N.
1298TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001299 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001301 cricket::AudioSendParameters parameters;
1302 parameters.codecs.push_back(kOpusCodec);
1303 parameters.codecs[0].bitrate = 30000;
1304 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001305 webrtc::CodecInst gcodec;
1306 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1307 EXPECT_EQ(1, gcodec.channels);
1308 EXPECT_EQ(30000, gcodec.rate);
1309 EXPECT_STREQ("opus", gcodec.plname);
1310}
1311
1312// Test that with bitrate=N and stereo=1,
1313// channels and bitrate are 2 and N.
1314TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001315 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001316 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001317 cricket::AudioSendParameters parameters;
1318 parameters.codecs.push_back(kOpusCodec);
1319 parameters.codecs[0].bitrate = 30000;
1320 parameters.codecs[0].params["stereo"] = "1";
1321 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001322 webrtc::CodecInst gcodec;
1323 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1324 EXPECT_EQ(2, gcodec.channels);
1325 EXPECT_EQ(30000, gcodec.rate);
1326 EXPECT_STREQ("opus", gcodec.plname);
1327}
1328
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001329// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1330// Also test that the "maxaveragebitrate" can't be set to values outside the
1331// range of 6000 and 510000
1332TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001333 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001334 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 cricket::AudioSendParameters parameters;
1336 parameters.codecs.push_back(kOpusCodec);
1337 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001338 webrtc::CodecInst gcodec;
1339
1340 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1342 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001343 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001344 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345
1346 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001347 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1348 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001349 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001350 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001351
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1353 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001354 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1355 EXPECT_EQ(200000, gcodec.rate);
1356}
1357
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001358// Test that we can enable NACK with opus as caller.
1359TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001360 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001362 cricket::AudioSendParameters parameters;
1363 parameters.codecs.push_back(kOpusCodec);
1364 parameters.codecs[0].AddFeedbackParam(
1365 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1366 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369 EXPECT_TRUE(voe_.GetNACK(channel_num));
1370}
1371
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001372// Test that we can enable NACK with opus as callee.
1373TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001374 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001375 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001376 cricket::AudioSendParameters parameters;
1377 parameters.codecs.push_back(kOpusCodec);
1378 parameters.codecs[0].AddFeedbackParam(
1379 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1380 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001381 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001382 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001383 // NACK should be enabled even with no send stream.
1384 EXPECT_TRUE(voe_.GetNACK(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001385
1386 EXPECT_TRUE(channel_->AddSendStream(
1387 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001388 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001389}
1390
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001391// Test that we can enable NACK on receive streams.
1392TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001393 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001394 int channel_num1 = voe_.GetLastChannel();
1395 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1396 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].AddFeedbackParam(
1400 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1401 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001402 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1403 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1406 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1407}
1408
1409// Test that we can disable NACK.
1410TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001411 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001412 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001413 cricket::AudioSendParameters parameters;
1414 parameters.codecs.push_back(kOpusCodec);
1415 parameters.codecs[0].AddFeedbackParam(
1416 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1417 cricket::kParamValueEmpty));
1418 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001419 EXPECT_TRUE(voe_.GetNACK(channel_num));
1420
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001421 parameters.codecs.clear();
1422 parameters.codecs.push_back(kOpusCodec);
1423 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424 EXPECT_FALSE(voe_.GetNACK(channel_num));
1425}
1426
1427// Test that we can disable NACK on receive streams.
1428TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001429 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 int channel_num1 = voe_.GetLastChannel();
1431 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1432 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 cricket::AudioSendParameters parameters;
1434 parameters.codecs.push_back(kOpusCodec);
1435 parameters.codecs[0].AddFeedbackParam(
1436 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1437 cricket::kParamValueEmpty));
1438 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001439 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1440 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1441
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001442 parameters.codecs.clear();
1443 parameters.codecs.push_back(kOpusCodec);
1444 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1446 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1447}
1448
1449// Test that NACK is enabled on a new receive stream.
1450TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001451 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001453 cricket::AudioSendParameters parameters;
1454 parameters.codecs.push_back(kIsacCodec);
1455 parameters.codecs.push_back(kCn16000Codec);
1456 parameters.codecs[0].AddFeedbackParam(
1457 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1458 cricket::kParamValueEmpty));
1459 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460 EXPECT_TRUE(voe_.GetNACK(channel_num));
1461
1462 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1463 channel_num = voe_.GetLastChannel();
1464 EXPECT_TRUE(voe_.GetNACK(channel_num));
1465 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1466 channel_num = voe_.GetLastChannel();
1467 EXPECT_TRUE(voe_.GetNACK(channel_num));
1468}
1469
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001470// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001471TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001472 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001473 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001474 cricket::AudioSendParameters parameters;
1475 parameters.codecs.push_back(kOpusCodec);
1476 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001477 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1478}
1479
1480// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001481TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001482 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001483 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001484 cricket::AudioSendParameters parameters;
1485 parameters.codecs.push_back(kOpusCodec);
1486 parameters.codecs[0].bitrate = 0;
1487 parameters.codecs[0].params["useinbandfec"] = "0";
1488 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001489 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1490 webrtc::CodecInst gcodec;
1491 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1492 EXPECT_STREQ("opus", gcodec.plname);
1493 EXPECT_EQ(1, gcodec.channels);
1494 EXPECT_EQ(32000, gcodec.rate);
1495}
1496
1497// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001498TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001499 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001500 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001501 cricket::AudioSendParameters parameters;
1502 parameters.codecs.push_back(kOpusCodec);
1503 parameters.codecs[0].bitrate = 0;
1504 parameters.codecs[0].params["useinbandfec"] = "1";
1505 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001506 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1507 webrtc::CodecInst gcodec;
1508 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1509 EXPECT_STREQ("opus", gcodec.plname);
1510 EXPECT_EQ(1, gcodec.channels);
1511 EXPECT_EQ(32000, gcodec.rate);
1512}
1513
1514// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001515TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001516 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001517 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001518 cricket::AudioSendParameters parameters;
1519 parameters.codecs.push_back(kOpusCodec);
1520 parameters.codecs[0].bitrate = 0;
1521 parameters.codecs[0].params["stereo"] = "1";
1522 parameters.codecs[0].params["useinbandfec"] = "1";
1523 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001524 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1525 webrtc::CodecInst gcodec;
1526 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1527 EXPECT_STREQ("opus", gcodec.plname);
1528 EXPECT_EQ(2, gcodec.channels);
1529 EXPECT_EQ(64000, gcodec.rate);
1530}
1531
1532// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001533TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001534 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001535 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001536 cricket::AudioSendParameters parameters;
1537 parameters.codecs.push_back(kIsacCodec);
1538 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001539 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1540}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001541
1542// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1543TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001544 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001545 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 cricket::AudioSendParameters parameters;
1547 parameters.codecs.push_back(kIsacCodec);
1548 parameters.codecs[0].params["useinbandfec"] = "1";
1549 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001550 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1551}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001552
1553// Test that Opus FEC status can be changed.
1554TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001555 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001556 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 cricket::AudioSendParameters parameters;
1558 parameters.codecs.push_back(kOpusCodec);
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001561 parameters.codecs[0].params["useinbandfec"] = "1";
1562 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001563 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1564}
1565
stefanba4c0e42016-02-04 04:12:24 -08001566TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001567 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001568 cricket::AudioSendParameters send_parameters;
1569 send_parameters.codecs.push_back(kOpusCodec);
1570 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1571 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1572
1573 cricket::AudioRecvParameters recv_parameters;
1574 recv_parameters.codecs.push_back(kIsacCodec);
1575 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1576 EXPECT_TRUE(
1577 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1578 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1579 EXPECT_FALSE(
1580 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1581
solenbergbc37fc82016-04-04 09:54:44 -07001582 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001583 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1584 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1585 EXPECT_TRUE(
1586 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1587}
1588
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001589// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1590TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001591 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001592 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001593 cricket::AudioSendParameters parameters;
1594 parameters.codecs.push_back(kOpusCodec);
1595 parameters.codecs[0].bitrate = 0;
1596 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1597 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598 EXPECT_EQ(cricket::kOpusBandwidthNb,
1599 voe_.GetMaxEncodingBandwidth(channel_num));
1600 webrtc::CodecInst gcodec;
1601 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1602 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001603
1604 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1606 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001607 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1608 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001609}
1610
1611// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1612TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001613 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001614 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 cricket::AudioSendParameters parameters;
1616 parameters.codecs.push_back(kOpusCodec);
1617 parameters.codecs[0].bitrate = 0;
1618 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1619 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001620 EXPECT_EQ(cricket::kOpusBandwidthMb,
1621 voe_.GetMaxEncodingBandwidth(channel_num));
1622 webrtc::CodecInst gcodec;
1623 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1624 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001625
1626 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001627 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1628 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001629 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1630 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001631}
1632
1633// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1634TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001635 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001636 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001637 cricket::AudioSendParameters parameters;
1638 parameters.codecs.push_back(kOpusCodec);
1639 parameters.codecs[0].bitrate = 0;
1640 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001642 EXPECT_EQ(cricket::kOpusBandwidthWb,
1643 voe_.GetMaxEncodingBandwidth(channel_num));
1644 webrtc::CodecInst gcodec;
1645 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1646 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001647
1648 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1650 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001651 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1652 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001653}
1654
1655// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1656TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001657 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001658 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001659 cricket::AudioSendParameters parameters;
1660 parameters.codecs.push_back(kOpusCodec);
1661 parameters.codecs[0].bitrate = 0;
1662 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001664 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1665 voe_.GetMaxEncodingBandwidth(channel_num));
1666 webrtc::CodecInst gcodec;
1667 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1668 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001669
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001670 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001671 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1672 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001673 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1674 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001675}
1676
1677// Test 24000 < maxplaybackrate triggers Opus full band mode.
1678TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001679 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001680 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kOpusCodec);
1683 parameters.codecs[0].bitrate = 0;
1684 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1685 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001686 EXPECT_EQ(cricket::kOpusBandwidthFb,
1687 voe_.GetMaxEncodingBandwidth(channel_num));
1688 webrtc::CodecInst gcodec;
1689 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1690 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001691
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001692 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001693 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1694 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001695 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1696 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001697}
1698
1699// Test Opus that without maxplaybackrate, default playback rate is used.
1700TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001701 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001702 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 cricket::AudioSendParameters parameters;
1704 parameters.codecs.push_back(kOpusCodec);
1705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001706 EXPECT_EQ(cricket::kOpusBandwidthFb,
1707 voe_.GetMaxEncodingBandwidth(channel_num));
1708}
1709
1710// Test the with non-Opus, maxplaybackrate has no effect.
1711TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001712 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001713 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001714 cricket::AudioSendParameters parameters;
1715 parameters.codecs.push_back(kIsacCodec);
1716 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1717 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001718 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1719}
1720
1721// Test maxplaybackrate can be set on two streams.
1722TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001723 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001724 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 cricket::AudioSendParameters parameters;
1726 parameters.codecs.push_back(kOpusCodec);
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001728 // Default bandwidth is 24000.
1729 EXPECT_EQ(cricket::kOpusBandwidthFb,
1730 voe_.GetMaxEncodingBandwidth(channel_num));
1731
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001733
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001734 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001735 EXPECT_EQ(cricket::kOpusBandwidthNb,
1736 voe_.GetMaxEncodingBandwidth(channel_num));
1737
1738 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1739 channel_num = voe_.GetLastChannel();
1740 EXPECT_EQ(cricket::kOpusBandwidthNb,
1741 voe_.GetMaxEncodingBandwidth(channel_num));
1742}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001743
Minyue Li7100dcd2015-03-27 05:05:59 +01001744// Test that with usedtx=0, Opus DTX is off.
1745TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001746 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001747 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001748 cricket::AudioSendParameters parameters;
1749 parameters.codecs.push_back(kOpusCodec);
1750 parameters.codecs[0].params["usedtx"] = "0";
1751 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001752 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1753}
1754
1755// Test that with usedtx=1, Opus DTX is on.
1756TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001757 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001758 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001759 cricket::AudioSendParameters parameters;
1760 parameters.codecs.push_back(kOpusCodec);
1761 parameters.codecs[0].params["usedtx"] = "1";
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001763 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1764 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1765}
1766
1767// Test that usedtx=1 works with stereo Opus.
1768TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001769 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001770 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001771 cricket::AudioSendParameters parameters;
1772 parameters.codecs.push_back(kOpusCodec);
1773 parameters.codecs[0].params["usedtx"] = "1";
1774 parameters.codecs[0].params["stereo"] = "1";
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001776 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1777 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1778}
1779
1780// Test that usedtx=1 does not work with non Opus.
1781TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001782 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001783 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001784 cricket::AudioSendParameters parameters;
1785 parameters.codecs.push_back(kIsacCodec);
1786 parameters.codecs[0].params["usedtx"] = "1";
1787 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001788 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1789}
1790
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001791// Test that we can switch back and forth between Opus and ISAC with CN.
1792TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001793 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001795 cricket::AudioSendParameters opus_parameters;
1796 opus_parameters.codecs.push_back(kOpusCodec);
1797 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 webrtc::CodecInst gcodec;
1799 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001800 EXPECT_EQ(111, gcodec.pltype);
1801 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001803 cricket::AudioSendParameters isac_parameters;
1804 isac_parameters.codecs.push_back(kIsacCodec);
1805 isac_parameters.codecs.push_back(kCn16000Codec);
1806 isac_parameters.codecs.push_back(kOpusCodec);
1807 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1809 EXPECT_EQ(103, gcodec.pltype);
1810 EXPECT_STREQ("ISAC", gcodec.plname);
1811
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001812 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001814 EXPECT_EQ(111, gcodec.pltype);
1815 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816}
1817
1818// Test that we handle various ways of specifying bitrate.
1819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001820 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 cricket::AudioSendParameters parameters;
1823 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1824 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 webrtc::CodecInst gcodec;
1826 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1827 EXPECT_EQ(103, gcodec.pltype);
1828 EXPECT_STREQ("ISAC", gcodec.plname);
1829 EXPECT_EQ(32000, gcodec.rate);
1830
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001831 parameters.codecs[0].bitrate = 0; // bitrate == default
1832 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1834 EXPECT_EQ(103, gcodec.pltype);
1835 EXPECT_STREQ("ISAC", gcodec.plname);
1836 EXPECT_EQ(-1, gcodec.rate);
1837
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001838 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1841 EXPECT_EQ(103, gcodec.pltype);
1842 EXPECT_STREQ("ISAC", gcodec.plname);
1843 EXPECT_EQ(28000, gcodec.rate);
1844
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001845 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1846 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1848 EXPECT_EQ(0, gcodec.pltype);
1849 EXPECT_STREQ("PCMU", gcodec.plname);
1850 EXPECT_EQ(64000, gcodec.rate);
1851
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 parameters.codecs[0].bitrate = 0; // bitrate == default
1853 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001854 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1855 EXPECT_EQ(0, gcodec.pltype);
1856 EXPECT_STREQ("PCMU", gcodec.plname);
1857 EXPECT_EQ(64000, gcodec.rate);
1858
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001859 parameters.codecs[0] = kOpusCodec;
1860 parameters.codecs[0].bitrate = 0; // bitrate == default
1861 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1863 EXPECT_EQ(111, gcodec.pltype);
1864 EXPECT_STREQ("opus", gcodec.plname);
1865 EXPECT_EQ(32000, gcodec.rate);
1866}
1867
Brave Yao5225dd82015-03-26 07:39:19 +08001868// Test that we could set packet size specified in kCodecParamPTime.
1869TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001870 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001871 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001872 cricket::AudioSendParameters parameters;
1873 parameters.codecs.push_back(kOpusCodec);
1874 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1875 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001876 webrtc::CodecInst gcodec;
1877 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1878 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1879
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001880 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1881 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1883 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1884
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001885 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1886 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001887 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1888 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1889
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001890 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1891 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001893 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1894 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1895
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1897 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1898 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001899 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1900 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1901}
1902
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001903// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001905 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001906 cricket::AudioSendParameters parameters;
1907 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001908}
1909
1910// Test that we can set send codecs even with telephone-event codec as the first
1911// one on the list.
1912TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001913 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001915 cricket::AudioSendParameters parameters;
1916 parameters.codecs.push_back(kTelephoneEventCodec);
1917 parameters.codecs.push_back(kIsacCodec);
1918 parameters.codecs.push_back(kPcmuCodec);
1919 parameters.codecs[0].id = 98; // DTMF
1920 parameters.codecs[1].id = 96;
1921 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 webrtc::CodecInst gcodec;
1923 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001924 EXPECT_EQ(96, gcodec.pltype);
1925 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001926 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001927}
1928
solenberg31642aa2016-03-14 08:00:37 -07001929// Test that payload type range is limited for telephone-event codec.
1930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001931 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001932 cricket::AudioSendParameters parameters;
1933 parameters.codecs.push_back(kTelephoneEventCodec);
1934 parameters.codecs.push_back(kIsacCodec);
1935 parameters.codecs[0].id = 0; // DTMF
1936 parameters.codecs[1].id = 96;
1937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1938 EXPECT_TRUE(channel_->CanInsertDtmf());
1939 parameters.codecs[0].id = 128; // DTMF
1940 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1941 EXPECT_FALSE(channel_->CanInsertDtmf());
1942 parameters.codecs[0].id = 127;
1943 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1944 EXPECT_TRUE(channel_->CanInsertDtmf());
1945 parameters.codecs[0].id = -1; // DTMF
1946 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1947 EXPECT_FALSE(channel_->CanInsertDtmf());
1948}
1949
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001950// Test that we can set send codecs even with CN codec as the first
1951// one on the list.
1952TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001953 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001954 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001955 cricket::AudioSendParameters parameters;
1956 parameters.codecs.push_back(kCn16000Codec);
1957 parameters.codecs.push_back(kIsacCodec);
1958 parameters.codecs.push_back(kPcmuCodec);
1959 parameters.codecs[0].id = 98; // wideband CN
1960 parameters.codecs[1].id = 96;
1961 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001962 webrtc::CodecInst gcodec;
1963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1964 EXPECT_EQ(96, gcodec.pltype);
1965 EXPECT_STREQ("ISAC", gcodec.plname);
1966 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967}
1968
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001969// Test that we set VAD and DTMF types correctly as caller.
1970TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001971 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 cricket::AudioSendParameters parameters;
1974 parameters.codecs.push_back(kIsacCodec);
1975 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001977 parameters.codecs.push_back(kCn16000Codec);
1978 parameters.codecs.push_back(kCn8000Codec);
1979 parameters.codecs.push_back(kTelephoneEventCodec);
1980 parameters.codecs.push_back(kRedCodec);
1981 parameters.codecs[0].id = 96;
1982 parameters.codecs[2].id = 97; // wideband CN
1983 parameters.codecs[4].id = 98; // DTMF
1984 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985 webrtc::CodecInst gcodec;
1986 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1987 EXPECT_EQ(96, gcodec.pltype);
1988 EXPECT_STREQ("ISAC", gcodec.plname);
1989 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001990 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001991 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1992 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001993 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001994}
1995
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001996// Test that we set VAD and DTMF types correctly as callee.
1997TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001998 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001999 cricket::AudioSendParameters parameters;
2000 parameters.codecs.push_back(kIsacCodec);
2001 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002002 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002003 parameters.codecs.push_back(kCn16000Codec);
2004 parameters.codecs.push_back(kCn8000Codec);
2005 parameters.codecs.push_back(kTelephoneEventCodec);
2006 parameters.codecs.push_back(kRedCodec);
2007 parameters.codecs[0].id = 96;
2008 parameters.codecs[2].id = 97; // wideband CN
2009 parameters.codecs[4].id = 98; // DTMF
2010 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002011 EXPECT_TRUE(channel_->AddSendStream(
2012 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002013 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002014
2015 webrtc::CodecInst gcodec;
2016 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2017 EXPECT_EQ(96, gcodec.pltype);
2018 EXPECT_STREQ("ISAC", gcodec.plname);
2019 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002020 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002021 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2022 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002023 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002024}
2025
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026// Test that we only apply VAD if we have a CN codec that matches the
2027// send codec clockrate.
2028TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002029 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002030 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002031 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002032 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002033 parameters.codecs.push_back(kIsacCodec);
2034 parameters.codecs.push_back(kCn16000Codec);
2035 parameters.codecs[1].id = 97;
2036 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002037 webrtc::CodecInst gcodec;
2038 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2039 EXPECT_STREQ("ISAC", gcodec.plname);
2040 EXPECT_TRUE(voe_.GetVAD(channel_num));
2041 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2042 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002043 parameters.codecs[0] = kPcmuCodec;
2044 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002045 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2046 EXPECT_STREQ("PCMU", gcodec.plname);
2047 EXPECT_FALSE(voe_.GetVAD(channel_num));
2048 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002049 parameters.codecs[1] = kCn8000Codec;
2050 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2052 EXPECT_STREQ("PCMU", gcodec.plname);
2053 EXPECT_TRUE(voe_.GetVAD(channel_num));
2054 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002055 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002056 parameters.codecs[0] = kIsacCodec;
2057 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002058 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2059 EXPECT_STREQ("ISAC", gcodec.plname);
2060 EXPECT_FALSE(voe_.GetVAD(channel_num));
2061}
2062
2063// Test that we perform case-insensitive matching of codec names.
2064TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002065 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002066 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002067 cricket::AudioSendParameters parameters;
2068 parameters.codecs.push_back(kIsacCodec);
2069 parameters.codecs.push_back(kPcmuCodec);
2070 parameters.codecs.push_back(kCn16000Codec);
2071 parameters.codecs.push_back(kCn8000Codec);
2072 parameters.codecs.push_back(kTelephoneEventCodec);
2073 parameters.codecs.push_back(kRedCodec);
2074 parameters.codecs[0].name = "iSaC";
2075 parameters.codecs[0].id = 96;
2076 parameters.codecs[2].id = 97; // wideband CN
2077 parameters.codecs[4].id = 98; // DTMF
2078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079 webrtc::CodecInst gcodec;
2080 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2081 EXPECT_EQ(96, gcodec.pltype);
2082 EXPECT_STREQ("ISAC", gcodec.plname);
2083 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002084 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002085 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2086 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002087 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088}
2089
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002090// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002091TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002092 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002093 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002094 cricket::AudioSendParameters parameters;
2095 parameters.codecs.push_back(kRedCodec);
2096 parameters.codecs.push_back(kIsacCodec);
2097 parameters.codecs.push_back(kPcmuCodec);
2098 parameters.codecs[0].id = 127;
2099 parameters.codecs[0].params[""] = "96/96";
2100 parameters.codecs[1].id = 96;
2101 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102 webrtc::CodecInst gcodec;
2103 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2104 EXPECT_EQ(96, gcodec.pltype);
2105 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002106 EXPECT_TRUE(voe_.GetRED(channel_num));
2107 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108}
2109
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002110// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002111TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002112 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002113 cricket::AudioSendParameters parameters;
2114 parameters.codecs.push_back(kRedCodec);
2115 parameters.codecs.push_back(kIsacCodec);
2116 parameters.codecs.push_back(kPcmuCodec);
2117 parameters.codecs[0].id = 127;
2118 parameters.codecs[0].params[""] = "96/96";
2119 parameters.codecs[1].id = 96;
2120 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002121 EXPECT_TRUE(channel_->AddSendStream(
2122 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002123 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002124 webrtc::CodecInst gcodec;
2125 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2126 EXPECT_EQ(96, gcodec.pltype);
2127 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002128 EXPECT_TRUE(voe_.GetRED(channel_num));
2129 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002130}
2131
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002132// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002134 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002136 cricket::AudioSendParameters parameters;
2137 parameters.codecs.push_back(kRedCodec);
2138 parameters.codecs.push_back(kIsacCodec);
2139 parameters.codecs.push_back(kPcmuCodec);
2140 parameters.codecs[0].id = 127;
2141 parameters.codecs[1].id = 96;
2142 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143 webrtc::CodecInst gcodec;
2144 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2145 EXPECT_EQ(96, gcodec.pltype);
2146 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002147 EXPECT_TRUE(voe_.GetRED(channel_num));
2148 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002149}
2150
2151// Test that we ignore RED if the parameters aren't named the way we expect.
2152TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002153 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002154 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002155 cricket::AudioSendParameters parameters;
2156 parameters.codecs.push_back(kRedCodec);
2157 parameters.codecs.push_back(kIsacCodec);
2158 parameters.codecs.push_back(kPcmuCodec);
2159 parameters.codecs[0].id = 127;
2160 parameters.codecs[0].params["ABC"] = "96/96";
2161 parameters.codecs[1].id = 96;
2162 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002163 webrtc::CodecInst gcodec;
2164 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2165 EXPECT_EQ(96, gcodec.pltype);
2166 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002167 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002168}
2169
2170// Test that we ignore RED if it uses different primary/secondary encoding.
2171TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002172 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002174 cricket::AudioSendParameters parameters;
2175 parameters.codecs.push_back(kRedCodec);
2176 parameters.codecs.push_back(kIsacCodec);
2177 parameters.codecs.push_back(kPcmuCodec);
2178 parameters.codecs[0].id = 127;
2179 parameters.codecs[0].params[""] = "96/0";
2180 parameters.codecs[1].id = 96;
2181 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002182 webrtc::CodecInst gcodec;
2183 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2184 EXPECT_EQ(96, gcodec.pltype);
2185 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002186 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002187}
2188
2189// Test that we ignore RED if it uses more than 2 encodings.
2190TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002191 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002192 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002193 cricket::AudioSendParameters parameters;
2194 parameters.codecs.push_back(kRedCodec);
2195 parameters.codecs.push_back(kIsacCodec);
2196 parameters.codecs.push_back(kPcmuCodec);
2197 parameters.codecs[0].id = 127;
2198 parameters.codecs[0].params[""] = "96/96/96";
2199 parameters.codecs[1].id = 96;
2200 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201 webrtc::CodecInst gcodec;
2202 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2203 EXPECT_EQ(96, gcodec.pltype);
2204 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002205 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206}
2207
2208// Test that we ignore RED if it has bogus codec ids.
2209TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002210 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002211 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002212 cricket::AudioSendParameters parameters;
2213 parameters.codecs.push_back(kRedCodec);
2214 parameters.codecs.push_back(kIsacCodec);
2215 parameters.codecs.push_back(kPcmuCodec);
2216 parameters.codecs[0].id = 127;
2217 parameters.codecs[0].params[""] = "ABC/ABC";
2218 parameters.codecs[1].id = 96;
2219 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220 webrtc::CodecInst gcodec;
2221 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2222 EXPECT_EQ(96, gcodec.pltype);
2223 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002224 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002225}
2226
2227// Test that we ignore RED if it refers to a codec that is not present.
2228TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002229 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002231 cricket::AudioSendParameters parameters;
2232 parameters.codecs.push_back(kRedCodec);
2233 parameters.codecs.push_back(kIsacCodec);
2234 parameters.codecs.push_back(kPcmuCodec);
2235 parameters.codecs[0].id = 127;
2236 parameters.codecs[0].params[""] = "97/97";
2237 parameters.codecs[1].id = 96;
2238 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239 webrtc::CodecInst gcodec;
2240 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2241 EXPECT_EQ(96, gcodec.pltype);
2242 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002243 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244}
2245
stefanba4c0e42016-02-04 04:12:24 -08002246class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2247 public:
2248 WebRtcVoiceEngineWithSendSideBweTest()
2249 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2250};
2251
2252TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2253 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002254 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002255 ASSERT_FALSE(capabilities.header_extensions.empty());
2256 for (const cricket::RtpHeaderExtension& extension :
2257 capabilities.header_extensions) {
2258 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2259 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2260 extension.id);
2261 return;
2262 }
2263 }
2264 FAIL() << "Transport sequence number extension not in header-extension list.";
2265}
2266
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002267// Test support for audio level header extension.
2268TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2269 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002270}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002271TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2272 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2273}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002274
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002275// Test support for absolute send time header extension.
2276TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2277 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2278}
2279TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2280 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281}
2282
solenberg1ac56142015-10-13 03:58:19 -07002283// Test that we can create a channel and start sending on it.
2284TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002285 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002286 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002287 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002288 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002289 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002290 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2291}
2292
2293// Test that a channel will send if and only if it has a source and is enabled
2294// for sending.
2295TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002296 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002297 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2298 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002299 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002300 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2301 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2302 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2303 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2304 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002305}
2306
solenberg6d6e7c52016-04-13 09:07:30 -07002307// Test that SetSendParameters() does not alter a stream's send state.
2308TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2309 EXPECT_TRUE(SetupSendStream());
2310 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2311
2312 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002313 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002314 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2315
2316 // Changing RTP header extensions will recreate the AudioSendStream.
2317 send_parameters_.extensions.push_back(
2318 cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
2319 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2320 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2321
2322 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002323 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002324 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2325
2326 // Changing RTP header extensions will recreate the AudioSendStream.
2327 send_parameters_.extensions.clear();
2328 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2329 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2330}
2331
solenberg1ac56142015-10-13 03:58:19 -07002332// Test that we can create a channel and start playing out on it.
2333TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002334 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002335 int channel_num = voe_.GetLastChannel();
2336 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2337 EXPECT_TRUE(channel_->SetPlayout(true));
2338 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 EXPECT_TRUE(channel_->SetPlayout(false));
2340 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2341}
2342
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002343// Test that we can add and remove send streams.
2344TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2345 SetupForMultiSendStream();
2346
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002347 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002348 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002349
solenbergc96df772015-10-21 13:01:53 -07002350 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002351 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002352 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002353 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002354 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002355 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002356 }
tfarina5237aaf2015-11-10 23:44:30 -08002357 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002358
solenbergc96df772015-10-21 13:01:53 -07002359 // Delete the send streams.
2360 for (uint32_t ssrc : kSsrcs4) {
2361 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002362 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002363 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002364 }
solenbergc96df772015-10-21 13:01:53 -07002365 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002366}
2367
2368// Test SetSendCodecs correctly configure the codecs in all send streams.
2369TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2370 SetupForMultiSendStream();
2371
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002372 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002373 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002374 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002375 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002376 }
2377
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002378 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002379 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002380 parameters.codecs.push_back(kIsacCodec);
2381 parameters.codecs.push_back(kCn16000Codec);
2382 parameters.codecs[1].id = 97;
2383 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002384
2385 // Verify ISAC and VAD are corrected configured on all send channels.
2386 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002387 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002388 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002389 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2390 EXPECT_STREQ("ISAC", gcodec.plname);
2391 EXPECT_TRUE(voe_.GetVAD(channel_num));
2392 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2393 }
2394
2395 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002396 parameters.codecs[0] = kPcmuCodec;
2397 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002398 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002399 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002400 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2401 EXPECT_STREQ("PCMU", gcodec.plname);
2402 EXPECT_FALSE(voe_.GetVAD(channel_num));
2403 }
2404}
2405
2406// Test we can SetSend on all send streams correctly.
2407TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2408 SetupForMultiSendStream();
2409
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002410 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002411 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002412 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002413 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002414 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2415 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002416 }
2417
2418 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002419 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002420 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002421 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002422 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002423 }
2424
2425 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002426 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002427 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002428 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002429 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002430 }
2431}
2432
2433// Test we can set the correct statistics on all send streams.
2434TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2435 SetupForMultiSendStream();
2436
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002437 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002438 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002439 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002440 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002441 }
solenberg85a04962015-10-27 03:35:21 -07002442 SetAudioSendStreamStats();
2443
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002444 // Create a receive stream to check that none of the send streams end up in
2445 // the receive stream stats.
2446 EXPECT_TRUE(channel_->AddRecvStream(
2447 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002448 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002449 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2450 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002451
solenberg85a04962015-10-27 03:35:21 -07002452 // Check stats for the added streams.
2453 {
2454 cricket::VoiceMediaInfo info;
2455 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002456
solenberg85a04962015-10-27 03:35:21 -07002457 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002458 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002459 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002460 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002461 }
2462
2463 // We have added one receive stream. We should see empty stats.
2464 EXPECT_EQ(info.receivers.size(), 1u);
2465 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002466 }
solenberg1ac56142015-10-13 03:58:19 -07002467
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002468 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002469 {
2470 cricket::VoiceMediaInfo info;
2471 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2472 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002473 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002474 EXPECT_EQ(0u, info.receivers.size());
2475 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002476
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002477 // Deliver a new packet - a default receive stream should be created and we
2478 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002479 {
2480 cricket::VoiceMediaInfo info;
2481 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2482 SetAudioReceiveStreamStats();
2483 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002484 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002485 EXPECT_EQ(1u, info.receivers.size());
2486 VerifyVoiceReceiverInfo(info.receivers[0]);
2487 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002488}
2489
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002490// Test that we can add and remove receive streams, and do proper send/playout.
2491// We can receive on multiple streams while sending one stream.
2492TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002493 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494 int channel_num1 = voe_.GetLastChannel();
2495
solenberg1ac56142015-10-13 03:58:19 -07002496 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002497 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002499 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500
solenberg1ac56142015-10-13 03:58:19 -07002501 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002502 EXPECT_TRUE(
2503 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002505 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002506 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507
solenberg1ac56142015-10-13 03:58:19 -07002508 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002509 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2510 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2511
2512 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002513 EXPECT_TRUE(
2514 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002515 int channel_num3 = voe_.GetLastChannel();
2516 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2517 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2518 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002519
2520 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002521 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002522 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002523
2524 // Stop playout.
2525 EXPECT_TRUE(channel_->SetPlayout(false));
2526 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2527 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2528 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2529
solenberg1ac56142015-10-13 03:58:19 -07002530 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002531 EXPECT_TRUE(channel_->SetPlayout(true));
2532 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2533 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2534 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2535
solenberg1ac56142015-10-13 03:58:19 -07002536 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2538 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002539 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002540}
2541
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002542// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002543// and start sending on it.
2544TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002545 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002546 cricket::AudioOptions options_adjust_agc;
2547 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 webrtc::AgcConfig agc_config;
2549 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2550 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002551 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002552 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002553 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002554 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002555 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2556 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002557 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002558 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560}
2561
wu@webrtc.org97077a32013-10-25 21:18:33 +00002562TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002563 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002564 EXPECT_CALL(adm_,
2565 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002566 webrtc::AgcConfig agc_config;
2567 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2568 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002569 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2570 send_parameters_.options.tx_agc_digital_compression_gain =
2571 rtc::Optional<uint16_t>(9);
2572 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2573 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2574 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002575 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2576 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2577 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2578 EXPECT_TRUE(agc_config.limiterEnable);
2579
2580 // Check interaction with adjust_agc_delta. Both should be respected, for
2581 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002582 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2583 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002584 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2585 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2586}
2587
wu@webrtc.org97077a32013-10-25 21:18:33 +00002588TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002589 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002590 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2591 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002592 send_parameters_.options.recording_sample_rate =
2593 rtc::Optional<uint32_t>(48000);
2594 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2595 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002596}
2597
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002599// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002601 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002602 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603}
2604
2605TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2606 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002607 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002608 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002609 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002610 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002611 EXPECT_TRUE(channel_->AddRecvStream(
2612 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002613 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2614 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002615
solenberg85a04962015-10-27 03:35:21 -07002616 // Check stats for the added streams.
2617 {
2618 cricket::VoiceMediaInfo info;
2619 EXPECT_EQ(true, channel_->GetStats(&info));
2620
2621 // We have added one send stream. We should see the stats we've set.
2622 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002623 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002624 // We have added one receive stream. We should see empty stats.
2625 EXPECT_EQ(info.receivers.size(), 1u);
2626 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2627 }
solenberg1ac56142015-10-13 03:58:19 -07002628
solenberg566ef242015-11-06 15:34:49 -08002629 // Start sending - this affects some reported stats.
2630 {
2631 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002632 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002633 EXPECT_EQ(true, channel_->GetStats(&info));
2634 VerifyVoiceSenderInfo(info.senders[0], true);
2635 }
2636
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002637 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002638 {
2639 cricket::VoiceMediaInfo info;
2640 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2641 EXPECT_EQ(true, channel_->GetStats(&info));
2642 EXPECT_EQ(1u, info.senders.size());
2643 EXPECT_EQ(0u, info.receivers.size());
2644 }
solenberg1ac56142015-10-13 03:58:19 -07002645
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002646 // Deliver a new packet - a default receive stream should be created and we
2647 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002648 {
2649 cricket::VoiceMediaInfo info;
2650 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2651 SetAudioReceiveStreamStats();
2652 EXPECT_EQ(true, channel_->GetStats(&info));
2653 EXPECT_EQ(1u, info.senders.size());
2654 EXPECT_EQ(1u, info.receivers.size());
2655 VerifyVoiceReceiverInfo(info.receivers[0]);
2656 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002657}
2658
2659// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002660// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002662 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002663 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002664 EXPECT_TRUE(channel_->AddRecvStream(
2665 cricket::StreamParams::CreateLegacy(kSsrc2)));
2666 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667}
2668
2669// Test that the local SSRC is the same on sending and receiving channels if the
2670// receive channel is created before the send channel.
2671TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002672 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2674 int receive_channel_num = voe_.GetLastChannel();
2675 EXPECT_TRUE(channel_->AddSendStream(
2676 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677
solenberg3a941542015-11-16 07:34:50 -08002678 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002679 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680}
2681
2682// Test that we can properly receive packets.
2683TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002684 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002685 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002686 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002687
2688 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2689 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002690}
2691
2692// Test that we can properly receive packets on multiple streams.
2693TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002694 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002695 const uint32_t ssrc1 = 1;
2696 const uint32_t ssrc2 = 2;
2697 const uint32_t ssrc3 = 3;
2698 EXPECT_TRUE(channel_->AddRecvStream(
2699 cricket::StreamParams::CreateLegacy(ssrc1)));
2700 EXPECT_TRUE(channel_->AddRecvStream(
2701 cricket::StreamParams::CreateLegacy(ssrc2)));
2702 EXPECT_TRUE(channel_->AddRecvStream(
2703 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002704 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002705 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002706 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002707 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002708 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002709 }
mflodman3d7db262016-04-29 00:57:13 -07002710
2711 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2712 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2713 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2714
2715 EXPECT_EQ(s1.received_packets(), 0);
2716 EXPECT_EQ(s2.received_packets(), 0);
2717 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002718
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002719 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002720 EXPECT_EQ(s1.received_packets(), 0);
2721 EXPECT_EQ(s2.received_packets(), 0);
2722 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002723
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002724 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002725 EXPECT_EQ(s1.received_packets(), 1);
2726 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2727 EXPECT_EQ(s2.received_packets(), 0);
2728 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002729
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002730 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002731 EXPECT_EQ(s1.received_packets(), 1);
2732 EXPECT_EQ(s2.received_packets(), 1);
2733 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2734 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002735
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002736 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002737 EXPECT_EQ(s1.received_packets(), 1);
2738 EXPECT_EQ(s2.received_packets(), 1);
2739 EXPECT_EQ(s3.received_packets(), 1);
2740 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002741
mflodman3d7db262016-04-29 00:57:13 -07002742 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2743 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2744 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745}
2746
solenberg7e63ef02015-11-20 00:19:43 -08002747// Test that receiving on an unsignalled stream works (default channel will be
2748// created).
2749TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002750 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002751 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2752
solenberg7e63ef02015-11-20 00:19:43 -08002753 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002754
2755 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2756 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2757 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002758}
2759
2760// Test that receiving on an unsignalled stream works (default channel will be
2761// created), and that packets will be forwarded to the default channel
2762// regardless of their SSRCs.
2763TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002764 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002765 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002766 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2767
mflodman3d7db262016-04-29 00:57:13 -07002768 // Note that ssrc = 0 is not supported.
2769 uint32_t ssrc = 1;
2770 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002771 rtc::SetBE32(&packet[8], ssrc);
2772 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002773
2774 // Verify we only have one default stream.
2775 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2776 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2777 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002778 }
mflodman3d7db262016-04-29 00:57:13 -07002779
2780 // Sending the same ssrc again should not create a new stream.
2781 --ssrc;
2782 DeliverPacket(packet, sizeof(packet));
2783 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2784 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2785 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002786}
2787
2788// Test that a default channel is created even after a signalled stream has been
2789// added, and that this stream will get any packets for unknown SSRCs.
2790TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002791 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002792 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002793 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2794
2795 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002796 const uint32_t signaled_ssrc = 1;
2797 rtc::SetBE32(&packet[8], signaled_ssrc);
2798 EXPECT_TRUE(channel_->AddRecvStream(
2799 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002800 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002801 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2802 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002803
2804 // Note that the first unknown SSRC cannot be 0, because we only support
2805 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002806 const uint32_t unsignaled_ssrc = 7011;
2807 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002808 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002809 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2810 packet, sizeof(packet)));
2811 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2812
2813 DeliverPacket(packet, sizeof(packet));
2814 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2815
2816 rtc::SetBE32(&packet[8], signaled_ssrc);
2817 DeliverPacket(packet, sizeof(packet));
2818 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2819 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002820}
2821
solenberg0a617e22015-10-20 15:49:38 -07002822// Test that we properly handle failures to add a receive stream.
2823TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002824 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002825 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002826 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827}
2828
solenberg0a617e22015-10-20 15:49:38 -07002829// Test that we properly handle failures to add a send stream.
2830TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002831 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002832 voe_.set_fail_create_channel(true);
2833 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2834}
2835
solenberg1ac56142015-10-13 03:58:19 -07002836// Test that AddRecvStream creates new stream.
2837TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002838 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002839 int channel_num = voe_.GetLastChannel();
2840 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002841 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002842}
2843
2844// Test that after adding a recv stream, we do not decode more codecs than
2845// those previously passed into SetRecvCodecs.
2846TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002847 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002848 cricket::AudioRecvParameters parameters;
2849 parameters.codecs.push_back(kIsacCodec);
2850 parameters.codecs.push_back(kPcmuCodec);
2851 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002852 EXPECT_TRUE(channel_->AddRecvStream(
2853 cricket::StreamParams::CreateLegacy(kSsrc1)));
2854 int channel_num2 = voe_.GetLastChannel();
2855 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002856 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002857 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002858 gcodec.channels = 2;
2859 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2860}
2861
2862// Test that we properly clean up any streams that were added, even if
2863// not explicitly removed.
2864TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002865 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002866 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002867 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2868 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2869 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2870 delete channel_;
2871 channel_ = NULL;
2872 EXPECT_EQ(0, voe_.GetNumChannels());
2873}
2874
wu@webrtc.org78187522013-10-07 23:32:02 +00002875TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002876 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002877 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2878}
2879
2880TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002881 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002882 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002883 // Manually delete channel to simulate a failure.
2884 int channel = voe_.GetLastChannel();
2885 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2886 // Add recv stream 2 should work.
2887 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002888 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002889 EXPECT_NE(channel, new_channel);
2890 // The last created channel is deleted too.
2891 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002892}
2893
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002894// Test the InsertDtmf on default send stream as caller.
2895TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2896 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897}
2898
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002899// Test the InsertDtmf on default send stream as callee
2900TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2901 TestInsertDtmf(0, false);
2902}
2903
2904// Test the InsertDtmf on specified send stream as caller.
2905TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2906 TestInsertDtmf(kSsrc1, true);
2907}
2908
2909// Test the InsertDtmf on specified send stream as callee.
2910TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2911 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002912}
2913
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002914TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002915 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002916 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002917 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002918 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2919 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2920 EXPECT_TRUE(channel_->SetPlayout(true));
2921 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2922 EXPECT_TRUE(channel_->SetPlayout(false));
2923 EXPECT_FALSE(channel_->SetPlayout(true));
2924}
2925
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002927 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002928 EXPECT_CALL(adm_,
2929 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2930 EXPECT_CALL(adm_,
2931 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2932 EXPECT_CALL(adm_,
2933 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002934 bool ec_enabled;
2935 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002936 webrtc::AecmModes aecm_mode;
2937 bool cng_enabled;
2938 bool agc_enabled;
2939 webrtc::AgcModes agc_mode;
2940 webrtc::AgcConfig agc_config;
2941 bool ns_enabled;
2942 webrtc::NsModes ns_mode;
2943 bool highpass_filter_enabled;
2944 bool stereo_swapping_enabled;
2945 bool typing_detection_enabled;
2946 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002947 voe_.GetAecmMode(aecm_mode, cng_enabled);
2948 voe_.GetAgcStatus(agc_enabled, agc_mode);
2949 voe_.GetAgcConfig(agc_config);
2950 voe_.GetNsStatus(ns_enabled, ns_mode);
2951 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2952 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2953 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2954 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002955 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002956 EXPECT_FALSE(cng_enabled);
2957 EXPECT_TRUE(agc_enabled);
2958 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2959 EXPECT_TRUE(ns_enabled);
2960 EXPECT_TRUE(highpass_filter_enabled);
2961 EXPECT_FALSE(stereo_swapping_enabled);
2962 EXPECT_TRUE(typing_detection_enabled);
2963 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2964 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002965 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2966 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002967
solenberg246b8172015-12-08 09:50:23 -08002968 // Nothing set in AudioOptions, so everything should be as default.
2969 send_parameters_.options = cricket::AudioOptions();
2970 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002972 voe_.GetAecmMode(aecm_mode, cng_enabled);
2973 voe_.GetAgcStatus(agc_enabled, agc_mode);
2974 voe_.GetAgcConfig(agc_config);
2975 voe_.GetNsStatus(ns_enabled, ns_mode);
2976 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2977 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2978 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2979 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002980 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002981 EXPECT_FALSE(cng_enabled);
2982 EXPECT_TRUE(agc_enabled);
2983 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2984 EXPECT_TRUE(ns_enabled);
2985 EXPECT_TRUE(highpass_filter_enabled);
2986 EXPECT_FALSE(stereo_swapping_enabled);
2987 EXPECT_TRUE(typing_detection_enabled);
2988 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2989 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002990 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2991 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002992
2993 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002994 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2995 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002996 voe_.GetEcStatus(ec_enabled, ec_mode);
2997 EXPECT_FALSE(ec_enabled);
2998
2999 // Turn echo cancellation back on, with settings, and make sure
3000 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08003001 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
3002 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003004 voe_.GetAecmMode(aecm_mode, cng_enabled);
3005 voe_.GetAgcStatus(agc_enabled, agc_mode);
3006 voe_.GetAgcConfig(agc_config);
3007 voe_.GetNsStatus(ns_enabled, ns_mode);
3008 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3009 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3010 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3011 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003012 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013 EXPECT_TRUE(agc_enabled);
3014 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3015 EXPECT_TRUE(ns_enabled);
3016 EXPECT_TRUE(highpass_filter_enabled);
3017 EXPECT_FALSE(stereo_swapping_enabled);
3018 EXPECT_TRUE(typing_detection_enabled);
3019 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3020 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
3021
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003022 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
3023 // control.
solenberg246b8172015-12-08 09:50:23 -08003024 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3025 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003026 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003027 voe_.GetAecmMode(aecm_mode, cng_enabled);
3028 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003029 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003030 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3031
3032 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08003033 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
3034 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
3035 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
3036 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003037 voe_.GetEcStatus(ec_enabled, ec_mode);
3038 EXPECT_FALSE(ec_enabled);
3039 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08003040 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3041 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003042 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003043 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003044 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003045 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3046
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003047 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08003048 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
3049 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003050 voe_.GetAgcStatus(agc_enabled, agc_mode);
3051 EXPECT_FALSE(agc_enabled);
3052
3053 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08003054 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
3055 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
3056 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003057 voe_.GetAgcStatus(agc_enabled, agc_mode);
3058 EXPECT_TRUE(agc_enabled);
3059 voe_.GetAgcConfig(agc_config);
3060 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3061
3062 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08003063 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
3064 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
3065 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
3066 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
3067 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003068 voe_.GetNsStatus(ns_enabled, ns_mode);
3069 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3070 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3071 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3072 EXPECT_FALSE(ns_enabled);
3073 EXPECT_FALSE(highpass_filter_enabled);
3074 EXPECT_FALSE(typing_detection_enabled);
3075 EXPECT_TRUE(stereo_swapping_enabled);
3076
solenberg1ac56142015-10-13 03:58:19 -07003077 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08003078 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003079 voe_.GetEcStatus(ec_enabled, ec_mode);
3080 voe_.GetNsStatus(ns_enabled, ns_mode);
3081 EXPECT_TRUE(ec_enabled);
3082 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3083 EXPECT_FALSE(ns_enabled);
3084 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3085}
3086
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003087TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003088 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003089
3090 bool ec_enabled;
3091 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003092 bool agc_enabled;
3093 webrtc::AgcModes agc_mode;
3094 bool ns_enabled;
3095 webrtc::NsModes ns_mode;
3096 bool highpass_filter_enabled;
3097 bool stereo_swapping_enabled;
3098 bool typing_detection_enabled;
3099
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003100 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003101 voe_.GetAgcStatus(agc_enabled, agc_mode);
3102 voe_.GetNsStatus(ns_enabled, ns_mode);
3103 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3104 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3105 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3106 EXPECT_TRUE(ec_enabled);
3107 EXPECT_TRUE(agc_enabled);
3108 EXPECT_TRUE(ns_enabled);
3109 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003110 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003111 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003112}
3113
3114TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3115 webrtc::AgcConfig set_config = {0};
3116 set_config.targetLeveldBOv = 3;
3117 set_config.digitalCompressionGaindB = 9;
3118 set_config.limiterEnable = true;
3119 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003120
3121 webrtc::AgcConfig config = {0};
3122 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3123 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3124 EXPECT_EQ(set_config.digitalCompressionGaindB,
3125 config.digitalCompressionGaindB);
3126 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3127}
3128
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003129TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003130 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003131 EXPECT_CALL(adm_,
3132 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3133 EXPECT_CALL(adm_,
3134 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3135 EXPECT_CALL(adm_,
3136 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3137
kwiberg686a8ef2016-02-26 03:00:35 -08003138 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003139 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003140 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003141 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003142 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003143 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003144
3145 // Have to add a stream to make SetSend work.
3146 cricket::StreamParams stream1;
3147 stream1.ssrcs.push_back(1);
3148 channel1->AddSendStream(stream1);
3149 cricket::StreamParams stream2;
3150 stream2.ssrcs.push_back(2);
3151 channel2->AddSendStream(stream2);
3152
3153 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003154 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003155 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3156 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3157 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003158 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3159 EXPECT_EQ(parameters_options_all.options, channel1->options());
3160 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3161 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003162
3163 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003164 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003165 parameters_options_no_ns.options.noise_suppression =
3166 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003167 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3168 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003169 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3170 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3171 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003172 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003173
3174 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003175 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003176 parameters_options_no_agc.options.auto_gain_control =
3177 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003178 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003179 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3180 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3181 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003182 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003183
solenberg246b8172015-12-08 09:50:23 -08003184 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003185 bool ec_enabled;
3186 webrtc::EcModes ec_mode;
3187 bool agc_enabled;
3188 webrtc::AgcModes agc_mode;
3189 bool ns_enabled;
3190 webrtc::NsModes ns_mode;
3191 voe_.GetEcStatus(ec_enabled, ec_mode);
3192 voe_.GetAgcStatus(agc_enabled, agc_mode);
3193 voe_.GetNsStatus(ns_enabled, ns_mode);
3194 EXPECT_TRUE(ec_enabled);
3195 EXPECT_TRUE(agc_enabled);
3196 EXPECT_TRUE(ns_enabled);
3197
solenbergd53a3f92016-04-14 13:56:37 -07003198 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003199 voe_.GetEcStatus(ec_enabled, ec_mode);
3200 voe_.GetAgcStatus(agc_enabled, agc_mode);
3201 voe_.GetNsStatus(ns_enabled, ns_mode);
3202 EXPECT_TRUE(ec_enabled);
3203 EXPECT_TRUE(agc_enabled);
3204 EXPECT_FALSE(ns_enabled);
3205
solenbergd53a3f92016-04-14 13:56:37 -07003206 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003207 voe_.GetEcStatus(ec_enabled, ec_mode);
3208 voe_.GetAgcStatus(agc_enabled, agc_mode);
3209 voe_.GetNsStatus(ns_enabled, ns_mode);
3210 EXPECT_TRUE(ec_enabled);
3211 EXPECT_FALSE(agc_enabled);
3212 EXPECT_TRUE(ns_enabled);
3213
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003214 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003215 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003216 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3217 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003218 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003219 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003220 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003221 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003222 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003223 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003224 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3225 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3226 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003227 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003228 voe_.GetEcStatus(ec_enabled, ec_mode);
3229 voe_.GetAgcStatus(agc_enabled, agc_mode);
3230 voe_.GetNsStatus(ns_enabled, ns_mode);
3231 EXPECT_TRUE(ec_enabled);
3232 EXPECT_FALSE(agc_enabled);
3233 EXPECT_FALSE(ns_enabled);
3234}
3235
wu@webrtc.orgde305012013-10-31 15:40:38 +00003236// This test verifies DSCP settings are properly applied on voice media channel.
3237TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003238 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003239 cricket::FakeNetworkInterface network_interface;
3240 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003241 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003242
solenbergbc37fc82016-04-04 09:54:44 -07003243 channel.reset(
3244 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003245 channel->SetInterface(&network_interface);
3246 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3247 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3248
3249 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003250 channel.reset(
3251 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003252 channel->SetInterface(&network_interface);
3253 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3254
3255 // Verify that setting the option to false resets the
3256 // DiffServCodePoint.
3257 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003258 channel.reset(
3259 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003260 channel->SetInterface(&network_interface);
3261 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3262 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3263
3264 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003265}
3266
solenberg1ac56142015-10-13 03:58:19 -07003267TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003268 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003269 cricket::WebRtcVoiceMediaChannel* media_channel =
3270 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003271 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3272 EXPECT_TRUE(channel_->AddRecvStream(
3273 cricket::StreamParams::CreateLegacy(kSsrc1)));
3274 int channel_id = voe_.GetLastChannel();
3275 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3276 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3277 EXPECT_TRUE(channel_->AddRecvStream(
3278 cricket::StreamParams::CreateLegacy(kSsrc2)));
3279 int channel_id2 = voe_.GetLastChannel();
3280 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003281}
3282
solenberg1ac56142015-10-13 03:58:19 -07003283TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003284 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003285 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003286 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3287 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3288 EXPECT_TRUE(channel_->AddSendStream(
3289 cricket::StreamParams::CreateLegacy(kSsrc1)));
3290 int channel_id = voe_.GetLastChannel();
3291 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3292 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3293 EXPECT_TRUE(channel_->AddSendStream(
3294 cricket::StreamParams::CreateLegacy(kSsrc2)));
3295 int channel_id2 = voe_.GetLastChannel();
3296 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003297}
3298
solenberg4bac9c52015-10-09 02:32:53 -07003299TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003300 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003301 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003302 cricket::StreamParams stream;
3303 stream.ssrcs.push_back(kSsrc2);
3304 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003305 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003306 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003307 float scale = 0;
3308 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3309 EXPECT_DOUBLE_EQ(3, scale);
3310}
3311
3312TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003313 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003314 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3315 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3316 int channel_id = voe_.GetLastChannel();
3317 float scale = 0;
3318 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3319 EXPECT_DOUBLE_EQ(2, scale);
3320 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003321 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003322 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003323}
3324
pbos8fc7fa72015-07-15 08:02:58 -07003325TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003326 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003327 const std::string kSyncLabel = "AvSyncLabel";
3328
solenbergff976312016-03-30 23:28:51 -07003329 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003330 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3331 sp.sync_label = kSyncLabel;
3332 // Creating two channels to make sure that sync label is set properly for both
3333 // the default voice channel and following ones.
3334 EXPECT_TRUE(channel_->AddRecvStream(sp));
3335 sp.ssrcs[0] += 1;
3336 EXPECT_TRUE(channel_->AddRecvStream(sp));
3337
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003338 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003339 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003340 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003341 << "SyncGroup should be set based on sync_label";
3342 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003343 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003344 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003345}
3346
solenberg3a941542015-11-16 07:34:50 -08003347// TODO(solenberg): Remove, once recv streams are configured through Call.
3348// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003349TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003350 // Test that setting the header extensions results in the expected state
3351 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003352 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003353 ssrcs.push_back(223);
3354 ssrcs.push_back(224);
3355
solenbergff976312016-03-30 23:28:51 -07003356 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003357 cricket::WebRtcVoiceMediaChannel* media_channel =
3358 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003359 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003360 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003361 EXPECT_TRUE(media_channel->AddRecvStream(
3362 cricket::StreamParams::CreateLegacy(ssrc)));
3363 }
3364
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003365 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003366 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003367 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003368 EXPECT_NE(nullptr, s);
3369 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3370 }
3371
3372 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003373 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003374 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003375 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003376 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003377 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003378 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003379 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003380 EXPECT_NE(nullptr, s);
3381 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003382 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3383 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003384 for (const auto& s_ext : s_exts) {
3385 if (e_ext.id == s_ext.id) {
3386 EXPECT_EQ(e_ext.uri, s_ext.name);
3387 }
3388 }
3389 }
3390 }
3391
3392 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003393 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003394 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003395 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003396 EXPECT_NE(nullptr, s);
3397 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3398 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003399}
3400
3401TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3402 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003403 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003404 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003405 static const unsigned char kRtcp[] = {
3406 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3407 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3410 };
jbaucheec21bd2016-03-20 06:15:43 -07003411 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003412
solenbergff976312016-03-30 23:28:51 -07003413 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003414 cricket::WebRtcVoiceMediaChannel* media_channel =
3415 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003416 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003417 EXPECT_TRUE(media_channel->AddRecvStream(
3418 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3419
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003420 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003421 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003422 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003423 EXPECT_EQ(0, s->received_packets());
3424 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3425 EXPECT_EQ(1, s->received_packets());
3426 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3427 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003428}
Minyue2013aec2015-05-13 14:14:42 +02003429
solenberg0a617e22015-10-20 15:49:38 -07003430// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003431// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003432TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003433 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003434 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003435 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003436 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3437 int recv_ch = voe_.GetLastChannel();
3438 EXPECT_NE(recv_ch, default_channel);
3439 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3440 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3441 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003442 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3443 recv_ch = voe_.GetLastChannel();
3444 EXPECT_NE(recv_ch, default_channel);
3445 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003446}
3447
3448TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003449 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003450 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003451
3452 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3453 int recv_ch = voe_.GetLastChannel();
3454
3455 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3456 int send_ch = voe_.GetLastChannel();
3457
3458 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3459 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3460 // channel of |recv_ch|.This is not a common case, since, normally, only the
3461 // default channel can be associated. However, the default is not deletable.
3462 // So we force the |recv_ch| to associate with a non-default channel.
3463 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3464 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3465
3466 EXPECT_TRUE(channel_->RemoveSendStream(2));
3467 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3468}
stefan658910c2015-09-03 05:48:32 -07003469
deadbeef884f5852016-01-15 09:20:04 -08003470TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003471 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003472 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3473 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003474
3475 // Setting the sink before a recv stream exists should do nothing.
3476 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3477 EXPECT_TRUE(
3478 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3479 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3480
3481 // Now try actually setting the sink.
3482 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3483 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3484
3485 // Now try resetting it.
3486 channel_->SetRawAudioSink(kSsrc1, nullptr);
3487 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3488}
3489
3490TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003491 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003492 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3493 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003494
3495 // Should be able to set a default sink even when no stream exists.
3496 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3497
3498 // Create default channel and ensure it's assigned the default sink.
3499 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3500 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3501
3502 // Try resetting the default sink.
3503 channel_->SetRawAudioSink(0, nullptr);
3504 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3505
3506 // Try setting the default sink while the default stream exists.
3507 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3508 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3509
3510 // If we remove and add a default stream, it should get the same sink.
3511 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3512 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3513 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3514}
3515
skvlad7a43d252016-03-22 15:32:27 -07003516// Test that, just like the video channel, the voice channel communicates the
3517// network state to the call.
3518TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003519 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003520
3521 EXPECT_EQ(webrtc::kNetworkUp,
3522 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3523 EXPECT_EQ(webrtc::kNetworkUp,
3524 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3525
3526 channel_->OnReadyToSend(false);
3527 EXPECT_EQ(webrtc::kNetworkDown,
3528 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3529 EXPECT_EQ(webrtc::kNetworkUp,
3530 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3531
3532 channel_->OnReadyToSend(true);
3533 EXPECT_EQ(webrtc::kNetworkUp,
3534 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3535 EXPECT_EQ(webrtc::kNetworkUp,
3536 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3537}
3538
stefan658910c2015-09-03 05:48:32 -07003539// Tests that the library initializes and shuts down properly.
3540TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003541 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003542 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003543 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003544 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3545 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003546 EXPECT_TRUE(channel != nullptr);
3547 delete channel;
solenbergff976312016-03-30 23:28:51 -07003548}
stefan658910c2015-09-03 05:48:32 -07003549
solenbergff976312016-03-30 23:28:51 -07003550// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003551TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3552 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3553 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3554 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003555 {
3556 cricket::WebRtcVoiceEngine engine(&adm);
3557 std::unique_ptr<webrtc::Call> call(
3558 webrtc::Call::Create(webrtc::Call::Config()));
3559 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3560 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3561 EXPECT_TRUE(channel != nullptr);
3562 delete channel;
3563 }
stefan658910c2015-09-03 05:48:32 -07003564}
3565
3566// Tests that the library is configured with the codecs we want.
3567TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003568 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003569 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003570 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003571 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003572 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003573 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003574 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003575 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003576 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003577 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003578 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003579 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003580 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003581 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003582 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003583 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003584 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003585 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003586 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003587 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003588 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003589 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003590 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003591 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003592 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003593 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003594 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003595 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003596 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003597 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003598 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003599 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003600 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003601 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003602 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003603 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003604 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003605 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003606 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003607 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003608 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003609 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003610 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003611 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003612 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003613 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003614 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003615 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003616 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003617 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003618 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003619
stefan658910c2015-09-03 05:48:32 -07003620 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003621 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003622 for (std::vector<cricket::AudioCodec>::const_iterator it =
3623 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3624 if (it->name == "CN" && it->clockrate == 16000) {
3625 EXPECT_EQ(105, it->id);
3626 } else if (it->name == "CN" && it->clockrate == 32000) {
3627 EXPECT_EQ(106, it->id);
3628 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3629 EXPECT_EQ(103, it->id);
3630 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3631 EXPECT_EQ(104, it->id);
3632 } else if (it->name == "G722" && it->clockrate == 8000) {
3633 EXPECT_EQ(9, it->id);
3634 } else if (it->name == "telephone-event") {
3635 EXPECT_EQ(126, it->id);
3636 } else if (it->name == "red") {
3637 EXPECT_EQ(127, it->id);
3638 } else if (it->name == "opus") {
3639 EXPECT_EQ(111, it->id);
3640 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3641 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003642 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3643 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3644 }
3645 }
stefan658910c2015-09-03 05:48:32 -07003646}
3647
3648// Tests that VoE supports at least 32 channels
3649TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003650 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003651 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003652 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003653
3654 cricket::VoiceMediaChannel* channels[32];
3655 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003656 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003657 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3658 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003659 if (!channel)
3660 break;
stefan658910c2015-09-03 05:48:32 -07003661 channels[num_channels++] = channel;
3662 }
3663
tfarina5237aaf2015-11-10 23:44:30 -08003664 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003665 EXPECT_EQ(expected, num_channels);
3666
3667 while (num_channels > 0) {
3668 delete channels[--num_channels];
3669 }
stefan658910c2015-09-03 05:48:32 -07003670}
3671
3672// Test that we set our preferred codecs properly.
3673TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003674 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003675 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003676 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003677 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3678 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003679 cricket::AudioRecvParameters parameters;
3680 parameters.codecs = engine.codecs();
3681 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003682}