blob: 337f1d581f953aa2688f4cc2ed734fcaf797e44c [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
solenbergbc37fc82016-04-04 09:54:44 -070029using testing::Return;
30using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000031
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020032namespace {
33
deadbeef67cf2c12016-04-13 10:07:16 -070034const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
35const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
36const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
37const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
38const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
39const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1);
40const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
41const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
42const cricket::AudioCodec kTelephoneEventCodec(106,
43 "telephone-event",
44 8000,
45 0,
46 1);
solenberg85a04962015-10-27 03:35:21 -070047const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080048const uint32_t kSsrc2 = 2;
49const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070050const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
52class FakeVoEWrapper : public cricket::VoEWrapper {
53 public:
54 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
55 : cricket::VoEWrapper(engine, // processing
56 engine, // base
57 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine) { // volume
61 }
62};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020063} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
solenbergff976312016-03-30 23:28:51 -070065// Tests that our stub library "works".
66TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070067 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
68 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
69 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070070 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
71 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
72 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070073 cricket::FakeWebRtcVoiceEngine voe;
74 EXPECT_FALSE(voe.IsInited());
75 {
solenbergbc37fc82016-04-04 09:54:44 -070076 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070077 EXPECT_TRUE(voe.IsInited());
78 }
79 EXPECT_FALSE(voe.IsInited());
80}
81
deadbeef884f5852016-01-15 09:20:04 -080082class FakeAudioSink : public webrtc::AudioSinkInterface {
83 public:
84 void OnData(const Data& audio) override {}
85};
86
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080087class FakeAudioSource : public cricket::AudioSource {
88 void SetSink(Sink* sink) override {}
89};
90
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091class WebRtcVoiceEngineTestFake : public testing::Test {
92 public:
stefanba4c0e42016-02-04 04:12:24 -080093 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
94
95 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070096 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
97 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
98 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070099 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
100 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
101 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergbc37fc82016-04-04 09:54:44 -0700102 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
103 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200104 send_parameters_.codecs.push_back(kPcmuCodec);
105 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 }
solenbergff976312016-03-30 23:28:51 -0700107 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700108 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
109 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200110 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000111 }
solenbergff976312016-03-30 23:28:51 -0700112 bool SetupRecvStream() {
113 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700114 return false;
115 }
116 return channel_->AddRecvStream(
117 cricket::StreamParams::CreateLegacy(kSsrc1));
118 }
solenbergff976312016-03-30 23:28:51 -0700119 bool SetupSendStream() {
120 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000121 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800123 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
124 return false;
125 }
126 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000128 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700129 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700130 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800131 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700132 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700133 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800134 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000135 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700137 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000138 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200140 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
143
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100144 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
145 const auto* send_stream = call_.GetAudioSendStream(ssrc);
146 EXPECT_TRUE(send_stream);
147 return *send_stream;
148 }
149
deadbeef884f5852016-01-15 09:20:04 -0800150 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
151 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
152 EXPECT_TRUE(recv_stream);
153 return *recv_stream;
154 }
155
solenberg3a941542015-11-16 07:34:50 -0800156 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800157 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800158 }
159
solenberg7add0582015-11-20 09:59:34 -0800160 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800161 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800162 }
163
solenbergd53a3f92016-04-14 13:56:37 -0700164 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
165 ASSERT_TRUE(channel);
166 if (enable) {
167 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
168 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
169 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
170 }
171 channel->SetSend(enable);
172 }
173
Peter Boström0c4e06b2015-10-07 12:23:21 +0200174 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700175 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000176 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700177 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000178 // send stream.
179 EXPECT_TRUE(channel_->AddSendStream(
180 cricket::StreamParams::CreateLegacy(kSsrc1)));
181 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000182
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200184 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700185 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800187 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200188 send_parameters_.codecs.push_back(kTelephoneEventCodec);
189 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000190 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000191
192 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700193 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800194 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000195 EXPECT_TRUE(channel_->AddSendStream(
196 cricket::StreamParams::CreateLegacy(kSsrc1)));
197 }
198
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800200 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100202 // Test send.
203 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
204 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
205 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800206 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100207 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
208 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
209 EXPECT_EQ(2, telephone_event.event_code);
210 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 }
212
213 // Test that send bandwidth is set correctly.
214 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000215 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
216 // |expected_result| is the expected result from SetMaxSendBandwidth().
217 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700218 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
219 int max_bitrate,
220 bool expected_result,
221 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200222 cricket::AudioSendParameters parameters;
223 parameters.codecs.push_back(codec);
224 parameters.max_bandwidth_bps = max_bitrate;
225 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
226
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000227 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000228 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000230 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 }
232
skvlade0d46372016-04-07 22:59:22 -0700233 // Sets the per-stream maximum bitrate limit for the specified SSRC.
234 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700235 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700236 EXPECT_EQ(1UL, parameters.encodings.size());
237
238 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700239 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700240 }
241
242 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
243 cricket::AudioSendParameters send_parameters;
244 send_parameters.codecs.push_back(codec);
245 send_parameters.max_bandwidth_bps = bitrate;
246 return channel_->SetSendParameters(send_parameters);
247 }
248
249 int GetCodecBitrate(int32_t ssrc) {
250 cricket::WebRtcVoiceMediaChannel* media_channel =
251 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
252 int channel = media_channel->GetSendChannelId(ssrc);
253 EXPECT_NE(-1, channel);
254 webrtc::CodecInst codec;
255 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
256 return codec.rate;
257 }
258
259 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
260 int global_max,
261 int stream_max,
262 bool expected_result,
263 int expected_codec_bitrate) {
264 // Clear the bitrate limit from the previous test case.
265 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
266
267 // Attempt to set the requested bitrate limits.
268 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
269 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
270
271 // Verify that reading back the parameters gives results
272 // consistent with the Set() result.
273 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700274 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700275 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
276 EXPECT_EQ(expected_result ? stream_max : -1,
277 resulting_parameters.encodings[0].max_bitrate_bps);
278
279 // Verify that the codec settings have the expected bitrate.
280 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
281 }
282
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000283 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700284 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000285
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000286 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800287 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000288
289 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700290 send_parameters_.extensions.push_back(
291 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200292 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800293 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000294
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000295 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200296 send_parameters_.extensions.clear();
297 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800298 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000299
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000300 // Ensure extension is set properly.
301 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700302 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200303 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800304 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700305 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800306 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000307
solenberg7add0582015-11-20 09:59:34 -0800308 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000309 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700310 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800311 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
312 call_.GetAudioSendStream(kSsrc2));
313 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700314 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800315 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000316
317 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200318 send_parameters_.codecs.push_back(kPcmuCodec);
319 send_parameters_.extensions.clear();
320 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800321 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
322 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000323 }
324
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000325 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700326 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000327
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000328 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800329 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000330
331 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700332 recv_parameters_.extensions.push_back(
333 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800334 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
335 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000336
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000337 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800338 recv_parameters_.extensions.clear();
339 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
340 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000341
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000342 // Ensure extension is set properly.
343 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700344 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800345 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
346 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700347 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800348 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000349
solenberg7add0582015-11-20 09:59:34 -0800350 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000351 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700352 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800353 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
354 call_.GetAudioReceiveStream(kSsrc2));
355 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700356 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800357 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000358
359 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800360 recv_parameters_.extensions.clear();
361 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
362 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
363 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000364 }
365
solenberg85a04962015-10-27 03:35:21 -0700366 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
367 webrtc::AudioSendStream::Stats stats;
368 stats.local_ssrc = 12;
369 stats.bytes_sent = 345;
370 stats.packets_sent = 678;
371 stats.packets_lost = 9012;
372 stats.fraction_lost = 34.56f;
373 stats.codec_name = "codec_name_send";
374 stats.ext_seqnum = 789;
375 stats.jitter_ms = 12;
376 stats.rtt_ms = 345;
377 stats.audio_level = 678;
378 stats.aec_quality_min = 9.01f;
379 stats.echo_delay_median_ms = 234;
380 stats.echo_delay_std_ms = 567;
381 stats.echo_return_loss = 890;
382 stats.echo_return_loss_enhancement = 1234;
383 stats.typing_noise_detected = true;
384 return stats;
385 }
386 void SetAudioSendStreamStats() {
387 for (auto* s : call_.GetAudioSendStreams()) {
388 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200389 }
solenberg85a04962015-10-27 03:35:21 -0700390 }
solenberg566ef242015-11-06 15:34:49 -0800391 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
392 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700393 const auto stats = GetAudioSendStreamStats();
394 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
395 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
396 EXPECT_EQ(info.packets_sent, stats.packets_sent);
397 EXPECT_EQ(info.packets_lost, stats.packets_lost);
398 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
399 EXPECT_EQ(info.codec_name, stats.codec_name);
400 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
401 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
402 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
403 EXPECT_EQ(info.audio_level, stats.audio_level);
404 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
405 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
406 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
407 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
408 EXPECT_EQ(info.echo_return_loss_enhancement,
409 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800410 EXPECT_EQ(info.typing_noise_detected,
411 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700412 }
413
414 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
415 webrtc::AudioReceiveStream::Stats stats;
416 stats.remote_ssrc = 123;
417 stats.bytes_rcvd = 456;
418 stats.packets_rcvd = 768;
419 stats.packets_lost = 101;
420 stats.fraction_lost = 23.45f;
421 stats.codec_name = "codec_name_recv";
422 stats.ext_seqnum = 678;
423 stats.jitter_ms = 901;
424 stats.jitter_buffer_ms = 234;
425 stats.jitter_buffer_preferred_ms = 567;
426 stats.delay_estimate_ms = 890;
427 stats.audio_level = 1234;
428 stats.expand_rate = 5.67f;
429 stats.speech_expand_rate = 8.90f;
430 stats.secondary_decoded_rate = 1.23f;
431 stats.accelerate_rate = 4.56f;
432 stats.preemptive_expand_rate = 7.89f;
433 stats.decoding_calls_to_silence_generator = 12;
434 stats.decoding_calls_to_neteq = 345;
435 stats.decoding_normal = 67890;
436 stats.decoding_plc = 1234;
437 stats.decoding_cng = 5678;
438 stats.decoding_plc_cng = 9012;
439 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200440 return stats;
441 }
442 void SetAudioReceiveStreamStats() {
443 for (auto* s : call_.GetAudioReceiveStreams()) {
444 s->SetStats(GetAudioReceiveStreamStats());
445 }
446 }
447 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700448 const auto stats = GetAudioReceiveStreamStats();
449 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
450 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
451 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
452 EXPECT_EQ(info.packets_lost, stats.packets_lost);
453 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
454 EXPECT_EQ(info.codec_name, stats.codec_name);
455 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
456 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
457 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200458 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700459 stats.jitter_buffer_preferred_ms);
460 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
461 EXPECT_EQ(info.audio_level, stats.audio_level);
462 EXPECT_EQ(info.expand_rate, stats.expand_rate);
463 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
464 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
465 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
466 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200467 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700468 stats.decoding_calls_to_silence_generator);
469 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
470 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
471 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
472 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
473 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
474 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200475 }
476
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700478 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200479 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700481 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700482 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200483 cricket::AudioSendParameters send_parameters_;
484 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800485 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800486 private:
487 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488};
489
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490// Tests that we can create and destroy a channel.
491TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700492 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493}
494
solenberg31fec402016-05-06 02:13:12 -0700495// Test that we can add a send stream and that it has the correct defaults.
496TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
497 EXPECT_TRUE(SetupChannel());
498 EXPECT_TRUE(
499 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
500 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
501 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
502 EXPECT_EQ("", config.rtp.c_name);
503 EXPECT_EQ(0u, config.rtp.extensions.size());
504 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
505 config.send_transport);
506}
507
508// Test that we can add a receive stream and that it has the correct defaults.
509TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
510 EXPECT_TRUE(SetupChannel());
511 EXPECT_TRUE(
512 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
513 const webrtc::AudioReceiveStream::Config& config =
514 GetRecvStreamConfig(kSsrc1);
515 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
516 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
517 EXPECT_FALSE(config.rtp.transport_cc);
518 EXPECT_EQ(0u, config.rtp.extensions.size());
519 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
520 config.rtcp_send_transport);
521 EXPECT_EQ("", config.sync_group);
522}
523
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700525// correctly (such that opus appears first).
526TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700527 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 ASSERT_FALSE(codecs.empty());
529 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
530 EXPECT_EQ(48000, codecs[0].clockrate);
531 EXPECT_EQ(2, codecs[0].channels);
532 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000533}
534
stefanba4c0e42016-02-04 04:12:24 -0800535TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700536 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800537 bool opus_found = false;
538 for (cricket::AudioCodec codec : codecs) {
539 if (codec.name == "opus") {
540 EXPECT_TRUE(HasTransportCc(codec));
541 opus_found = true;
542 }
543 }
544 EXPECT_TRUE(opus_found);
545}
546
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547// Tests that we can find codecs by name or id, and that we interpret the
548// clockrate and bitrate fields properly.
549TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
550 cricket::AudioCodec codec;
551 webrtc::CodecInst codec_inst;
552 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800553 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800555 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800557 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
558 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 // Find ISAC with a different payload id.
560 codec = kIsacCodec;
561 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800562 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 EXPECT_EQ(codec.id, codec_inst.pltype);
564 // Find PCMU with a 0 clockrate.
565 codec = kPcmuCodec;
566 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800567 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 EXPECT_EQ(codec.id, codec_inst.pltype);
569 EXPECT_EQ(8000, codec_inst.plfreq);
570 // Find PCMU with a 0 bitrate.
571 codec = kPcmuCodec;
572 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800573 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574 EXPECT_EQ(codec.id, codec_inst.pltype);
575 EXPECT_EQ(64000, codec_inst.rate);
576 // Find ISAC with an explicit bitrate.
577 codec = kIsacCodec;
578 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800579 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 EXPECT_EQ(codec.id, codec_inst.pltype);
581 EXPECT_EQ(32000, codec_inst.rate);
582}
583
584// Test that we set our inbound codecs properly, including changing PT.
585TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700586 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200587 cricket::AudioRecvParameters parameters;
588 parameters.codecs.push_back(kIsacCodec);
589 parameters.codecs.push_back(kPcmuCodec);
590 parameters.codecs.push_back(kTelephoneEventCodec);
591 parameters.codecs[0].id = 106; // collide with existing telephone-event
592 parameters.codecs[2].id = 126;
593 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700594 EXPECT_TRUE(channel_->AddRecvStream(
595 cricket::StreamParams::CreateLegacy(kSsrc1)));
596 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800598 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 gcodec.plfreq = 16000;
600 gcodec.channels = 1;
601 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
602 EXPECT_EQ(106, gcodec.pltype);
603 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800604 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 gcodec.plfreq = 8000;
606 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
607 EXPECT_EQ(126, gcodec.pltype);
608 EXPECT_STREQ("telephone-event", gcodec.plname);
609}
610
611// Test that we fail to set an unknown inbound codec.
612TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700613 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200614 cricket::AudioRecvParameters parameters;
615 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700616 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200617 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618}
619
620// Test that we fail if we have duplicate types in the inbound list.
621TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700622 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200623 cricket::AudioRecvParameters parameters;
624 parameters.codecs.push_back(kIsacCodec);
625 parameters.codecs.push_back(kCn16000Codec);
626 parameters.codecs[1].id = kIsacCodec.id;
627 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628}
629
630// Test that we can decode OPUS without stereo parameters.
631TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700632 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200633 cricket::AudioRecvParameters parameters;
634 parameters.codecs.push_back(kIsacCodec);
635 parameters.codecs.push_back(kPcmuCodec);
636 parameters.codecs.push_back(kOpusCodec);
637 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 EXPECT_TRUE(channel_->AddRecvStream(
639 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700640 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800642 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 // Even without stereo parameters, recv codecs still specify channels = 2.
644 EXPECT_EQ(2, opus.channels);
645 EXPECT_EQ(111, opus.pltype);
646 EXPECT_STREQ("opus", opus.plname);
647 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700648 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 EXPECT_EQ(111, opus.pltype);
650}
651
652// Test that we can decode OPUS with stereo = 0.
653TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700654 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200655 cricket::AudioRecvParameters parameters;
656 parameters.codecs.push_back(kIsacCodec);
657 parameters.codecs.push_back(kPcmuCodec);
658 parameters.codecs.push_back(kOpusCodec);
659 parameters.codecs[2].params["stereo"] = "0";
660 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661 EXPECT_TRUE(channel_->AddRecvStream(
662 cricket::StreamParams::CreateLegacy(kSsrc1)));
663 int channel_num2 = voe_.GetLastChannel();
664 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800665 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 // Even when stereo is off, recv codecs still specify channels = 2.
667 EXPECT_EQ(2, opus.channels);
668 EXPECT_EQ(111, opus.pltype);
669 EXPECT_STREQ("opus", opus.plname);
670 opus.pltype = 0;
671 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
672 EXPECT_EQ(111, opus.pltype);
673}
674
675// Test that we can decode OPUS with stereo = 1.
676TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700677 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200678 cricket::AudioRecvParameters parameters;
679 parameters.codecs.push_back(kIsacCodec);
680 parameters.codecs.push_back(kPcmuCodec);
681 parameters.codecs.push_back(kOpusCodec);
682 parameters.codecs[2].params["stereo"] = "1";
683 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 EXPECT_TRUE(channel_->AddRecvStream(
685 cricket::StreamParams::CreateLegacy(kSsrc1)));
686 int channel_num2 = voe_.GetLastChannel();
687 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800688 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 EXPECT_EQ(2, opus.channels);
690 EXPECT_EQ(111, opus.pltype);
691 EXPECT_STREQ("opus", opus.plname);
692 opus.pltype = 0;
693 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
694 EXPECT_EQ(111, opus.pltype);
695}
696
697// Test that changes to recv codecs are applied to all streams.
698TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700699 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200700 cricket::AudioRecvParameters parameters;
701 parameters.codecs.push_back(kIsacCodec);
702 parameters.codecs.push_back(kPcmuCodec);
703 parameters.codecs.push_back(kTelephoneEventCodec);
704 parameters.codecs[0].id = 106; // collide with existing telephone-event
705 parameters.codecs[2].id = 126;
706 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 EXPECT_TRUE(channel_->AddRecvStream(
708 cricket::StreamParams::CreateLegacy(kSsrc1)));
709 int channel_num2 = voe_.GetLastChannel();
710 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800711 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712 gcodec.plfreq = 16000;
713 gcodec.channels = 1;
714 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
715 EXPECT_EQ(106, gcodec.pltype);
716 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800717 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000718 gcodec.plfreq = 8000;
719 gcodec.channels = 1;
720 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
721 EXPECT_EQ(126, gcodec.pltype);
722 EXPECT_STREQ("telephone-event", gcodec.plname);
723}
724
725TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700726 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200727 cricket::AudioRecvParameters parameters;
728 parameters.codecs.push_back(kIsacCodec);
729 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200730 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731
732 int channel_num2 = voe_.GetLastChannel();
733 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800734 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735 gcodec.plfreq = 16000;
736 gcodec.channels = 1;
737 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
738 EXPECT_EQ(106, gcodec.pltype);
739 EXPECT_STREQ("ISAC", gcodec.plname);
740}
741
742// Test that we can apply the same set of codecs again while playing.
743TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700744 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200745 cricket::AudioRecvParameters parameters;
746 parameters.codecs.push_back(kIsacCodec);
747 parameters.codecs.push_back(kCn16000Codec);
748 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200750 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751
752 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200753 parameters.codecs[0].id = 127;
754 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
755 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756 EXPECT_TRUE(voe_.GetPlayout(channel_num));
757}
758
759// Test that we can add a codec while playing.
760TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700761 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200762 cricket::AudioRecvParameters parameters;
763 parameters.codecs.push_back(kIsacCodec);
764 parameters.codecs.push_back(kCn16000Codec);
765 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 EXPECT_TRUE(channel_->SetPlayout(true));
767
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200768 parameters.codecs.push_back(kOpusCodec);
769 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
770 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771 EXPECT_TRUE(voe_.GetPlayout(channel_num));
772 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800773 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000774 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
775}
776
777TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700778 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000780 // Test that when autobw is enabled, bitrate is kept as the default
781 // value. autobw is enabled for the following tests because the target
782 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783
784 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700785 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786
787 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700788 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700791 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792}
793
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000794TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700795 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000797 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
799 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700800 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
801 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
802 // Rates above the max (56000) should be capped.
803 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000804
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700806 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
807 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
808 // Rates above the max (510000) should be capped.
809 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810}
811
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000812TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700813 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000814
815 // Test that we can only set a maximum bitrate for a fixed-rate codec
816 // if it's bigger than the fixed rate.
817
818 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700819 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
820 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
821 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
822 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
823 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
824 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
825 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000826}
827
828TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700829 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200830 const int kDesiredBitrate = 128000;
831 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700832 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200833 parameters.max_bandwidth_bps = kDesiredBitrate;
834 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000835
836 EXPECT_TRUE(channel_->AddSendStream(
837 cricket::StreamParams::CreateLegacy(kSsrc1)));
838
839 int channel_num = voe_.GetLastChannel();
840 webrtc::CodecInst codec;
841 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200842 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000843}
844
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845// Test that bitrate cannot be set for CBR codecs.
846// Bitrate is ignored if it is higher than the fixed bitrate.
847// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000848TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700849 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000850
851 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200852 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
853 int channel_num = voe_.GetLastChannel();
854 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
856 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857
858 send_parameters_.max_bandwidth_bps = 128000;
859 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
861 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200862
863 send_parameters_.max_bandwidth_bps = 128;
864 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
866 EXPECT_EQ(64000, codec.rate);
867}
868
skvlade0d46372016-04-07 22:59:22 -0700869// Test that the per-stream bitrate limit and the global
870// bitrate limit both apply.
871TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
872 EXPECT_TRUE(SetupSendStream());
873
874 // opus, default bitrate == 64000.
875 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
876 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
877 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
878 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
879
880 // CBR codecs allow both maximums to exceed the bitrate.
881 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
882 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
883 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
884 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
885
886 // CBR codecs don't allow per stream maximums to be too low.
887 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
888 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
889}
890
891// Test that an attempt to set RtpParameters for a stream that does not exist
892// fails.
893TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
894 EXPECT_TRUE(SetupChannel());
895 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700896 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700897 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
898
899 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700900 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700901}
902
903TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700904 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700905 // This test verifies that setting RtpParameters succeeds only if
906 // the structure contains exactly one encoding.
907 // TODO(skvlad): Update this test when we start supporting setting parameters
908 // for each encoding individually.
909
910 EXPECT_TRUE(SetupSendStream());
911 // Setting RtpParameters with no encoding is expected to fail.
912 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700913 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700914 // Setting RtpParameters with exactly one encoding should succeed.
915 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700916 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700917 // Two or more encodings should result in failure.
918 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700919 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700920}
921
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700922// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700923// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700924TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
925 EXPECT_TRUE(SetupSendStream());
926 SetSend(channel_, true);
927 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
928 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700929 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700930 ASSERT_EQ(1u, parameters.encodings.size());
931 ASSERT_TRUE(parameters.encodings[0].active);
932 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700933 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700934 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
935
936 // Now change it back to active and verify we resume sending.
937 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700938 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700939 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
940}
941
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700942// Test that SetRtpSendParameters configures the correct encoding channel for
943// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700944TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
945 SetupForMultiSendStream();
946 // Create send streams.
947 for (uint32_t ssrc : kSsrcs4) {
948 EXPECT_TRUE(
949 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
950 }
951 // Configure one stream to be limited by the stream config, another to be
952 // limited by the global max, and the third one with no per-stream limit
953 // (still subject to the global limit).
954 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
955 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
956 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
957 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
958
959 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
960 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
961 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
962
963 // Remove the global cap; the streams should switch to their respective
964 // maximums (or remain unchanged if there was no other limit on them.)
965 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
966 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
967 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
968 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
969}
970
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700971// Test that GetRtpSendParameters returns the currently configured codecs.
972TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700973 EXPECT_TRUE(SetupSendStream());
974 cricket::AudioSendParameters parameters;
975 parameters.codecs.push_back(kIsacCodec);
976 parameters.codecs.push_back(kPcmuCodec);
977 EXPECT_TRUE(channel_->SetSendParameters(parameters));
978
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700979 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700980 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700981 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
982 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700983}
984
985// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700986TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700987 EXPECT_TRUE(SetupSendStream());
988 cricket::AudioSendParameters parameters;
989 parameters.codecs.push_back(kIsacCodec);
990 parameters.codecs.push_back(kPcmuCodec);
991 EXPECT_TRUE(channel_->SetSendParameters(parameters));
992
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700993 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700994
995 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700996 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700997
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700998 // ... And this shouldn't change the params returned by GetRtpSendParameters.
999 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1000 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1001}
1002
1003// Test that GetRtpReceiveParameters returns the currently configured codecs.
1004TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1005 EXPECT_TRUE(SetupRecvStream());
1006 cricket::AudioRecvParameters parameters;
1007 parameters.codecs.push_back(kIsacCodec);
1008 parameters.codecs.push_back(kPcmuCodec);
1009 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1010
1011 webrtc::RtpParameters rtp_parameters =
1012 channel_->GetRtpReceiveParameters(kSsrc1);
1013 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1014 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1015 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1016}
1017
1018// Test that if we set/get parameters multiple times, we get the same results.
1019TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1020 EXPECT_TRUE(SetupRecvStream());
1021 cricket::AudioRecvParameters parameters;
1022 parameters.codecs.push_back(kIsacCodec);
1023 parameters.codecs.push_back(kPcmuCodec);
1024 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1025
1026 webrtc::RtpParameters initial_params =
1027 channel_->GetRtpReceiveParameters(kSsrc1);
1028
1029 // We should be able to set the params we just got.
1030 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1031
1032 // ... And this shouldn't change the params returned by
1033 // GetRtpReceiveParameters.
1034 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1035 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001036}
1037
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001038// Test that we apply codecs properly.
1039TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001040 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001041 cricket::AudioSendParameters parameters;
1042 parameters.codecs.push_back(kIsacCodec);
1043 parameters.codecs.push_back(kPcmuCodec);
1044 parameters.codecs.push_back(kRedCodec);
1045 parameters.codecs[0].id = 96;
1046 parameters.codecs[0].bitrate = 48000;
1047 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001048 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001050 webrtc::CodecInst gcodec;
1051 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1052 EXPECT_EQ(96, gcodec.pltype);
1053 EXPECT_EQ(48000, gcodec.rate);
1054 EXPECT_STREQ("ISAC", gcodec.plname);
1055 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001056 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1058 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001059 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060}
1061
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001062// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1063// to apply.
1064TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001065 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001066 cricket::AudioSendParameters parameters;
1067 parameters.codecs.push_back(kIsacCodec);
1068 parameters.codecs.push_back(kPcmuCodec);
1069 parameters.codecs.push_back(kRedCodec);
1070 parameters.codecs[0].id = 96;
1071 parameters.codecs[0].bitrate = 48000;
1072 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001073 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1074 // Calling SetSendCodec again with same codec which is already set.
1075 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001077 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1078}
1079
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001080// Verify that G722 is set with 16000 samples per second to WebRTC.
1081TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001082 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001083 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001084 cricket::AudioSendParameters parameters;
1085 parameters.codecs.push_back(kG722CodecSdp);
1086 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001087 webrtc::CodecInst gcodec;
1088 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1089 EXPECT_STREQ("G722", gcodec.plname);
1090 EXPECT_EQ(1, gcodec.channels);
1091 EXPECT_EQ(16000, gcodec.plfreq);
1092}
1093
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001094// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001096 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001097 cricket::AudioSendParameters parameters;
1098 parameters.codecs.push_back(kOpusCodec);
1099 parameters.codecs[0].bitrate = 0;
1100 parameters.codecs[0].clockrate = 50000;
1101 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102}
1103
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001104// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001106 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001107 cricket::AudioSendParameters parameters;
1108 parameters.codecs.push_back(kOpusCodec);
1109 parameters.codecs[0].bitrate = 0;
1110 parameters.codecs[0].channels = 0;
1111 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001112}
1113
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001114// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001116 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001117 cricket::AudioSendParameters parameters;
1118 parameters.codecs.push_back(kOpusCodec);
1119 parameters.codecs[0].bitrate = 0;
1120 parameters.codecs[0].channels = 0;
1121 parameters.codecs[0].params["stereo"] = "1";
1122 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123}
1124
1125// Test that if channel is 1 for opus and there's no stereo, we fail.
1126TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001127 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001128 cricket::AudioSendParameters parameters;
1129 parameters.codecs.push_back(kOpusCodec);
1130 parameters.codecs[0].bitrate = 0;
1131 parameters.codecs[0].channels = 1;
1132 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133}
1134
1135// Test that if channel is 1 for opus and stereo=0, we fail.
1136TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001137 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001138 cricket::AudioSendParameters parameters;
1139 parameters.codecs.push_back(kOpusCodec);
1140 parameters.codecs[0].bitrate = 0;
1141 parameters.codecs[0].channels = 1;
1142 parameters.codecs[0].params["stereo"] = "0";
1143 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001144}
1145
1146// Test that if channel is 1 for opus and stereo=1, we fail.
1147TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001148 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001149 cricket::AudioSendParameters parameters;
1150 parameters.codecs.push_back(kOpusCodec);
1151 parameters.codecs[0].bitrate = 0;
1152 parameters.codecs[0].channels = 1;
1153 parameters.codecs[0].params["stereo"] = "1";
1154 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155}
1156
1157// Test that with bitrate=0 and no stereo,
1158// channels and bitrate are 1 and 32000.
1159TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001160 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001162 cricket::AudioSendParameters parameters;
1163 parameters.codecs.push_back(kOpusCodec);
1164 parameters.codecs[0].bitrate = 0;
1165 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166 webrtc::CodecInst gcodec;
1167 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1168 EXPECT_STREQ("opus", gcodec.plname);
1169 EXPECT_EQ(1, gcodec.channels);
1170 EXPECT_EQ(32000, gcodec.rate);
1171}
1172
1173// Test that with bitrate=0 and stereo=0,
1174// channels and bitrate are 1 and 32000.
1175TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001176 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001177 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001178 cricket::AudioSendParameters parameters;
1179 parameters.codecs.push_back(kOpusCodec);
1180 parameters.codecs[0].bitrate = 0;
1181 parameters.codecs[0].params["stereo"] = "0";
1182 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 webrtc::CodecInst gcodec;
1184 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1185 EXPECT_STREQ("opus", gcodec.plname);
1186 EXPECT_EQ(1, gcodec.channels);
1187 EXPECT_EQ(32000, gcodec.rate);
1188}
1189
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001190// Test that with bitrate=invalid and stereo=0,
1191// channels and bitrate are 1 and 32000.
1192TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001193 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001194 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001195 cricket::AudioSendParameters parameters;
1196 parameters.codecs.push_back(kOpusCodec);
1197 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001198 webrtc::CodecInst gcodec;
1199
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001200 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001201 parameters.codecs[0].bitrate = 5999;
1202 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001203 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1204 EXPECT_STREQ("opus", gcodec.plname);
1205 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001206 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001207
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 parameters.codecs[0].bitrate = 510001;
1209 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001210 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1211 EXPECT_STREQ("opus", gcodec.plname);
1212 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001213 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001214}
1215
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216// Test that with bitrate=0 and stereo=1,
1217// channels and bitrate are 2 and 64000.
1218TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001219 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001221 cricket::AudioSendParameters parameters;
1222 parameters.codecs.push_back(kOpusCodec);
1223 parameters.codecs[0].bitrate = 0;
1224 parameters.codecs[0].params["stereo"] = "1";
1225 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001226 webrtc::CodecInst gcodec;
1227 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1228 EXPECT_STREQ("opus", gcodec.plname);
1229 EXPECT_EQ(2, gcodec.channels);
1230 EXPECT_EQ(64000, gcodec.rate);
1231}
1232
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001233// Test that with bitrate=invalid and stereo=1,
1234// channels and bitrate are 2 and 64000.
1235TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001236 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001237 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001238 cricket::AudioSendParameters parameters;
1239 parameters.codecs.push_back(kOpusCodec);
1240 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001241 webrtc::CodecInst gcodec;
1242
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001243 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001244 parameters.codecs[0].bitrate = 5999;
1245 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001246 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1247 EXPECT_STREQ("opus", gcodec.plname);
1248 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001249 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001250
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001251 parameters.codecs[0].bitrate = 510001;
1252 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001253 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1254 EXPECT_STREQ("opus", gcodec.plname);
1255 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001256 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001257}
1258
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001259// Test that with bitrate=N and stereo unset,
1260// channels and bitrate are 1 and N.
1261TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001262 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001264 cricket::AudioSendParameters parameters;
1265 parameters.codecs.push_back(kOpusCodec);
1266 parameters.codecs[0].bitrate = 96000;
1267 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001268 webrtc::CodecInst gcodec;
1269 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1270 EXPECT_EQ(111, gcodec.pltype);
1271 EXPECT_EQ(96000, gcodec.rate);
1272 EXPECT_STREQ("opus", gcodec.plname);
1273 EXPECT_EQ(1, gcodec.channels);
1274 EXPECT_EQ(48000, gcodec.plfreq);
1275}
1276
1277// Test that with bitrate=N and stereo=0,
1278// channels and bitrate are 1 and N.
1279TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001280 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001281 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001282 cricket::AudioSendParameters parameters;
1283 parameters.codecs.push_back(kOpusCodec);
1284 parameters.codecs[0].bitrate = 30000;
1285 parameters.codecs[0].params["stereo"] = "0";
1286 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001287 webrtc::CodecInst gcodec;
1288 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1289 EXPECT_EQ(1, gcodec.channels);
1290 EXPECT_EQ(30000, gcodec.rate);
1291 EXPECT_STREQ("opus", gcodec.plname);
1292}
1293
1294// Test that with bitrate=N and without any parameters,
1295// channels and bitrate are 1 and N.
1296TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001297 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001298 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001299 cricket::AudioSendParameters parameters;
1300 parameters.codecs.push_back(kOpusCodec);
1301 parameters.codecs[0].bitrate = 30000;
1302 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001303 webrtc::CodecInst gcodec;
1304 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1305 EXPECT_EQ(1, gcodec.channels);
1306 EXPECT_EQ(30000, gcodec.rate);
1307 EXPECT_STREQ("opus", gcodec.plname);
1308}
1309
1310// Test that with bitrate=N and stereo=1,
1311// channels and bitrate are 2 and N.
1312TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001313 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001314 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001315 cricket::AudioSendParameters parameters;
1316 parameters.codecs.push_back(kOpusCodec);
1317 parameters.codecs[0].bitrate = 30000;
1318 parameters.codecs[0].params["stereo"] = "1";
1319 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 webrtc::CodecInst gcodec;
1321 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1322 EXPECT_EQ(2, gcodec.channels);
1323 EXPECT_EQ(30000, gcodec.rate);
1324 EXPECT_STREQ("opus", gcodec.plname);
1325}
1326
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001327// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1328// Also test that the "maxaveragebitrate" can't be set to values outside the
1329// range of 6000 and 510000
1330TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001331 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001332 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001333 cricket::AudioSendParameters parameters;
1334 parameters.codecs.push_back(kOpusCodec);
1335 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001336 webrtc::CodecInst gcodec;
1337
1338 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001339 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1340 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001341 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001342 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001343
1344 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001345 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1346 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001347 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001348 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001349
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001350 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1351 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001352 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1353 EXPECT_EQ(200000, gcodec.rate);
1354}
1355
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001356// Test that we can enable NACK with opus as caller.
1357TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001358 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001359 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001360 cricket::AudioSendParameters parameters;
1361 parameters.codecs.push_back(kOpusCodec);
1362 parameters.codecs[0].AddFeedbackParam(
1363 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1364 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001365 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001366 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367 EXPECT_TRUE(voe_.GetNACK(channel_num));
1368}
1369
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001370// Test that we can enable NACK with opus as callee.
1371TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001372 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001373 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 cricket::AudioSendParameters parameters;
1375 parameters.codecs.push_back(kOpusCodec);
1376 parameters.codecs[0].AddFeedbackParam(
1377 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1378 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001379 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001380 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001381 // NACK should be enabled even with no send stream.
1382 EXPECT_TRUE(voe_.GetNACK(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001383
1384 EXPECT_TRUE(channel_->AddSendStream(
1385 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001386 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001387}
1388
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001389// Test that we can enable NACK on receive streams.
1390TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001391 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001392 int channel_num1 = voe_.GetLastChannel();
1393 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1394 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001395 cricket::AudioSendParameters parameters;
1396 parameters.codecs.push_back(kOpusCodec);
1397 parameters.codecs[0].AddFeedbackParam(
1398 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1399 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001400 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1401 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001402 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001403 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1404 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1405}
1406
1407// Test that we can disable NACK.
1408TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001409 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001410 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001411 cricket::AudioSendParameters parameters;
1412 parameters.codecs.push_back(kOpusCodec);
1413 parameters.codecs[0].AddFeedbackParam(
1414 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1415 cricket::kParamValueEmpty));
1416 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001417 EXPECT_TRUE(voe_.GetNACK(channel_num));
1418
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001419 parameters.codecs.clear();
1420 parameters.codecs.push_back(kOpusCodec);
1421 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001422 EXPECT_FALSE(voe_.GetNACK(channel_num));
1423}
1424
1425// Test that we can disable NACK on receive streams.
1426TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001427 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001428 int channel_num1 = voe_.GetLastChannel();
1429 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1430 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001431 cricket::AudioSendParameters parameters;
1432 parameters.codecs.push_back(kOpusCodec);
1433 parameters.codecs[0].AddFeedbackParam(
1434 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1435 cricket::kParamValueEmpty));
1436 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001437 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1438 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1439
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001440 parameters.codecs.clear();
1441 parameters.codecs.push_back(kOpusCodec);
1442 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1444 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1445}
1446
1447// Test that NACK is enabled on a new receive stream.
1448TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001449 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001451 cricket::AudioSendParameters parameters;
1452 parameters.codecs.push_back(kIsacCodec);
1453 parameters.codecs.push_back(kCn16000Codec);
1454 parameters.codecs[0].AddFeedbackParam(
1455 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1456 cricket::kParamValueEmpty));
1457 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458 EXPECT_TRUE(voe_.GetNACK(channel_num));
1459
1460 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1461 channel_num = voe_.GetLastChannel();
1462 EXPECT_TRUE(voe_.GetNACK(channel_num));
1463 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1464 channel_num = voe_.GetLastChannel();
1465 EXPECT_TRUE(voe_.GetNACK(channel_num));
1466}
1467
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001468// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001469TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001470 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001471 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001472 cricket::AudioSendParameters parameters;
1473 parameters.codecs.push_back(kOpusCodec);
1474 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001475 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1476}
1477
1478// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001479TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001480 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001481 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001482 cricket::AudioSendParameters parameters;
1483 parameters.codecs.push_back(kOpusCodec);
1484 parameters.codecs[0].bitrate = 0;
1485 parameters.codecs[0].params["useinbandfec"] = "0";
1486 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001487 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1488 webrtc::CodecInst gcodec;
1489 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1490 EXPECT_STREQ("opus", gcodec.plname);
1491 EXPECT_EQ(1, gcodec.channels);
1492 EXPECT_EQ(32000, gcodec.rate);
1493}
1494
1495// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001496TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001497 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001498 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001499 cricket::AudioSendParameters parameters;
1500 parameters.codecs.push_back(kOpusCodec);
1501 parameters.codecs[0].bitrate = 0;
1502 parameters.codecs[0].params["useinbandfec"] = "1";
1503 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001504 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1505 webrtc::CodecInst gcodec;
1506 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1507 EXPECT_STREQ("opus", gcodec.plname);
1508 EXPECT_EQ(1, gcodec.channels);
1509 EXPECT_EQ(32000, gcodec.rate);
1510}
1511
1512// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001513TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001514 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001515 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001516 cricket::AudioSendParameters parameters;
1517 parameters.codecs.push_back(kOpusCodec);
1518 parameters.codecs[0].bitrate = 0;
1519 parameters.codecs[0].params["stereo"] = "1";
1520 parameters.codecs[0].params["useinbandfec"] = "1";
1521 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001522 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1523 webrtc::CodecInst gcodec;
1524 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1525 EXPECT_STREQ("opus", gcodec.plname);
1526 EXPECT_EQ(2, gcodec.channels);
1527 EXPECT_EQ(64000, gcodec.rate);
1528}
1529
1530// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001531TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001532 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001533 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001534 cricket::AudioSendParameters parameters;
1535 parameters.codecs.push_back(kIsacCodec);
1536 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001537 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1538}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001539
1540// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1541TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001542 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001543 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001544 cricket::AudioSendParameters parameters;
1545 parameters.codecs.push_back(kIsacCodec);
1546 parameters.codecs[0].params["useinbandfec"] = "1";
1547 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001548 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1549}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001550
1551// Test that Opus FEC status can be changed.
1552TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001553 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001554 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001555 cricket::AudioSendParameters parameters;
1556 parameters.codecs.push_back(kOpusCodec);
1557 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001558 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 parameters.codecs[0].params["useinbandfec"] = "1";
1560 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001561 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1562}
1563
stefanba4c0e42016-02-04 04:12:24 -08001564TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001565 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001566 cricket::AudioSendParameters send_parameters;
1567 send_parameters.codecs.push_back(kOpusCodec);
1568 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1569 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1570
1571 cricket::AudioRecvParameters recv_parameters;
1572 recv_parameters.codecs.push_back(kIsacCodec);
1573 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1574 EXPECT_TRUE(
1575 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1576 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1577 EXPECT_FALSE(
1578 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1579
solenbergbc37fc82016-04-04 09:54:44 -07001580 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001581 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1582 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1583 EXPECT_TRUE(
1584 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1585}
1586
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001587// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1588TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001589 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001590 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001591 cricket::AudioSendParameters parameters;
1592 parameters.codecs.push_back(kOpusCodec);
1593 parameters.codecs[0].bitrate = 0;
1594 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1595 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001596 EXPECT_EQ(cricket::kOpusBandwidthNb,
1597 voe_.GetMaxEncodingBandwidth(channel_num));
1598 webrtc::CodecInst gcodec;
1599 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1600 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001601
1602 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001603 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1604 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001605 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1606 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001607}
1608
1609// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1610TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001611 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001612 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001613 cricket::AudioSendParameters parameters;
1614 parameters.codecs.push_back(kOpusCodec);
1615 parameters.codecs[0].bitrate = 0;
1616 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1617 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001618 EXPECT_EQ(cricket::kOpusBandwidthMb,
1619 voe_.GetMaxEncodingBandwidth(channel_num));
1620 webrtc::CodecInst gcodec;
1621 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1622 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001623
1624 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001625 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1626 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001627 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1628 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001629}
1630
1631// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1632TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001633 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001634 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001635 cricket::AudioSendParameters parameters;
1636 parameters.codecs.push_back(kOpusCodec);
1637 parameters.codecs[0].bitrate = 0;
1638 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1639 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001640 EXPECT_EQ(cricket::kOpusBandwidthWb,
1641 voe_.GetMaxEncodingBandwidth(channel_num));
1642 webrtc::CodecInst gcodec;
1643 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1644 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001645
1646 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001647 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1648 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001649 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1650 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001651}
1652
1653// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1654TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001655 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001656 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001657 cricket::AudioSendParameters parameters;
1658 parameters.codecs.push_back(kOpusCodec);
1659 parameters.codecs[0].bitrate = 0;
1660 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1661 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001662 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1663 voe_.GetMaxEncodingBandwidth(channel_num));
1664 webrtc::CodecInst gcodec;
1665 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1666 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001667
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001668 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1670 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001671 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1672 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001673}
1674
1675// Test 24000 < maxplaybackrate triggers Opus full band mode.
1676TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001677 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001678 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001679 cricket::AudioSendParameters parameters;
1680 parameters.codecs.push_back(kOpusCodec);
1681 parameters.codecs[0].bitrate = 0;
1682 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1683 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001684 EXPECT_EQ(cricket::kOpusBandwidthFb,
1685 voe_.GetMaxEncodingBandwidth(channel_num));
1686 webrtc::CodecInst gcodec;
1687 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1688 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001689
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001690 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001691 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1692 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001693 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1694 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001695}
1696
1697// Test Opus that without maxplaybackrate, default playback rate is used.
1698TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001699 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001700 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001701 cricket::AudioSendParameters parameters;
1702 parameters.codecs.push_back(kOpusCodec);
1703 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001704 EXPECT_EQ(cricket::kOpusBandwidthFb,
1705 voe_.GetMaxEncodingBandwidth(channel_num));
1706}
1707
1708// Test the with non-Opus, maxplaybackrate has no effect.
1709TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001710 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001711 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001712 cricket::AudioSendParameters parameters;
1713 parameters.codecs.push_back(kIsacCodec);
1714 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1715 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001716 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1717}
1718
1719// Test maxplaybackrate can be set on two streams.
1720TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001721 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001722 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001723 cricket::AudioSendParameters parameters;
1724 parameters.codecs.push_back(kOpusCodec);
1725 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001726 // Default bandwidth is 24000.
1727 EXPECT_EQ(cricket::kOpusBandwidthFb,
1728 voe_.GetMaxEncodingBandwidth(channel_num));
1729
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001730 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001731
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001733 EXPECT_EQ(cricket::kOpusBandwidthNb,
1734 voe_.GetMaxEncodingBandwidth(channel_num));
1735
1736 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1737 channel_num = voe_.GetLastChannel();
1738 EXPECT_EQ(cricket::kOpusBandwidthNb,
1739 voe_.GetMaxEncodingBandwidth(channel_num));
1740}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001741
Minyue Li7100dcd2015-03-27 05:05:59 +01001742// Test that with usedtx=0, Opus DTX is off.
1743TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001744 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001745 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001746 cricket::AudioSendParameters parameters;
1747 parameters.codecs.push_back(kOpusCodec);
1748 parameters.codecs[0].params["usedtx"] = "0";
1749 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001750 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1751}
1752
1753// Test that with usedtx=1, Opus DTX is on.
1754TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001755 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001756 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001757 cricket::AudioSendParameters parameters;
1758 parameters.codecs.push_back(kOpusCodec);
1759 parameters.codecs[0].params["usedtx"] = "1";
1760 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001761 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1762 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1763}
1764
1765// Test that usedtx=1 works with stereo Opus.
1766TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001767 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001768 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001769 cricket::AudioSendParameters parameters;
1770 parameters.codecs.push_back(kOpusCodec);
1771 parameters.codecs[0].params["usedtx"] = "1";
1772 parameters.codecs[0].params["stereo"] = "1";
1773 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001774 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1775 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1776}
1777
1778// Test that usedtx=1 does not work with non Opus.
1779TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001780 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001781 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001782 cricket::AudioSendParameters parameters;
1783 parameters.codecs.push_back(kIsacCodec);
1784 parameters.codecs[0].params["usedtx"] = "1";
1785 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001786 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1787}
1788
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001789// Test that we can switch back and forth between Opus and ISAC with CN.
1790TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001791 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001793 cricket::AudioSendParameters opus_parameters;
1794 opus_parameters.codecs.push_back(kOpusCodec);
1795 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796 webrtc::CodecInst gcodec;
1797 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001798 EXPECT_EQ(111, gcodec.pltype);
1799 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001801 cricket::AudioSendParameters isac_parameters;
1802 isac_parameters.codecs.push_back(kIsacCodec);
1803 isac_parameters.codecs.push_back(kCn16000Codec);
1804 isac_parameters.codecs.push_back(kOpusCodec);
1805 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001806 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1807 EXPECT_EQ(103, gcodec.pltype);
1808 EXPECT_STREQ("ISAC", gcodec.plname);
1809
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001810 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001812 EXPECT_EQ(111, gcodec.pltype);
1813 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001814}
1815
1816// Test that we handle various ways of specifying bitrate.
1817TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001818 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001820 cricket::AudioSendParameters parameters;
1821 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1822 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001823 webrtc::CodecInst gcodec;
1824 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1825 EXPECT_EQ(103, gcodec.pltype);
1826 EXPECT_STREQ("ISAC", gcodec.plname);
1827 EXPECT_EQ(32000, gcodec.rate);
1828
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001829 parameters.codecs[0].bitrate = 0; // bitrate == default
1830 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001831 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1832 EXPECT_EQ(103, gcodec.pltype);
1833 EXPECT_STREQ("ISAC", gcodec.plname);
1834 EXPECT_EQ(-1, gcodec.rate);
1835
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001836 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1837 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1839 EXPECT_EQ(103, gcodec.pltype);
1840 EXPECT_STREQ("ISAC", gcodec.plname);
1841 EXPECT_EQ(28000, gcodec.rate);
1842
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1844 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1846 EXPECT_EQ(0, gcodec.pltype);
1847 EXPECT_STREQ("PCMU", gcodec.plname);
1848 EXPECT_EQ(64000, gcodec.rate);
1849
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001850 parameters.codecs[0].bitrate = 0; // bitrate == default
1851 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001852 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1853 EXPECT_EQ(0, gcodec.pltype);
1854 EXPECT_STREQ("PCMU", gcodec.plname);
1855 EXPECT_EQ(64000, gcodec.rate);
1856
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001857 parameters.codecs[0] = kOpusCodec;
1858 parameters.codecs[0].bitrate = 0; // bitrate == default
1859 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1861 EXPECT_EQ(111, gcodec.pltype);
1862 EXPECT_STREQ("opus", gcodec.plname);
1863 EXPECT_EQ(32000, gcodec.rate);
1864}
1865
Brave Yao5225dd82015-03-26 07:39:19 +08001866// Test that we could set packet size specified in kCodecParamPTime.
1867TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001868 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001869 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001870 cricket::AudioSendParameters parameters;
1871 parameters.codecs.push_back(kOpusCodec);
1872 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1873 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001874 webrtc::CodecInst gcodec;
1875 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1876 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1877
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001878 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1879 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001880 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1881 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1882
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001883 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1884 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001885 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1886 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1887
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001888 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1889 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1890 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001891 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1892 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1893
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001894 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1895 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1896 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001897 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1898 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1899}
1900
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001901// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001902TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001903 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001904 cricket::AudioSendParameters parameters;
1905 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001906}
1907
1908// Test that we can set send codecs even with telephone-event codec as the first
1909// one on the list.
1910TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001911 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001913 cricket::AudioSendParameters parameters;
1914 parameters.codecs.push_back(kTelephoneEventCodec);
1915 parameters.codecs.push_back(kIsacCodec);
1916 parameters.codecs.push_back(kPcmuCodec);
1917 parameters.codecs[0].id = 98; // DTMF
1918 parameters.codecs[1].id = 96;
1919 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001920 webrtc::CodecInst gcodec;
1921 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001922 EXPECT_EQ(96, gcodec.pltype);
1923 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001924 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001925}
1926
solenberg31642aa2016-03-14 08:00:37 -07001927// Test that payload type range is limited for telephone-event codec.
1928TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001929 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001930 cricket::AudioSendParameters parameters;
1931 parameters.codecs.push_back(kTelephoneEventCodec);
1932 parameters.codecs.push_back(kIsacCodec);
1933 parameters.codecs[0].id = 0; // DTMF
1934 parameters.codecs[1].id = 96;
1935 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1936 EXPECT_TRUE(channel_->CanInsertDtmf());
1937 parameters.codecs[0].id = 128; // DTMF
1938 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1939 EXPECT_FALSE(channel_->CanInsertDtmf());
1940 parameters.codecs[0].id = 127;
1941 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1942 EXPECT_TRUE(channel_->CanInsertDtmf());
1943 parameters.codecs[0].id = -1; // DTMF
1944 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1945 EXPECT_FALSE(channel_->CanInsertDtmf());
1946}
1947
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001948// Test that we can set send codecs even with CN codec as the first
1949// one on the list.
1950TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001951 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001952 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001953 cricket::AudioSendParameters parameters;
1954 parameters.codecs.push_back(kCn16000Codec);
1955 parameters.codecs.push_back(kIsacCodec);
1956 parameters.codecs.push_back(kPcmuCodec);
1957 parameters.codecs[0].id = 98; // wideband CN
1958 parameters.codecs[1].id = 96;
1959 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001960 webrtc::CodecInst gcodec;
1961 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1962 EXPECT_EQ(96, gcodec.pltype);
1963 EXPECT_STREQ("ISAC", gcodec.plname);
1964 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965}
1966
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001967// Test that we set VAD and DTMF types correctly as caller.
1968TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001969 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001970 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001971 cricket::AudioSendParameters parameters;
1972 parameters.codecs.push_back(kIsacCodec);
1973 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001975 parameters.codecs.push_back(kCn16000Codec);
1976 parameters.codecs.push_back(kCn8000Codec);
1977 parameters.codecs.push_back(kTelephoneEventCodec);
1978 parameters.codecs.push_back(kRedCodec);
1979 parameters.codecs[0].id = 96;
1980 parameters.codecs[2].id = 97; // wideband CN
1981 parameters.codecs[4].id = 98; // DTMF
1982 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001983 webrtc::CodecInst gcodec;
1984 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1985 EXPECT_EQ(96, gcodec.pltype);
1986 EXPECT_STREQ("ISAC", gcodec.plname);
1987 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001988 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001989 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1990 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001991 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992}
1993
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001994// Test that we set VAD and DTMF types correctly as callee.
1995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001996 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001997 cricket::AudioSendParameters parameters;
1998 parameters.codecs.push_back(kIsacCodec);
1999 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002000 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002001 parameters.codecs.push_back(kCn16000Codec);
2002 parameters.codecs.push_back(kCn8000Codec);
2003 parameters.codecs.push_back(kTelephoneEventCodec);
2004 parameters.codecs.push_back(kRedCodec);
2005 parameters.codecs[0].id = 96;
2006 parameters.codecs[2].id = 97; // wideband CN
2007 parameters.codecs[4].id = 98; // DTMF
2008 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002009 EXPECT_TRUE(channel_->AddSendStream(
2010 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002011 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002012
2013 webrtc::CodecInst gcodec;
2014 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2015 EXPECT_EQ(96, gcodec.pltype);
2016 EXPECT_STREQ("ISAC", gcodec.plname);
2017 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002018 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002019 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2020 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002021 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002022}
2023
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002024// Test that we only apply VAD if we have a CN codec that matches the
2025// send codec clockrate.
2026TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002027 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002028 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002029 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002030 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002031 parameters.codecs.push_back(kIsacCodec);
2032 parameters.codecs.push_back(kCn16000Codec);
2033 parameters.codecs[1].id = 97;
2034 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035 webrtc::CodecInst gcodec;
2036 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2037 EXPECT_STREQ("ISAC", gcodec.plname);
2038 EXPECT_TRUE(voe_.GetVAD(channel_num));
2039 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2040 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002041 parameters.codecs[0] = kPcmuCodec;
2042 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002043 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2044 EXPECT_STREQ("PCMU", gcodec.plname);
2045 EXPECT_FALSE(voe_.GetVAD(channel_num));
2046 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002047 parameters.codecs[1] = kCn8000Codec;
2048 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002049 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2050 EXPECT_STREQ("PCMU", gcodec.plname);
2051 EXPECT_TRUE(voe_.GetVAD(channel_num));
2052 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002053 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002054 parameters.codecs[0] = kIsacCodec;
2055 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002056 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2057 EXPECT_STREQ("ISAC", gcodec.plname);
2058 EXPECT_FALSE(voe_.GetVAD(channel_num));
2059}
2060
2061// Test that we perform case-insensitive matching of codec names.
2062TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002063 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002065 cricket::AudioSendParameters parameters;
2066 parameters.codecs.push_back(kIsacCodec);
2067 parameters.codecs.push_back(kPcmuCodec);
2068 parameters.codecs.push_back(kCn16000Codec);
2069 parameters.codecs.push_back(kCn8000Codec);
2070 parameters.codecs.push_back(kTelephoneEventCodec);
2071 parameters.codecs.push_back(kRedCodec);
2072 parameters.codecs[0].name = "iSaC";
2073 parameters.codecs[0].id = 96;
2074 parameters.codecs[2].id = 97; // wideband CN
2075 parameters.codecs[4].id = 98; // DTMF
2076 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002077 webrtc::CodecInst gcodec;
2078 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2079 EXPECT_EQ(96, gcodec.pltype);
2080 EXPECT_STREQ("ISAC", gcodec.plname);
2081 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002082 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002083 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2084 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002085 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086}
2087
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002088// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002089TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002090 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002091 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002092 cricket::AudioSendParameters parameters;
2093 parameters.codecs.push_back(kRedCodec);
2094 parameters.codecs.push_back(kIsacCodec);
2095 parameters.codecs.push_back(kPcmuCodec);
2096 parameters.codecs[0].id = 127;
2097 parameters.codecs[0].params[""] = "96/96";
2098 parameters.codecs[1].id = 96;
2099 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002100 webrtc::CodecInst gcodec;
2101 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2102 EXPECT_EQ(96, gcodec.pltype);
2103 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002104 EXPECT_TRUE(voe_.GetRED(channel_num));
2105 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106}
2107
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002108// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002109TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002110 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002111 cricket::AudioSendParameters parameters;
2112 parameters.codecs.push_back(kRedCodec);
2113 parameters.codecs.push_back(kIsacCodec);
2114 parameters.codecs.push_back(kPcmuCodec);
2115 parameters.codecs[0].id = 127;
2116 parameters.codecs[0].params[""] = "96/96";
2117 parameters.codecs[1].id = 96;
2118 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002119 EXPECT_TRUE(channel_->AddSendStream(
2120 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002121 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002122 webrtc::CodecInst gcodec;
2123 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2124 EXPECT_EQ(96, gcodec.pltype);
2125 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002126 EXPECT_TRUE(voe_.GetRED(channel_num));
2127 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002128}
2129
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002130// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002131TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002132 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002134 cricket::AudioSendParameters parameters;
2135 parameters.codecs.push_back(kRedCodec);
2136 parameters.codecs.push_back(kIsacCodec);
2137 parameters.codecs.push_back(kPcmuCodec);
2138 parameters.codecs[0].id = 127;
2139 parameters.codecs[1].id = 96;
2140 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141 webrtc::CodecInst gcodec;
2142 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2143 EXPECT_EQ(96, gcodec.pltype);
2144 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002145 EXPECT_TRUE(voe_.GetRED(channel_num));
2146 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147}
2148
2149// Test that we ignore RED if the parameters aren't named the way we expect.
2150TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002151 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002153 cricket::AudioSendParameters parameters;
2154 parameters.codecs.push_back(kRedCodec);
2155 parameters.codecs.push_back(kIsacCodec);
2156 parameters.codecs.push_back(kPcmuCodec);
2157 parameters.codecs[0].id = 127;
2158 parameters.codecs[0].params["ABC"] = "96/96";
2159 parameters.codecs[1].id = 96;
2160 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002161 webrtc::CodecInst gcodec;
2162 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2163 EXPECT_EQ(96, gcodec.pltype);
2164 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002165 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166}
2167
2168// Test that we ignore RED if it uses different primary/secondary encoding.
2169TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002170 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002172 cricket::AudioSendParameters parameters;
2173 parameters.codecs.push_back(kRedCodec);
2174 parameters.codecs.push_back(kIsacCodec);
2175 parameters.codecs.push_back(kPcmuCodec);
2176 parameters.codecs[0].id = 127;
2177 parameters.codecs[0].params[""] = "96/0";
2178 parameters.codecs[1].id = 96;
2179 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180 webrtc::CodecInst gcodec;
2181 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2182 EXPECT_EQ(96, gcodec.pltype);
2183 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002184 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185}
2186
2187// Test that we ignore RED if it uses more than 2 encodings.
2188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002189 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002190 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002191 cricket::AudioSendParameters parameters;
2192 parameters.codecs.push_back(kRedCodec);
2193 parameters.codecs.push_back(kIsacCodec);
2194 parameters.codecs.push_back(kPcmuCodec);
2195 parameters.codecs[0].id = 127;
2196 parameters.codecs[0].params[""] = "96/96/96";
2197 parameters.codecs[1].id = 96;
2198 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002199 webrtc::CodecInst gcodec;
2200 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2201 EXPECT_EQ(96, gcodec.pltype);
2202 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002203 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002204}
2205
2206// Test that we ignore RED if it has bogus codec ids.
2207TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002208 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002210 cricket::AudioSendParameters parameters;
2211 parameters.codecs.push_back(kRedCodec);
2212 parameters.codecs.push_back(kIsacCodec);
2213 parameters.codecs.push_back(kPcmuCodec);
2214 parameters.codecs[0].id = 127;
2215 parameters.codecs[0].params[""] = "ABC/ABC";
2216 parameters.codecs[1].id = 96;
2217 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218 webrtc::CodecInst gcodec;
2219 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2220 EXPECT_EQ(96, gcodec.pltype);
2221 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002222 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002223}
2224
2225// Test that we ignore RED if it refers to a codec that is not present.
2226TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002227 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002228 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002229 cricket::AudioSendParameters parameters;
2230 parameters.codecs.push_back(kRedCodec);
2231 parameters.codecs.push_back(kIsacCodec);
2232 parameters.codecs.push_back(kPcmuCodec);
2233 parameters.codecs[0].id = 127;
2234 parameters.codecs[0].params[""] = "97/97";
2235 parameters.codecs[1].id = 96;
2236 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237 webrtc::CodecInst gcodec;
2238 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2239 EXPECT_EQ(96, gcodec.pltype);
2240 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002241 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242}
2243
stefanba4c0e42016-02-04 04:12:24 -08002244class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2245 public:
2246 WebRtcVoiceEngineWithSendSideBweTest()
2247 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2248};
2249
2250TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2251 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002252 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002253 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002254 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2255 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2256 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002257 extension.id);
2258 return;
2259 }
2260 }
2261 FAIL() << "Transport sequence number extension not in header-extension list.";
2262}
2263
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002264// Test support for audio level header extension.
2265TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002266 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002267}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002268TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002269 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002270}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002271
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002272// Test support for absolute send time header extension.
2273TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002274 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002275}
2276TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002277 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278}
2279
solenberg1ac56142015-10-13 03:58:19 -07002280// Test that we can create a channel and start sending on it.
2281TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002282 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002283 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002284 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002285 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002286 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002287 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2288}
2289
2290// Test that a channel will send if and only if it has a source and is enabled
2291// for sending.
2292TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002293 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002294 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2295 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002296 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002297 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2298 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2299 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2300 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2301 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002302}
2303
solenberg6d6e7c52016-04-13 09:07:30 -07002304// Test that SetSendParameters() does not alter a stream's send state.
2305TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2306 EXPECT_TRUE(SetupSendStream());
2307 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2308
2309 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002310 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002311 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2312
2313 // Changing RTP header extensions will recreate the AudioSendStream.
2314 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002315 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002316 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2317 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2318
2319 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002320 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002321 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2322
2323 // Changing RTP header extensions will recreate the AudioSendStream.
2324 send_parameters_.extensions.clear();
2325 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2326 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2327}
2328
solenberg1ac56142015-10-13 03:58:19 -07002329// Test that we can create a channel and start playing out on it.
2330TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002331 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002332 int channel_num = voe_.GetLastChannel();
2333 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2334 EXPECT_TRUE(channel_->SetPlayout(true));
2335 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 EXPECT_TRUE(channel_->SetPlayout(false));
2337 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2338}
2339
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002340// Test that we can add and remove send streams.
2341TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2342 SetupForMultiSendStream();
2343
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002344 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002345 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002346
solenbergc96df772015-10-21 13:01:53 -07002347 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002348 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002349 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002350 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002351 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002352 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002353 }
tfarina5237aaf2015-11-10 23:44:30 -08002354 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002355
solenbergc96df772015-10-21 13:01:53 -07002356 // Delete the send streams.
2357 for (uint32_t ssrc : kSsrcs4) {
2358 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002359 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002360 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002361 }
solenbergc96df772015-10-21 13:01:53 -07002362 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002363}
2364
2365// Test SetSendCodecs correctly configure the codecs in all send streams.
2366TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2367 SetupForMultiSendStream();
2368
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002369 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002370 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002371 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002372 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002373 }
2374
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002375 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002376 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002377 parameters.codecs.push_back(kIsacCodec);
2378 parameters.codecs.push_back(kCn16000Codec);
2379 parameters.codecs[1].id = 97;
2380 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002381
2382 // Verify ISAC and VAD are corrected configured on all send channels.
2383 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002384 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002385 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002386 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2387 EXPECT_STREQ("ISAC", gcodec.plname);
2388 EXPECT_TRUE(voe_.GetVAD(channel_num));
2389 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2390 }
2391
2392 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002393 parameters.codecs[0] = kPcmuCodec;
2394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002395 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002396 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002397 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2398 EXPECT_STREQ("PCMU", gcodec.plname);
2399 EXPECT_FALSE(voe_.GetVAD(channel_num));
2400 }
2401}
2402
2403// Test we can SetSend on all send streams correctly.
2404TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2405 SetupForMultiSendStream();
2406
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002407 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002408 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002409 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002410 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002411 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2412 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002413 }
2414
2415 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002416 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002417 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002418 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002419 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002420 }
2421
2422 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002423 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002424 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002425 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002426 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002427 }
2428}
2429
2430// Test we can set the correct statistics on all send streams.
2431TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2432 SetupForMultiSendStream();
2433
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002434 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002435 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002436 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002437 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002438 }
solenberg85a04962015-10-27 03:35:21 -07002439 SetAudioSendStreamStats();
2440
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002441 // Create a receive stream to check that none of the send streams end up in
2442 // the receive stream stats.
2443 EXPECT_TRUE(channel_->AddRecvStream(
2444 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002445 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002446 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2447 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002448
solenberg85a04962015-10-27 03:35:21 -07002449 // Check stats for the added streams.
2450 {
2451 cricket::VoiceMediaInfo info;
2452 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002453
solenberg85a04962015-10-27 03:35:21 -07002454 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002455 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002456 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002457 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002458 }
2459
2460 // We have added one receive stream. We should see empty stats.
2461 EXPECT_EQ(info.receivers.size(), 1u);
2462 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002463 }
solenberg1ac56142015-10-13 03:58:19 -07002464
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002465 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002466 {
2467 cricket::VoiceMediaInfo info;
2468 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2469 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002470 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002471 EXPECT_EQ(0u, info.receivers.size());
2472 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002473
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002474 // Deliver a new packet - a default receive stream should be created and we
2475 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002476 {
2477 cricket::VoiceMediaInfo info;
2478 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2479 SetAudioReceiveStreamStats();
2480 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002481 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002482 EXPECT_EQ(1u, info.receivers.size());
2483 VerifyVoiceReceiverInfo(info.receivers[0]);
2484 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002485}
2486
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002487// Test that we can add and remove receive streams, and do proper send/playout.
2488// We can receive on multiple streams while sending one stream.
2489TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002490 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491 int channel_num1 = voe_.GetLastChannel();
2492
solenberg1ac56142015-10-13 03:58:19 -07002493 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002494 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002496 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497
solenberg1ac56142015-10-13 03:58:19 -07002498 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002499 EXPECT_TRUE(
2500 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002502 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002503 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504
solenberg1ac56142015-10-13 03:58:19 -07002505 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002506 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2507 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2508
2509 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002510 EXPECT_TRUE(
2511 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 int channel_num3 = voe_.GetLastChannel();
2513 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2514 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2515 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516
2517 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002518 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002519 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520
2521 // Stop playout.
2522 EXPECT_TRUE(channel_->SetPlayout(false));
2523 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2524 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2525 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2526
solenberg1ac56142015-10-13 03:58:19 -07002527 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528 EXPECT_TRUE(channel_->SetPlayout(true));
2529 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2530 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2531 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2532
solenberg1ac56142015-10-13 03:58:19 -07002533 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002534 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2535 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002536 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537}
2538
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002540// and start sending on it.
2541TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002542 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002543 cricket::AudioOptions options_adjust_agc;
2544 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002545 webrtc::AgcConfig agc_config;
2546 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2547 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002548 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002549 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002550 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002551 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2553 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002554 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002555 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557}
2558
wu@webrtc.org97077a32013-10-25 21:18:33 +00002559TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002560 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002561 EXPECT_CALL(adm_,
2562 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002563 webrtc::AgcConfig agc_config;
2564 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2565 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002566 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2567 send_parameters_.options.tx_agc_digital_compression_gain =
2568 rtc::Optional<uint16_t>(9);
2569 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2570 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2571 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002572 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2573 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2574 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2575 EXPECT_TRUE(agc_config.limiterEnable);
2576
2577 // Check interaction with adjust_agc_delta. Both should be respected, for
2578 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002579 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2580 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002581 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2582 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2583}
2584
wu@webrtc.org97077a32013-10-25 21:18:33 +00002585TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002586 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002587 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2588 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002589 send_parameters_.options.recording_sample_rate =
2590 rtc::Optional<uint32_t>(48000);
2591 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2592 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002593}
2594
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002596// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002598 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002599 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600}
2601
2602TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2603 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002604 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002605 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002606 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002607 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002608 EXPECT_TRUE(channel_->AddRecvStream(
2609 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002610 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2611 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002612
solenberg85a04962015-10-27 03:35:21 -07002613 // Check stats for the added streams.
2614 {
2615 cricket::VoiceMediaInfo info;
2616 EXPECT_EQ(true, channel_->GetStats(&info));
2617
2618 // We have added one send stream. We should see the stats we've set.
2619 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002620 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002621 // We have added one receive stream. We should see empty stats.
2622 EXPECT_EQ(info.receivers.size(), 1u);
2623 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2624 }
solenberg1ac56142015-10-13 03:58:19 -07002625
solenberg566ef242015-11-06 15:34:49 -08002626 // Start sending - this affects some reported stats.
2627 {
2628 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002629 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002630 EXPECT_EQ(true, channel_->GetStats(&info));
2631 VerifyVoiceSenderInfo(info.senders[0], true);
2632 }
2633
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002634 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002635 {
2636 cricket::VoiceMediaInfo info;
2637 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2638 EXPECT_EQ(true, channel_->GetStats(&info));
2639 EXPECT_EQ(1u, info.senders.size());
2640 EXPECT_EQ(0u, info.receivers.size());
2641 }
solenberg1ac56142015-10-13 03:58:19 -07002642
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002643 // Deliver a new packet - a default receive stream should be created and we
2644 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002645 {
2646 cricket::VoiceMediaInfo info;
2647 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2648 SetAudioReceiveStreamStats();
2649 EXPECT_EQ(true, channel_->GetStats(&info));
2650 EXPECT_EQ(1u, info.senders.size());
2651 EXPECT_EQ(1u, info.receivers.size());
2652 VerifyVoiceReceiverInfo(info.receivers[0]);
2653 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002654}
2655
2656// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002657// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002659 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002660 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002661 EXPECT_TRUE(channel_->AddRecvStream(
2662 cricket::StreamParams::CreateLegacy(kSsrc2)));
2663 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002664}
2665
2666// Test that the local SSRC is the same on sending and receiving channels if the
2667// receive channel is created before the send channel.
2668TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002669 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2671 int receive_channel_num = voe_.GetLastChannel();
2672 EXPECT_TRUE(channel_->AddSendStream(
2673 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674
solenberg3a941542015-11-16 07:34:50 -08002675 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002676 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677}
2678
2679// Test that we can properly receive packets.
2680TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002681 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002682 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002683 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002684
2685 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2686 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687}
2688
2689// Test that we can properly receive packets on multiple streams.
2690TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002691 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002692 const uint32_t ssrc1 = 1;
2693 const uint32_t ssrc2 = 2;
2694 const uint32_t ssrc3 = 3;
2695 EXPECT_TRUE(channel_->AddRecvStream(
2696 cricket::StreamParams::CreateLegacy(ssrc1)));
2697 EXPECT_TRUE(channel_->AddRecvStream(
2698 cricket::StreamParams::CreateLegacy(ssrc2)));
2699 EXPECT_TRUE(channel_->AddRecvStream(
2700 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002701 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002702 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002703 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002704 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002705 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002706 }
mflodman3d7db262016-04-29 00:57:13 -07002707
2708 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2709 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2710 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2711
2712 EXPECT_EQ(s1.received_packets(), 0);
2713 EXPECT_EQ(s2.received_packets(), 0);
2714 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002715
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002717 EXPECT_EQ(s1.received_packets(), 0);
2718 EXPECT_EQ(s2.received_packets(), 0);
2719 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002720
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002721 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002722 EXPECT_EQ(s1.received_packets(), 1);
2723 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2724 EXPECT_EQ(s2.received_packets(), 0);
2725 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002726
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002727 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002728 EXPECT_EQ(s1.received_packets(), 1);
2729 EXPECT_EQ(s2.received_packets(), 1);
2730 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2731 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002732
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002733 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002734 EXPECT_EQ(s1.received_packets(), 1);
2735 EXPECT_EQ(s2.received_packets(), 1);
2736 EXPECT_EQ(s3.received_packets(), 1);
2737 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002738
mflodman3d7db262016-04-29 00:57:13 -07002739 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2740 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2741 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742}
2743
solenberg7e63ef02015-11-20 00:19:43 -08002744// Test that receiving on an unsignalled stream works (default channel will be
2745// created).
2746TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002747 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002748 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2749
solenberg7e63ef02015-11-20 00:19:43 -08002750 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002751
2752 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2753 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2754 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002755}
2756
2757// Test that receiving on an unsignalled stream works (default channel will be
2758// created), and that packets will be forwarded to the default channel
2759// regardless of their SSRCs.
2760TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002761 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002762 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002763 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2764
mflodman3d7db262016-04-29 00:57:13 -07002765 // Note that ssrc = 0 is not supported.
2766 uint32_t ssrc = 1;
2767 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002768 rtc::SetBE32(&packet[8], ssrc);
2769 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002770
2771 // Verify we only have one default stream.
2772 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2773 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2774 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002775 }
mflodman3d7db262016-04-29 00:57:13 -07002776
2777 // Sending the same ssrc again should not create a new stream.
2778 --ssrc;
2779 DeliverPacket(packet, sizeof(packet));
2780 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2781 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2782 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002783}
2784
2785// Test that a default channel is created even after a signalled stream has been
2786// added, and that this stream will get any packets for unknown SSRCs.
2787TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002788 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002789 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002790 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2791
2792 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002793 const uint32_t signaled_ssrc = 1;
2794 rtc::SetBE32(&packet[8], signaled_ssrc);
2795 EXPECT_TRUE(channel_->AddRecvStream(
2796 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002797 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002798 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2799 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002800
2801 // Note that the first unknown SSRC cannot be 0, because we only support
2802 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002803 const uint32_t unsignaled_ssrc = 7011;
2804 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002805 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002806 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2807 packet, sizeof(packet)));
2808 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2809
2810 DeliverPacket(packet, sizeof(packet));
2811 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2812
2813 rtc::SetBE32(&packet[8], signaled_ssrc);
2814 DeliverPacket(packet, sizeof(packet));
2815 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2816 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002817}
2818
solenberg0a617e22015-10-20 15:49:38 -07002819// Test that we properly handle failures to add a receive stream.
2820TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002821 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002823 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824}
2825
solenberg0a617e22015-10-20 15:49:38 -07002826// Test that we properly handle failures to add a send stream.
2827TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002828 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002829 voe_.set_fail_create_channel(true);
2830 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2831}
2832
solenberg1ac56142015-10-13 03:58:19 -07002833// Test that AddRecvStream creates new stream.
2834TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002835 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002836 int channel_num = voe_.GetLastChannel();
2837 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002838 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002839}
2840
2841// Test that after adding a recv stream, we do not decode more codecs than
2842// those previously passed into SetRecvCodecs.
2843TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002844 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002845 cricket::AudioRecvParameters parameters;
2846 parameters.codecs.push_back(kIsacCodec);
2847 parameters.codecs.push_back(kPcmuCodec);
2848 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002849 EXPECT_TRUE(channel_->AddRecvStream(
2850 cricket::StreamParams::CreateLegacy(kSsrc1)));
2851 int channel_num2 = voe_.GetLastChannel();
2852 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002853 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002854 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 gcodec.channels = 2;
2856 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2857}
2858
2859// Test that we properly clean up any streams that were added, even if
2860// not explicitly removed.
2861TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002862 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002863 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002864 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2865 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2866 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2867 delete channel_;
2868 channel_ = NULL;
2869 EXPECT_EQ(0, voe_.GetNumChannels());
2870}
2871
wu@webrtc.org78187522013-10-07 23:32:02 +00002872TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002873 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002874 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2875}
2876
2877TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002878 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002879 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002880 // Manually delete channel to simulate a failure.
2881 int channel = voe_.GetLastChannel();
2882 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2883 // Add recv stream 2 should work.
2884 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002885 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002886 EXPECT_NE(channel, new_channel);
2887 // The last created channel is deleted too.
2888 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002889}
2890
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002891// Test the InsertDtmf on default send stream as caller.
2892TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2893 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002894}
2895
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002896// Test the InsertDtmf on default send stream as callee
2897TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2898 TestInsertDtmf(0, false);
2899}
2900
2901// Test the InsertDtmf on specified send stream as caller.
2902TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2903 TestInsertDtmf(kSsrc1, true);
2904}
2905
2906// Test the InsertDtmf on specified send stream as callee.
2907TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2908 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909}
2910
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002912 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002913 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002914 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2916 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2917 EXPECT_TRUE(channel_->SetPlayout(true));
2918 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2919 EXPECT_TRUE(channel_->SetPlayout(false));
2920 EXPECT_FALSE(channel_->SetPlayout(true));
2921}
2922
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002923TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002924 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002925 EXPECT_CALL(adm_,
2926 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2927 EXPECT_CALL(adm_,
2928 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2929 EXPECT_CALL(adm_,
2930 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002931 bool ec_enabled;
2932 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933 webrtc::AecmModes aecm_mode;
2934 bool cng_enabled;
2935 bool agc_enabled;
2936 webrtc::AgcModes agc_mode;
2937 webrtc::AgcConfig agc_config;
2938 bool ns_enabled;
2939 webrtc::NsModes ns_mode;
2940 bool highpass_filter_enabled;
2941 bool stereo_swapping_enabled;
2942 bool typing_detection_enabled;
2943 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 voe_.GetAecmMode(aecm_mode, cng_enabled);
2945 voe_.GetAgcStatus(agc_enabled, agc_mode);
2946 voe_.GetAgcConfig(agc_config);
2947 voe_.GetNsStatus(ns_enabled, ns_mode);
2948 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2949 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2950 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2951 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002952 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953 EXPECT_FALSE(cng_enabled);
2954 EXPECT_TRUE(agc_enabled);
2955 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2956 EXPECT_TRUE(ns_enabled);
2957 EXPECT_TRUE(highpass_filter_enabled);
2958 EXPECT_FALSE(stereo_swapping_enabled);
2959 EXPECT_TRUE(typing_detection_enabled);
2960 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2961 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002962 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2963 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002964
solenberg246b8172015-12-08 09:50:23 -08002965 // Nothing set in AudioOptions, so everything should be as default.
2966 send_parameters_.options = cricket::AudioOptions();
2967 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002968 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002969 voe_.GetAecmMode(aecm_mode, cng_enabled);
2970 voe_.GetAgcStatus(agc_enabled, agc_mode);
2971 voe_.GetAgcConfig(agc_config);
2972 voe_.GetNsStatus(ns_enabled, ns_mode);
2973 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2974 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2975 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2976 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002977 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002978 EXPECT_FALSE(cng_enabled);
2979 EXPECT_TRUE(agc_enabled);
2980 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2981 EXPECT_TRUE(ns_enabled);
2982 EXPECT_TRUE(highpass_filter_enabled);
2983 EXPECT_FALSE(stereo_swapping_enabled);
2984 EXPECT_TRUE(typing_detection_enabled);
2985 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2986 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002987 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2988 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002989
2990 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002991 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2992 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002993 voe_.GetEcStatus(ec_enabled, ec_mode);
2994 EXPECT_FALSE(ec_enabled);
2995
2996 // Turn echo cancellation back on, with settings, and make sure
2997 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002998 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2999 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003000 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003001 voe_.GetAecmMode(aecm_mode, cng_enabled);
3002 voe_.GetAgcStatus(agc_enabled, agc_mode);
3003 voe_.GetAgcConfig(agc_config);
3004 voe_.GetNsStatus(ns_enabled, ns_mode);
3005 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3006 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3007 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3008 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003009 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003010 EXPECT_TRUE(agc_enabled);
3011 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3012 EXPECT_TRUE(ns_enabled);
3013 EXPECT_TRUE(highpass_filter_enabled);
3014 EXPECT_FALSE(stereo_swapping_enabled);
3015 EXPECT_TRUE(typing_detection_enabled);
3016 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3017 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
3018
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003019 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
3020 // control.
solenberg246b8172015-12-08 09:50:23 -08003021 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3022 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003023 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003024 voe_.GetAecmMode(aecm_mode, cng_enabled);
3025 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003026 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003027 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3028
3029 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08003030 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
3031 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
3032 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
3033 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003034 voe_.GetEcStatus(ec_enabled, ec_mode);
3035 EXPECT_FALSE(ec_enabled);
3036 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08003037 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3038 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003039 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003040 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003041 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003042 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3043
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003044 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08003045 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
3046 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003047 voe_.GetAgcStatus(agc_enabled, agc_mode);
3048 EXPECT_FALSE(agc_enabled);
3049
3050 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08003051 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
3052 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
3053 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003054 voe_.GetAgcStatus(agc_enabled, agc_mode);
3055 EXPECT_TRUE(agc_enabled);
3056 voe_.GetAgcConfig(agc_config);
3057 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3058
3059 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08003060 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
3061 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
3062 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
3063 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
3064 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003065 voe_.GetNsStatus(ns_enabled, ns_mode);
3066 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3067 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3068 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3069 EXPECT_FALSE(ns_enabled);
3070 EXPECT_FALSE(highpass_filter_enabled);
3071 EXPECT_FALSE(typing_detection_enabled);
3072 EXPECT_TRUE(stereo_swapping_enabled);
3073
solenberg1ac56142015-10-13 03:58:19 -07003074 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08003075 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003076 voe_.GetEcStatus(ec_enabled, ec_mode);
3077 voe_.GetNsStatus(ns_enabled, ns_mode);
3078 EXPECT_TRUE(ec_enabled);
3079 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3080 EXPECT_FALSE(ns_enabled);
3081 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3082}
3083
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003084TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003085 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003086
3087 bool ec_enabled;
3088 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003089 bool agc_enabled;
3090 webrtc::AgcModes agc_mode;
3091 bool ns_enabled;
3092 webrtc::NsModes ns_mode;
3093 bool highpass_filter_enabled;
3094 bool stereo_swapping_enabled;
3095 bool typing_detection_enabled;
3096
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003097 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003098 voe_.GetAgcStatus(agc_enabled, agc_mode);
3099 voe_.GetNsStatus(ns_enabled, ns_mode);
3100 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3101 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3102 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3103 EXPECT_TRUE(ec_enabled);
3104 EXPECT_TRUE(agc_enabled);
3105 EXPECT_TRUE(ns_enabled);
3106 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003107 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003108 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003109}
3110
3111TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3112 webrtc::AgcConfig set_config = {0};
3113 set_config.targetLeveldBOv = 3;
3114 set_config.digitalCompressionGaindB = 9;
3115 set_config.limiterEnable = true;
3116 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003117
3118 webrtc::AgcConfig config = {0};
3119 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3120 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3121 EXPECT_EQ(set_config.digitalCompressionGaindB,
3122 config.digitalCompressionGaindB);
3123 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3124}
3125
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003126TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003127 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003128 EXPECT_CALL(adm_,
3129 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3130 EXPECT_CALL(adm_,
3131 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3132 EXPECT_CALL(adm_,
3133 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3134
kwiberg686a8ef2016-02-26 03:00:35 -08003135 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003136 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003137 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003138 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
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())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003141
3142 // Have to add a stream to make SetSend work.
3143 cricket::StreamParams stream1;
3144 stream1.ssrcs.push_back(1);
3145 channel1->AddSendStream(stream1);
3146 cricket::StreamParams stream2;
3147 stream2.ssrcs.push_back(2);
3148 channel2->AddSendStream(stream2);
3149
3150 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003151 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003152 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3153 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3154 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003155 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3156 EXPECT_EQ(parameters_options_all.options, channel1->options());
3157 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3158 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003159
3160 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003161 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003162 parameters_options_no_ns.options.noise_suppression =
3163 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003164 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3165 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003166 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3167 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3168 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003169 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003170
3171 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003172 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003173 parameters_options_no_agc.options.auto_gain_control =
3174 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003175 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003176 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3177 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3178 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003179 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003180
solenberg246b8172015-12-08 09:50:23 -08003181 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003182 bool ec_enabled;
3183 webrtc::EcModes ec_mode;
3184 bool agc_enabled;
3185 webrtc::AgcModes agc_mode;
3186 bool ns_enabled;
3187 webrtc::NsModes ns_mode;
3188 voe_.GetEcStatus(ec_enabled, ec_mode);
3189 voe_.GetAgcStatus(agc_enabled, agc_mode);
3190 voe_.GetNsStatus(ns_enabled, ns_mode);
3191 EXPECT_TRUE(ec_enabled);
3192 EXPECT_TRUE(agc_enabled);
3193 EXPECT_TRUE(ns_enabled);
3194
solenbergd53a3f92016-04-14 13:56:37 -07003195 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003196 voe_.GetEcStatus(ec_enabled, ec_mode);
3197 voe_.GetAgcStatus(agc_enabled, agc_mode);
3198 voe_.GetNsStatus(ns_enabled, ns_mode);
3199 EXPECT_TRUE(ec_enabled);
3200 EXPECT_TRUE(agc_enabled);
3201 EXPECT_FALSE(ns_enabled);
3202
solenbergd53a3f92016-04-14 13:56:37 -07003203 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003204 voe_.GetEcStatus(ec_enabled, ec_mode);
3205 voe_.GetAgcStatus(agc_enabled, agc_mode);
3206 voe_.GetNsStatus(ns_enabled, ns_mode);
3207 EXPECT_TRUE(ec_enabled);
3208 EXPECT_FALSE(agc_enabled);
3209 EXPECT_TRUE(ns_enabled);
3210
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003211 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003212 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003213 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3214 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003215 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003216 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003217 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003218 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003219 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003220 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003221 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3222 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3223 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003224 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003225 voe_.GetEcStatus(ec_enabled, ec_mode);
3226 voe_.GetAgcStatus(agc_enabled, agc_mode);
3227 voe_.GetNsStatus(ns_enabled, ns_mode);
3228 EXPECT_TRUE(ec_enabled);
3229 EXPECT_FALSE(agc_enabled);
3230 EXPECT_FALSE(ns_enabled);
3231}
3232
wu@webrtc.orgde305012013-10-31 15:40:38 +00003233// This test verifies DSCP settings are properly applied on voice media channel.
3234TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003235 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003236 cricket::FakeNetworkInterface network_interface;
3237 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003238 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003239
solenbergbc37fc82016-04-04 09:54:44 -07003240 channel.reset(
3241 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003242 channel->SetInterface(&network_interface);
3243 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3244 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3245
3246 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003247 channel.reset(
3248 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003249 channel->SetInterface(&network_interface);
3250 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3251
3252 // Verify that setting the option to false resets the
3253 // DiffServCodePoint.
3254 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003255 channel.reset(
3256 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003257 channel->SetInterface(&network_interface);
3258 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3259 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3260
3261 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003262}
3263
solenberg1ac56142015-10-13 03:58:19 -07003264TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003265 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003266 cricket::WebRtcVoiceMediaChannel* media_channel =
3267 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003268 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3269 EXPECT_TRUE(channel_->AddRecvStream(
3270 cricket::StreamParams::CreateLegacy(kSsrc1)));
3271 int channel_id = voe_.GetLastChannel();
3272 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3273 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3274 EXPECT_TRUE(channel_->AddRecvStream(
3275 cricket::StreamParams::CreateLegacy(kSsrc2)));
3276 int channel_id2 = voe_.GetLastChannel();
3277 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003278}
3279
solenberg1ac56142015-10-13 03:58:19 -07003280TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003281 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003282 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003283 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3284 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3285 EXPECT_TRUE(channel_->AddSendStream(
3286 cricket::StreamParams::CreateLegacy(kSsrc1)));
3287 int channel_id = voe_.GetLastChannel();
3288 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3289 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3290 EXPECT_TRUE(channel_->AddSendStream(
3291 cricket::StreamParams::CreateLegacy(kSsrc2)));
3292 int channel_id2 = voe_.GetLastChannel();
3293 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003294}
3295
solenberg4bac9c52015-10-09 02:32:53 -07003296TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003297 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003298 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003299 cricket::StreamParams stream;
3300 stream.ssrcs.push_back(kSsrc2);
3301 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003302 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003303 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003304 float scale = 0;
3305 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3306 EXPECT_DOUBLE_EQ(3, scale);
3307}
3308
3309TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003310 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003311 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3312 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3313 int channel_id = voe_.GetLastChannel();
3314 float scale = 0;
3315 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3316 EXPECT_DOUBLE_EQ(2, scale);
3317 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003318 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003319 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003320}
3321
pbos8fc7fa72015-07-15 08:02:58 -07003322TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003323 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003324 const std::string kSyncLabel = "AvSyncLabel";
3325
solenbergff976312016-03-30 23:28:51 -07003326 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003327 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3328 sp.sync_label = kSyncLabel;
3329 // Creating two channels to make sure that sync label is set properly for both
3330 // the default voice channel and following ones.
3331 EXPECT_TRUE(channel_->AddRecvStream(sp));
3332 sp.ssrcs[0] += 1;
3333 EXPECT_TRUE(channel_->AddRecvStream(sp));
3334
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003335 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003336 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003337 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003338 << "SyncGroup should be set based on sync_label";
3339 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003340 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003341 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003342}
3343
solenberg3a941542015-11-16 07:34:50 -08003344// TODO(solenberg): Remove, once recv streams are configured through Call.
3345// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003346TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003347 // Test that setting the header extensions results in the expected state
3348 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003349 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003350 ssrcs.push_back(223);
3351 ssrcs.push_back(224);
3352
solenbergff976312016-03-30 23:28:51 -07003353 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003354 cricket::WebRtcVoiceMediaChannel* media_channel =
3355 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003356 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003357 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003358 EXPECT_TRUE(media_channel->AddRecvStream(
3359 cricket::StreamParams::CreateLegacy(ssrc)));
3360 }
3361
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003362 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003363 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003364 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003365 EXPECT_NE(nullptr, s);
3366 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3367 }
3368
3369 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003370 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003371 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003372 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003373 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003374 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003375 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003376 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003377 EXPECT_NE(nullptr, s);
3378 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003379 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3380 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003381 for (const auto& s_ext : s_exts) {
3382 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003383 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003384 }
3385 }
3386 }
3387 }
3388
3389 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003390 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003391 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003392 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003393 EXPECT_NE(nullptr, s);
3394 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3395 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003396}
3397
3398TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3399 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003400 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003401 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003402 static const unsigned char kRtcp[] = {
3403 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3404 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3407 };
jbaucheec21bd2016-03-20 06:15:43 -07003408 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003409
solenbergff976312016-03-30 23:28:51 -07003410 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003411 cricket::WebRtcVoiceMediaChannel* media_channel =
3412 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003413 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003414 EXPECT_TRUE(media_channel->AddRecvStream(
3415 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3416
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003417 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003418 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003419 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003420 EXPECT_EQ(0, s->received_packets());
3421 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3422 EXPECT_EQ(1, s->received_packets());
3423 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3424 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003425}
Minyue2013aec2015-05-13 14:14:42 +02003426
solenberg0a617e22015-10-20 15:49:38 -07003427// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003428// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003429TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003430 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003431 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003432 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003433 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3434 int recv_ch = voe_.GetLastChannel();
3435 EXPECT_NE(recv_ch, default_channel);
3436 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3437 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3438 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003439 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3440 recv_ch = voe_.GetLastChannel();
3441 EXPECT_NE(recv_ch, default_channel);
3442 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003443}
3444
3445TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003446 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003447 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003448
3449 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3450 int recv_ch = voe_.GetLastChannel();
3451
3452 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3453 int send_ch = voe_.GetLastChannel();
3454
3455 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3456 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3457 // channel of |recv_ch|.This is not a common case, since, normally, only the
3458 // default channel can be associated. However, the default is not deletable.
3459 // So we force the |recv_ch| to associate with a non-default channel.
3460 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3461 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3462
3463 EXPECT_TRUE(channel_->RemoveSendStream(2));
3464 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3465}
stefan658910c2015-09-03 05:48:32 -07003466
deadbeef884f5852016-01-15 09:20:04 -08003467TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003468 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003469 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3470 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003471
3472 // Setting the sink before a recv stream exists should do nothing.
3473 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3474 EXPECT_TRUE(
3475 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3476 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3477
3478 // Now try actually setting the sink.
3479 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3480 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3481
3482 // Now try resetting it.
3483 channel_->SetRawAudioSink(kSsrc1, nullptr);
3484 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3485}
3486
3487TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003488 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003489 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3490 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003491
3492 // Should be able to set a default sink even when no stream exists.
3493 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3494
3495 // Create default channel and ensure it's assigned the default sink.
3496 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3497 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3498
3499 // Try resetting the default sink.
3500 channel_->SetRawAudioSink(0, nullptr);
3501 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3502
3503 // Try setting the default sink while the default stream exists.
3504 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3505 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3506
3507 // If we remove and add a default stream, it should get the same sink.
3508 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3509 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3510 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3511}
3512
skvlad7a43d252016-03-22 15:32:27 -07003513// Test that, just like the video channel, the voice channel communicates the
3514// network state to the call.
3515TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003516 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003517
3518 EXPECT_EQ(webrtc::kNetworkUp,
3519 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3520 EXPECT_EQ(webrtc::kNetworkUp,
3521 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3522
3523 channel_->OnReadyToSend(false);
3524 EXPECT_EQ(webrtc::kNetworkDown,
3525 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3526 EXPECT_EQ(webrtc::kNetworkUp,
3527 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3528
3529 channel_->OnReadyToSend(true);
3530 EXPECT_EQ(webrtc::kNetworkUp,
3531 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3532 EXPECT_EQ(webrtc::kNetworkUp,
3533 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3534}
3535
stefan658910c2015-09-03 05:48:32 -07003536// Tests that the library initializes and shuts down properly.
3537TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003538 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003539 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003540 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003541 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3542 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003543 EXPECT_TRUE(channel != nullptr);
3544 delete channel;
solenbergff976312016-03-30 23:28:51 -07003545}
stefan658910c2015-09-03 05:48:32 -07003546
solenbergff976312016-03-30 23:28:51 -07003547// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003548TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3549 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3550 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3551 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003552 {
3553 cricket::WebRtcVoiceEngine engine(&adm);
3554 std::unique_ptr<webrtc::Call> call(
3555 webrtc::Call::Create(webrtc::Call::Config()));
3556 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3557 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3558 EXPECT_TRUE(channel != nullptr);
3559 delete channel;
3560 }
stefan658910c2015-09-03 05:48:32 -07003561}
3562
3563// Tests that the library is configured with the codecs we want.
3564TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003565 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003566 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003567 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003568 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003569 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003570 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003571 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003572 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003573 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003574 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003575 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003576 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003577 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003578 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003579 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003580 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003581 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003582 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003583 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003584 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003585 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003586 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003587 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003588 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003589 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003590 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003591 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003592 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003593 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003594 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003595 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003596 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003597 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003598 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003599 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003600 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003601 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003602 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003603 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003604 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003605 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003606 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003607 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003608 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003609 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003610 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003611 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003612 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003613 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003614 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003615 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003616
stefan658910c2015-09-03 05:48:32 -07003617 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003618 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003619 for (std::vector<cricket::AudioCodec>::const_iterator it =
3620 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3621 if (it->name == "CN" && it->clockrate == 16000) {
3622 EXPECT_EQ(105, it->id);
3623 } else if (it->name == "CN" && it->clockrate == 32000) {
3624 EXPECT_EQ(106, it->id);
3625 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3626 EXPECT_EQ(103, it->id);
3627 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3628 EXPECT_EQ(104, it->id);
3629 } else if (it->name == "G722" && it->clockrate == 8000) {
3630 EXPECT_EQ(9, it->id);
3631 } else if (it->name == "telephone-event") {
3632 EXPECT_EQ(126, it->id);
3633 } else if (it->name == "red") {
3634 EXPECT_EQ(127, it->id);
3635 } else if (it->name == "opus") {
3636 EXPECT_EQ(111, it->id);
3637 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3638 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003639 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3640 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3641 }
3642 }
stefan658910c2015-09-03 05:48:32 -07003643}
3644
3645// Tests that VoE supports at least 32 channels
3646TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003647 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003648 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003649 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003650
3651 cricket::VoiceMediaChannel* channels[32];
3652 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003653 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003654 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3655 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003656 if (!channel)
3657 break;
stefan658910c2015-09-03 05:48:32 -07003658 channels[num_channels++] = channel;
3659 }
3660
tfarina5237aaf2015-11-10 23:44:30 -08003661 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003662 EXPECT_EQ(expected, num_channels);
3663
3664 while (num_channels > 0) {
3665 delete channels[--num_channels];
3666 }
stefan658910c2015-09-03 05:48:32 -07003667}
3668
3669// Test that we set our preferred codecs properly.
3670TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003671 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003672 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003673 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003674 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3675 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003676 cricket::AudioRecvParameters parameters;
3677 parameters.codecs = engine.codecs();
3678 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003679}