blob: f7cd071c50a0d5f283bbf1d61d40f0adc65eb126 [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"
ossu29b1a8d2016-06-13 07:34:51 -070027#include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
28#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h"
solenbergbc37fc82016-04-04 09:54:44 -070029#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
deadbeef67cf2c12016-04-13 10:07:16 -070036const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
deadbeef67cf2c12016-04-13 10:07:16 -070041const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
42const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
43const cricket::AudioCodec kTelephoneEventCodec(106,
44 "telephone-event",
45 8000,
46 0,
47 1);
solenberg85a04962015-10-27 03:35:21 -070048const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080049const uint32_t kSsrc2 = 2;
50const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070051const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
solenberg971cab02016-06-14 10:02:41 -070053constexpr int kRtpHistoryMs = 5000;
54
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055class FakeVoEWrapper : public cricket::VoEWrapper {
56 public:
57 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
58 : cricket::VoEWrapper(engine, // processing
59 engine, // base
60 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 engine) { // volume
63 }
64};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
solenbergff976312016-03-30 23:28:51 -070067// Tests that our stub library "works".
68TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070069 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
70 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
71 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070072 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
73 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070075 cricket::FakeWebRtcVoiceEngine voe;
76 EXPECT_FALSE(voe.IsInited());
77 {
ossuf93be582016-07-13 06:31:30 -070078 cricket::WebRtcVoiceEngine engine(&adm, nullptr, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070079 EXPECT_TRUE(voe.IsInited());
80 }
81 EXPECT_FALSE(voe.IsInited());
82}
83
deadbeef884f5852016-01-15 09:20:04 -080084class FakeAudioSink : public webrtc::AudioSinkInterface {
85 public:
86 void OnData(const Data& audio) override {}
87};
88
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080089class FakeAudioSource : public cricket::AudioSource {
90 void SetSink(Sink* sink) override {}
91};
92
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093class WebRtcVoiceEngineTestFake : public testing::Test {
94 public:
stefanba4c0e42016-02-04 04:12:24 -080095 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
96
97 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070098 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
99 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
100 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700101 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
102 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
103 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
ossuf93be582016-07-13 06:31:30 -0700104 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, nullptr,
solenbergbc37fc82016-04-04 09:54:44 -0700105 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200106 send_parameters_.codecs.push_back(kPcmuCodec);
107 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 }
solenberg8189b022016-06-14 12:13:00 -0700109
solenbergff976312016-03-30 23:28:51 -0700110 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700111 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
112 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200113 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000114 }
solenberg8189b022016-06-14 12:13:00 -0700115
solenbergff976312016-03-30 23:28:51 -0700116 bool SetupRecvStream() {
117 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700118 return false;
119 }
solenberg8189b022016-06-14 12:13:00 -0700120 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700121 }
solenberg8189b022016-06-14 12:13:00 -0700122
solenbergff976312016-03-30 23:28:51 -0700123 bool SetupSendStream() {
124 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000125 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000126 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800127 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
128 return false;
129 }
130 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000131 }
solenberg8189b022016-06-14 12:13:00 -0700132
133 bool AddRecvStream(uint32_t ssrc) {
134 EXPECT_TRUE(channel_);
135 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
136 }
137
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000138 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700139 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700140 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800141 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700142 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700143 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800144 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000145 }
solenberg8189b022016-06-14 12:13:00 -0700146
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000147 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700148 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000149 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000150 }
solenberg8189b022016-06-14 12:13:00 -0700151
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200152 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154 }
155
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100156 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
157 const auto* send_stream = call_.GetAudioSendStream(ssrc);
158 EXPECT_TRUE(send_stream);
159 return *send_stream;
160 }
161
deadbeef884f5852016-01-15 09:20:04 -0800162 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
163 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
164 EXPECT_TRUE(recv_stream);
165 return *recv_stream;
166 }
167
solenberg3a941542015-11-16 07:34:50 -0800168 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800169 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800170 }
171
solenberg7add0582015-11-20 09:59:34 -0800172 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800173 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800174 }
175
solenbergd53a3f92016-04-14 13:56:37 -0700176 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
177 ASSERT_TRUE(channel);
178 if (enable) {
179 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
180 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
181 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
182 }
183 channel->SetSend(enable);
184 }
185
Peter Boström0c4e06b2015-10-07 12:23:21 +0200186 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700187 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000188 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700189 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000190 // send stream.
191 EXPECT_TRUE(channel_->AddSendStream(
192 cricket::StreamParams::CreateLegacy(kSsrc1)));
193 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000194
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200196 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700197 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800199 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200200 send_parameters_.codecs.push_back(kTelephoneEventCodec);
201 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000203
204 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700205 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800206 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000207 EXPECT_TRUE(channel_->AddSendStream(
208 cricket::StreamParams::CreateLegacy(kSsrc1)));
209 }
210
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800212 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100214 // Test send.
215 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
216 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
217 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800218 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100219 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
220 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
221 EXPECT_EQ(2, telephone_event.event_code);
222 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000223 }
224
225 // Test that send bandwidth is set correctly.
226 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000227 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
228 // |expected_result| is the expected result from SetMaxSendBandwidth().
229 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700230 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
231 int max_bitrate,
232 bool expected_result,
233 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200234 cricket::AudioSendParameters parameters;
235 parameters.codecs.push_back(codec);
236 parameters.max_bandwidth_bps = max_bitrate;
237 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
238
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000240 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000242 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000243 }
244
skvlade0d46372016-04-07 22:59:22 -0700245 // Sets the per-stream maximum bitrate limit for the specified SSRC.
246 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700247 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700248 EXPECT_EQ(1UL, parameters.encodings.size());
249
250 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700251 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700252 }
253
254 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
255 cricket::AudioSendParameters send_parameters;
256 send_parameters.codecs.push_back(codec);
257 send_parameters.max_bandwidth_bps = bitrate;
258 return channel_->SetSendParameters(send_parameters);
259 }
260
261 int GetCodecBitrate(int32_t ssrc) {
262 cricket::WebRtcVoiceMediaChannel* media_channel =
263 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
264 int channel = media_channel->GetSendChannelId(ssrc);
265 EXPECT_NE(-1, channel);
266 webrtc::CodecInst codec;
267 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
268 return codec.rate;
269 }
270
271 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
272 int global_max,
273 int stream_max,
274 bool expected_result,
275 int expected_codec_bitrate) {
276 // Clear the bitrate limit from the previous test case.
277 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
278
279 // Attempt to set the requested bitrate limits.
280 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
281 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
282
283 // Verify that reading back the parameters gives results
284 // consistent with the Set() result.
285 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700286 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700287 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
288 EXPECT_EQ(expected_result ? stream_max : -1,
289 resulting_parameters.encodings[0].max_bitrate_bps);
290
291 // Verify that the codec settings have the expected bitrate.
292 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
293 }
294
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000295 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700296 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000297
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000298 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800299 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000300
301 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700302 send_parameters_.extensions.push_back(
303 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200304 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800305 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000306
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000307 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200308 send_parameters_.extensions.clear();
309 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800310 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000311
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000312 // Ensure extension is set properly.
313 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700314 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200315 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800316 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700317 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800318 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000319
solenberg7add0582015-11-20 09:59:34 -0800320 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000321 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700322 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800323 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
324 call_.GetAudioSendStream(kSsrc2));
325 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700326 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800327 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000328
329 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200330 send_parameters_.codecs.push_back(kPcmuCodec);
331 send_parameters_.extensions.clear();
332 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800333 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
334 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000335 }
336
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000337 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700338 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000339
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000340 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800341 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000342
343 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700344 recv_parameters_.extensions.push_back(
345 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800346 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
347 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000348
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000349 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800350 recv_parameters_.extensions.clear();
351 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
352 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000353
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000354 // Ensure extension is set properly.
355 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700356 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800357 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
358 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700359 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800360 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000361
solenberg7add0582015-11-20 09:59:34 -0800362 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700363 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800364 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
365 call_.GetAudioReceiveStream(kSsrc2));
366 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700367 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800368 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000369
370 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800371 recv_parameters_.extensions.clear();
372 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
373 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
374 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000375 }
376
solenberg85a04962015-10-27 03:35:21 -0700377 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
378 webrtc::AudioSendStream::Stats stats;
379 stats.local_ssrc = 12;
380 stats.bytes_sent = 345;
381 stats.packets_sent = 678;
382 stats.packets_lost = 9012;
383 stats.fraction_lost = 34.56f;
384 stats.codec_name = "codec_name_send";
385 stats.ext_seqnum = 789;
386 stats.jitter_ms = 12;
387 stats.rtt_ms = 345;
388 stats.audio_level = 678;
389 stats.aec_quality_min = 9.01f;
390 stats.echo_delay_median_ms = 234;
391 stats.echo_delay_std_ms = 567;
392 stats.echo_return_loss = 890;
393 stats.echo_return_loss_enhancement = 1234;
394 stats.typing_noise_detected = true;
395 return stats;
396 }
397 void SetAudioSendStreamStats() {
398 for (auto* s : call_.GetAudioSendStreams()) {
399 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200400 }
solenberg85a04962015-10-27 03:35:21 -0700401 }
solenberg566ef242015-11-06 15:34:49 -0800402 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
403 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700404 const auto stats = GetAudioSendStreamStats();
405 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
406 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
407 EXPECT_EQ(info.packets_sent, stats.packets_sent);
408 EXPECT_EQ(info.packets_lost, stats.packets_lost);
409 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
410 EXPECT_EQ(info.codec_name, stats.codec_name);
411 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
412 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
413 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
414 EXPECT_EQ(info.audio_level, stats.audio_level);
415 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
416 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
417 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
418 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
419 EXPECT_EQ(info.echo_return_loss_enhancement,
420 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800421 EXPECT_EQ(info.typing_noise_detected,
422 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700423 }
424
425 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
426 webrtc::AudioReceiveStream::Stats stats;
427 stats.remote_ssrc = 123;
428 stats.bytes_rcvd = 456;
429 stats.packets_rcvd = 768;
430 stats.packets_lost = 101;
431 stats.fraction_lost = 23.45f;
432 stats.codec_name = "codec_name_recv";
433 stats.ext_seqnum = 678;
434 stats.jitter_ms = 901;
435 stats.jitter_buffer_ms = 234;
436 stats.jitter_buffer_preferred_ms = 567;
437 stats.delay_estimate_ms = 890;
438 stats.audio_level = 1234;
439 stats.expand_rate = 5.67f;
440 stats.speech_expand_rate = 8.90f;
441 stats.secondary_decoded_rate = 1.23f;
442 stats.accelerate_rate = 4.56f;
443 stats.preemptive_expand_rate = 7.89f;
444 stats.decoding_calls_to_silence_generator = 12;
445 stats.decoding_calls_to_neteq = 345;
446 stats.decoding_normal = 67890;
447 stats.decoding_plc = 1234;
448 stats.decoding_cng = 5678;
449 stats.decoding_plc_cng = 9012;
450 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200451 return stats;
452 }
453 void SetAudioReceiveStreamStats() {
454 for (auto* s : call_.GetAudioReceiveStreams()) {
455 s->SetStats(GetAudioReceiveStreamStats());
456 }
457 }
458 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700459 const auto stats = GetAudioReceiveStreamStats();
460 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
461 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
462 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
463 EXPECT_EQ(info.packets_lost, stats.packets_lost);
464 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
465 EXPECT_EQ(info.codec_name, stats.codec_name);
466 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
467 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
468 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200469 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700470 stats.jitter_buffer_preferred_ms);
471 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
472 EXPECT_EQ(info.audio_level, stats.audio_level);
473 EXPECT_EQ(info.expand_rate, stats.expand_rate);
474 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
475 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
476 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
477 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200478 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700479 stats.decoding_calls_to_silence_generator);
480 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
481 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
482 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
483 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
484 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
485 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200486 }
487
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700489 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200490 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700492 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700493 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200494 cricket::AudioSendParameters send_parameters_;
495 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800496 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800497 private:
498 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499};
500
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000501// Tests that we can create and destroy a channel.
502TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700503 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504}
505
solenberg31fec402016-05-06 02:13:12 -0700506// Test that we can add a send stream and that it has the correct defaults.
507TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
508 EXPECT_TRUE(SetupChannel());
509 EXPECT_TRUE(
510 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
511 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
512 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
513 EXPECT_EQ("", config.rtp.c_name);
514 EXPECT_EQ(0u, config.rtp.extensions.size());
515 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
516 config.send_transport);
517}
518
519// Test that we can add a receive stream and that it has the correct defaults.
520TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
521 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700522 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700523 const webrtc::AudioReceiveStream::Config& config =
524 GetRecvStreamConfig(kSsrc1);
525 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
526 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
527 EXPECT_FALSE(config.rtp.transport_cc);
528 EXPECT_EQ(0u, config.rtp.extensions.size());
529 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
530 config.rtcp_send_transport);
531 EXPECT_EQ("", config.sync_group);
532}
533
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700535// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700536// TODO(ossu): This test should move into a separate builtin audio codecs
537// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700538TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700539 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 ASSERT_FALSE(codecs.empty());
541 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
542 EXPECT_EQ(48000, codecs[0].clockrate);
543 EXPECT_EQ(2, codecs[0].channels);
544 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000545}
546
stefanba4c0e42016-02-04 04:12:24 -0800547TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700548 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800549 bool opus_found = false;
550 for (cricket::AudioCodec codec : codecs) {
551 if (codec.name == "opus") {
552 EXPECT_TRUE(HasTransportCc(codec));
553 opus_found = true;
554 }
555 }
556 EXPECT_TRUE(opus_found);
557}
558
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559// Tests that we can find codecs by name or id, and that we interpret the
560// clockrate and bitrate fields properly.
561TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
562 cricket::AudioCodec codec;
563 webrtc::CodecInst codec_inst;
564 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800565 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800567 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800569 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
570 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 // Find ISAC with a different payload id.
572 codec = kIsacCodec;
573 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800574 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000575 EXPECT_EQ(codec.id, codec_inst.pltype);
576 // Find PCMU with a 0 clockrate.
577 codec = kPcmuCodec;
578 codec.clockrate = 0;
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(8000, codec_inst.plfreq);
582 // Find PCMU with a 0 bitrate.
583 codec = kPcmuCodec;
584 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800585 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000586 EXPECT_EQ(codec.id, codec_inst.pltype);
587 EXPECT_EQ(64000, codec_inst.rate);
588 // Find ISAC with an explicit bitrate.
589 codec = kIsacCodec;
590 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800591 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592 EXPECT_EQ(codec.id, codec_inst.pltype);
593 EXPECT_EQ(32000, codec_inst.rate);
594}
595
596// Test that we set our inbound codecs properly, including changing PT.
597TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700598 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200599 cricket::AudioRecvParameters parameters;
600 parameters.codecs.push_back(kIsacCodec);
601 parameters.codecs.push_back(kPcmuCodec);
602 parameters.codecs.push_back(kTelephoneEventCodec);
603 parameters.codecs[0].id = 106; // collide with existing telephone-event
604 parameters.codecs[2].id = 126;
605 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700606 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700607 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800609 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 gcodec.plfreq = 16000;
611 gcodec.channels = 1;
612 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
613 EXPECT_EQ(106, gcodec.pltype);
614 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800615 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616 gcodec.plfreq = 8000;
617 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
618 EXPECT_EQ(126, gcodec.pltype);
619 EXPECT_STREQ("telephone-event", gcodec.plname);
620}
621
622// Test that we fail to set an unknown inbound codec.
623TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700624 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200625 cricket::AudioRecvParameters parameters;
626 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700627 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200628 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629}
630
631// Test that we fail if we have duplicate types in the inbound list.
632TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700633 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200634 cricket::AudioRecvParameters parameters;
635 parameters.codecs.push_back(kIsacCodec);
636 parameters.codecs.push_back(kCn16000Codec);
637 parameters.codecs[1].id = kIsacCodec.id;
638 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639}
640
641// Test that we can decode OPUS without stereo parameters.
642TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700643 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200644 cricket::AudioRecvParameters parameters;
645 parameters.codecs.push_back(kIsacCodec);
646 parameters.codecs.push_back(kPcmuCodec);
647 parameters.codecs.push_back(kOpusCodec);
648 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700649 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700650 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800652 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 // Even without stereo parameters, recv codecs still specify channels = 2.
654 EXPECT_EQ(2, opus.channels);
655 EXPECT_EQ(111, opus.pltype);
656 EXPECT_STREQ("opus", opus.plname);
657 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700658 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 EXPECT_EQ(111, opus.pltype);
660}
661
662// Test that we can decode OPUS with stereo = 0.
663TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700664 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200665 cricket::AudioRecvParameters parameters;
666 parameters.codecs.push_back(kIsacCodec);
667 parameters.codecs.push_back(kPcmuCodec);
668 parameters.codecs.push_back(kOpusCodec);
669 parameters.codecs[2].params["stereo"] = "0";
670 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700671 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672 int channel_num2 = voe_.GetLastChannel();
673 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800674 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 // Even when stereo is off, recv codecs still specify channels = 2.
676 EXPECT_EQ(2, opus.channels);
677 EXPECT_EQ(111, opus.pltype);
678 EXPECT_STREQ("opus", opus.plname);
679 opus.pltype = 0;
680 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
681 EXPECT_EQ(111, opus.pltype);
682}
683
684// Test that we can decode OPUS with stereo = 1.
685TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700686 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200687 cricket::AudioRecvParameters parameters;
688 parameters.codecs.push_back(kIsacCodec);
689 parameters.codecs.push_back(kPcmuCodec);
690 parameters.codecs.push_back(kOpusCodec);
691 parameters.codecs[2].params["stereo"] = "1";
692 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700693 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694 int channel_num2 = voe_.GetLastChannel();
695 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800696 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 EXPECT_EQ(2, opus.channels);
698 EXPECT_EQ(111, opus.pltype);
699 EXPECT_STREQ("opus", opus.plname);
700 opus.pltype = 0;
701 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
702 EXPECT_EQ(111, opus.pltype);
703}
704
705// Test that changes to recv codecs are applied to all streams.
706TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700707 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200708 cricket::AudioRecvParameters parameters;
709 parameters.codecs.push_back(kIsacCodec);
710 parameters.codecs.push_back(kPcmuCodec);
711 parameters.codecs.push_back(kTelephoneEventCodec);
712 parameters.codecs[0].id = 106; // collide with existing telephone-event
713 parameters.codecs[2].id = 126;
714 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700715 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716 int channel_num2 = voe_.GetLastChannel();
717 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800718 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 gcodec.plfreq = 16000;
720 gcodec.channels = 1;
721 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
722 EXPECT_EQ(106, gcodec.pltype);
723 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800724 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725 gcodec.plfreq = 8000;
726 gcodec.channels = 1;
727 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
728 EXPECT_EQ(126, gcodec.pltype);
729 EXPECT_STREQ("telephone-event", gcodec.plname);
730}
731
732TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700733 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200734 cricket::AudioRecvParameters parameters;
735 parameters.codecs.push_back(kIsacCodec);
736 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200737 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000738
739 int channel_num2 = voe_.GetLastChannel();
740 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800741 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000742 gcodec.plfreq = 16000;
743 gcodec.channels = 1;
744 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
745 EXPECT_EQ(106, gcodec.pltype);
746 EXPECT_STREQ("ISAC", gcodec.plname);
747}
748
749// Test that we can apply the same set of codecs again while playing.
750TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700751 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200752 cricket::AudioRecvParameters parameters;
753 parameters.codecs.push_back(kIsacCodec);
754 parameters.codecs.push_back(kCn16000Codec);
755 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700756 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758
759 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200760 parameters.codecs[0].id = 127;
761 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700762 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763}
764
765// Test that we can add a codec while playing.
766TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700767 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200768 cricket::AudioRecvParameters parameters;
769 parameters.codecs.push_back(kIsacCodec);
770 parameters.codecs.push_back(kCn16000Codec);
771 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700772 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200774 parameters.codecs.push_back(kOpusCodec);
775 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700776 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800778 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
780}
781
782TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700783 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000785 // Test that when autobw is enabled, bitrate is kept as the default
786 // value. autobw is enabled for the following tests because the target
787 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788
789 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700790 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
792 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700793 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700796 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797}
798
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000799TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700800 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000802 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803
804 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700805 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
806 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
807 // Rates above the max (56000) should be capped.
808 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700811 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
812 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
813 // Rates above the max (510000) should be capped.
814 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815}
816
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000817TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700818 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000819
820 // Test that we can only set a maximum bitrate for a fixed-rate codec
821 // if it's bigger than the fixed rate.
822
823 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700824 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
825 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
826 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
827 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
828 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
829 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
830 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000831}
832
833TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700834 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835 const int kDesiredBitrate = 128000;
836 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700837 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200838 parameters.max_bandwidth_bps = kDesiredBitrate;
839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000840
841 EXPECT_TRUE(channel_->AddSendStream(
842 cricket::StreamParams::CreateLegacy(kSsrc1)));
843
844 int channel_num = voe_.GetLastChannel();
845 webrtc::CodecInst codec;
846 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200847 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000848}
849
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000850// Test that bitrate cannot be set for CBR codecs.
851// Bitrate is ignored if it is higher than the fixed bitrate.
852// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000853TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700854 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855
856 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
858 int channel_num = voe_.GetLastChannel();
859 webrtc::CodecInst codec;
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 = 128000;
864 EXPECT_TRUE(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);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200867
868 send_parameters_.max_bandwidth_bps = 128;
869 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
871 EXPECT_EQ(64000, codec.rate);
872}
873
skvlade0d46372016-04-07 22:59:22 -0700874// Test that the per-stream bitrate limit and the global
875// bitrate limit both apply.
876TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
877 EXPECT_TRUE(SetupSendStream());
878
879 // opus, default bitrate == 64000.
880 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
881 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
882 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
883 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
884
885 // CBR codecs allow both maximums to exceed the bitrate.
886 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
887 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
888 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
889 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
890
891 // CBR codecs don't allow per stream maximums to be too low.
892 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
893 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
894}
895
896// Test that an attempt to set RtpParameters for a stream that does not exist
897// fails.
898TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
899 EXPECT_TRUE(SetupChannel());
900 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700901 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700902 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
903
904 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700905 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700906}
907
908TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700909 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700910 // This test verifies that setting RtpParameters succeeds only if
911 // the structure contains exactly one encoding.
912 // TODO(skvlad): Update this test when we start supporting setting parameters
913 // for each encoding individually.
914
915 EXPECT_TRUE(SetupSendStream());
916 // Setting RtpParameters with no encoding is expected to fail.
917 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700918 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700919 // Setting RtpParameters with exactly one encoding should succeed.
920 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700921 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700922 // Two or more encodings should result in failure.
923 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700924 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700925}
926
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700927// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700928// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700929TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
930 EXPECT_TRUE(SetupSendStream());
931 SetSend(channel_, true);
932 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
933 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700934 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700935 ASSERT_EQ(1u, parameters.encodings.size());
936 ASSERT_TRUE(parameters.encodings[0].active);
937 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700938 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700939 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
940
941 // Now change it back to active and verify we resume sending.
942 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700943 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700944 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
945}
946
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700947// Test that SetRtpSendParameters configures the correct encoding channel for
948// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700949TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
950 SetupForMultiSendStream();
951 // Create send streams.
952 for (uint32_t ssrc : kSsrcs4) {
953 EXPECT_TRUE(
954 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
955 }
956 // Configure one stream to be limited by the stream config, another to be
957 // limited by the global max, and the third one with no per-stream limit
958 // (still subject to the global limit).
959 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
960 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
961 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
962 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
963
964 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
965 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
966 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
967
968 // Remove the global cap; the streams should switch to their respective
969 // maximums (or remain unchanged if there was no other limit on them.)
970 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
971 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
972 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
973 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
974}
975
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700976// Test that GetRtpSendParameters returns the currently configured codecs.
977TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700978 EXPECT_TRUE(SetupSendStream());
979 cricket::AudioSendParameters parameters;
980 parameters.codecs.push_back(kIsacCodec);
981 parameters.codecs.push_back(kPcmuCodec);
982 EXPECT_TRUE(channel_->SetSendParameters(parameters));
983
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700984 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700985 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700986 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
987 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700988}
989
990// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700991TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700992 EXPECT_TRUE(SetupSendStream());
993 cricket::AudioSendParameters parameters;
994 parameters.codecs.push_back(kIsacCodec);
995 parameters.codecs.push_back(kPcmuCodec);
996 EXPECT_TRUE(channel_->SetSendParameters(parameters));
997
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700998 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700999
1000 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001001 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001002
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001003 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1004 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1005 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1006}
1007
1008// Test that GetRtpReceiveParameters returns the currently configured codecs.
1009TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1010 EXPECT_TRUE(SetupRecvStream());
1011 cricket::AudioRecvParameters parameters;
1012 parameters.codecs.push_back(kIsacCodec);
1013 parameters.codecs.push_back(kPcmuCodec);
1014 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1015
1016 webrtc::RtpParameters rtp_parameters =
1017 channel_->GetRtpReceiveParameters(kSsrc1);
1018 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1019 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1020 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1021}
1022
1023// Test that if we set/get parameters multiple times, we get the same results.
1024TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1025 EXPECT_TRUE(SetupRecvStream());
1026 cricket::AudioRecvParameters parameters;
1027 parameters.codecs.push_back(kIsacCodec);
1028 parameters.codecs.push_back(kPcmuCodec);
1029 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1030
1031 webrtc::RtpParameters initial_params =
1032 channel_->GetRtpReceiveParameters(kSsrc1);
1033
1034 // We should be able to set the params we just got.
1035 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1036
1037 // ... And this shouldn't change the params returned by
1038 // GetRtpReceiveParameters.
1039 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1040 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001041}
1042
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043// Test that we apply codecs properly.
1044TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001045 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001046 cricket::AudioSendParameters parameters;
1047 parameters.codecs.push_back(kIsacCodec);
1048 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001049 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001050 parameters.codecs[0].id = 96;
1051 parameters.codecs[0].bitrate = 48000;
1052 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001053 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001054 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001055 webrtc::CodecInst gcodec;
1056 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1057 EXPECT_EQ(96, gcodec.pltype);
1058 EXPECT_EQ(48000, gcodec.rate);
1059 EXPECT_STREQ("ISAC", gcodec.plname);
1060 EXPECT_FALSE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001061 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1062 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001063 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001064}
1065
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001066// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1067// to apply.
1068TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001069 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 cricket::AudioSendParameters parameters;
1071 parameters.codecs.push_back(kIsacCodec);
1072 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001073 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001074 parameters.codecs[0].id = 96;
1075 parameters.codecs[0].bitrate = 48000;
1076 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001077 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1078 // Calling SetSendCodec again with same codec which is already set.
1079 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001081 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1082}
1083
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001084// Verify that G722 is set with 16000 samples per second to WebRTC.
1085TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001086 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001087 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001088 cricket::AudioSendParameters parameters;
1089 parameters.codecs.push_back(kG722CodecSdp);
1090 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001091 webrtc::CodecInst gcodec;
1092 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1093 EXPECT_STREQ("G722", gcodec.plname);
1094 EXPECT_EQ(1, gcodec.channels);
1095 EXPECT_EQ(16000, gcodec.plfreq);
1096}
1097
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001098// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001100 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001101 cricket::AudioSendParameters parameters;
1102 parameters.codecs.push_back(kOpusCodec);
1103 parameters.codecs[0].bitrate = 0;
1104 parameters.codecs[0].clockrate = 50000;
1105 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106}
1107
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001108// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001110 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001111 cricket::AudioSendParameters parameters;
1112 parameters.codecs.push_back(kOpusCodec);
1113 parameters.codecs[0].bitrate = 0;
1114 parameters.codecs[0].channels = 0;
1115 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116}
1117
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001118// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001120 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001121 cricket::AudioSendParameters parameters;
1122 parameters.codecs.push_back(kOpusCodec);
1123 parameters.codecs[0].bitrate = 0;
1124 parameters.codecs[0].channels = 0;
1125 parameters.codecs[0].params["stereo"] = "1";
1126 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127}
1128
1129// Test that if channel is 1 for opus and there's no stereo, we fail.
1130TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001131 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001132 cricket::AudioSendParameters parameters;
1133 parameters.codecs.push_back(kOpusCodec);
1134 parameters.codecs[0].bitrate = 0;
1135 parameters.codecs[0].channels = 1;
1136 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137}
1138
1139// Test that if channel is 1 for opus and stereo=0, we fail.
1140TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001141 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001142 cricket::AudioSendParameters parameters;
1143 parameters.codecs.push_back(kOpusCodec);
1144 parameters.codecs[0].bitrate = 0;
1145 parameters.codecs[0].channels = 1;
1146 parameters.codecs[0].params["stereo"] = "0";
1147 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148}
1149
1150// Test that if channel is 1 for opus and stereo=1, we fail.
1151TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001152 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001153 cricket::AudioSendParameters parameters;
1154 parameters.codecs.push_back(kOpusCodec);
1155 parameters.codecs[0].bitrate = 0;
1156 parameters.codecs[0].channels = 1;
1157 parameters.codecs[0].params["stereo"] = "1";
1158 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159}
1160
1161// Test that with bitrate=0 and no stereo,
1162// channels and bitrate are 1 and 32000.
1163TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001164 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001166 cricket::AudioSendParameters parameters;
1167 parameters.codecs.push_back(kOpusCodec);
1168 parameters.codecs[0].bitrate = 0;
1169 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 webrtc::CodecInst gcodec;
1171 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1172 EXPECT_STREQ("opus", gcodec.plname);
1173 EXPECT_EQ(1, gcodec.channels);
1174 EXPECT_EQ(32000, gcodec.rate);
1175}
1176
1177// Test that with bitrate=0 and stereo=0,
1178// channels and bitrate are 1 and 32000.
1179TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001180 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001181 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001182 cricket::AudioSendParameters parameters;
1183 parameters.codecs.push_back(kOpusCodec);
1184 parameters.codecs[0].bitrate = 0;
1185 parameters.codecs[0].params["stereo"] = "0";
1186 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187 webrtc::CodecInst gcodec;
1188 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1189 EXPECT_STREQ("opus", gcodec.plname);
1190 EXPECT_EQ(1, gcodec.channels);
1191 EXPECT_EQ(32000, gcodec.rate);
1192}
1193
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001194// Test that with bitrate=invalid and stereo=0,
1195// channels and bitrate are 1 and 32000.
1196TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001197 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001198 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001199 cricket::AudioSendParameters parameters;
1200 parameters.codecs.push_back(kOpusCodec);
1201 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001202 webrtc::CodecInst gcodec;
1203
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001204 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001205 parameters.codecs[0].bitrate = 5999;
1206 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001207 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1208 EXPECT_STREQ("opus", gcodec.plname);
1209 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001210 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001211
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001212 parameters.codecs[0].bitrate = 510001;
1213 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001214 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1215 EXPECT_STREQ("opus", gcodec.plname);
1216 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001217 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001218}
1219
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220// Test that with bitrate=0 and stereo=1,
1221// channels and bitrate are 2 and 64000.
1222TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001223 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 cricket::AudioSendParameters parameters;
1226 parameters.codecs.push_back(kOpusCodec);
1227 parameters.codecs[0].bitrate = 0;
1228 parameters.codecs[0].params["stereo"] = "1";
1229 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230 webrtc::CodecInst gcodec;
1231 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1232 EXPECT_STREQ("opus", gcodec.plname);
1233 EXPECT_EQ(2, gcodec.channels);
1234 EXPECT_EQ(64000, gcodec.rate);
1235}
1236
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001237// Test that with bitrate=invalid and stereo=1,
1238// channels and bitrate are 2 and 64000.
1239TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001240 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001241 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001242 cricket::AudioSendParameters parameters;
1243 parameters.codecs.push_back(kOpusCodec);
1244 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001245 webrtc::CodecInst gcodec;
1246
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001247 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001248 parameters.codecs[0].bitrate = 5999;
1249 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001250 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1251 EXPECT_STREQ("opus", gcodec.plname);
1252 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001253 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001254
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001255 parameters.codecs[0].bitrate = 510001;
1256 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001257 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1258 EXPECT_STREQ("opus", gcodec.plname);
1259 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001260 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001261}
1262
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263// Test that with bitrate=N and stereo unset,
1264// channels and bitrate are 1 and N.
1265TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001266 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001267 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001268 cricket::AudioSendParameters parameters;
1269 parameters.codecs.push_back(kOpusCodec);
1270 parameters.codecs[0].bitrate = 96000;
1271 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272 webrtc::CodecInst gcodec;
1273 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1274 EXPECT_EQ(111, gcodec.pltype);
1275 EXPECT_EQ(96000, gcodec.rate);
1276 EXPECT_STREQ("opus", gcodec.plname);
1277 EXPECT_EQ(1, gcodec.channels);
1278 EXPECT_EQ(48000, gcodec.plfreq);
1279}
1280
1281// Test that with bitrate=N and stereo=0,
1282// channels and bitrate are 1 and N.
1283TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001284 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001285 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001286 cricket::AudioSendParameters parameters;
1287 parameters.codecs.push_back(kOpusCodec);
1288 parameters.codecs[0].bitrate = 30000;
1289 parameters.codecs[0].params["stereo"] = "0";
1290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 webrtc::CodecInst gcodec;
1292 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1293 EXPECT_EQ(1, gcodec.channels);
1294 EXPECT_EQ(30000, gcodec.rate);
1295 EXPECT_STREQ("opus", gcodec.plname);
1296}
1297
1298// Test that with bitrate=N and without any parameters,
1299// channels and bitrate are 1 and N.
1300TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001301 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001302 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001303 cricket::AudioSendParameters parameters;
1304 parameters.codecs.push_back(kOpusCodec);
1305 parameters.codecs[0].bitrate = 30000;
1306 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307 webrtc::CodecInst gcodec;
1308 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1309 EXPECT_EQ(1, gcodec.channels);
1310 EXPECT_EQ(30000, gcodec.rate);
1311 EXPECT_STREQ("opus", gcodec.plname);
1312}
1313
1314// Test that with bitrate=N and stereo=1,
1315// channels and bitrate are 2 and N.
1316TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001317 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001318 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 cricket::AudioSendParameters parameters;
1320 parameters.codecs.push_back(kOpusCodec);
1321 parameters.codecs[0].bitrate = 30000;
1322 parameters.codecs[0].params["stereo"] = "1";
1323 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324 webrtc::CodecInst gcodec;
1325 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1326 EXPECT_EQ(2, gcodec.channels);
1327 EXPECT_EQ(30000, gcodec.rate);
1328 EXPECT_STREQ("opus", gcodec.plname);
1329}
1330
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001331// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1332// Also test that the "maxaveragebitrate" can't be set to values outside the
1333// range of 6000 and 510000
1334TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001335 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001336 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001337 cricket::AudioSendParameters parameters;
1338 parameters.codecs.push_back(kOpusCodec);
1339 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001340 webrtc::CodecInst gcodec;
1341
1342 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1344 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001346 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001347
1348 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001349 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1350 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001351 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001352 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001353
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001354 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1355 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001356 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1357 EXPECT_EQ(200000, gcodec.rate);
1358}
1359
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001360// Test that we can enable NACK with opus as caller.
1361TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001362 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 cricket::AudioSendParameters parameters;
1364 parameters.codecs.push_back(kOpusCodec);
1365 parameters.codecs[0].AddFeedbackParam(
1366 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1367 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001368 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001369 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001370 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371}
1372
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001373// Test that we can enable NACK with opus as callee.
1374TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001375 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001376 cricket::AudioSendParameters parameters;
1377 parameters.codecs.push_back(kOpusCodec);
1378 parameters.codecs[0].AddFeedbackParam(
1379 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1380 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001381 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001382 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001383 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001384 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001385
1386 EXPECT_TRUE(channel_->AddSendStream(
1387 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001388 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001389}
1390
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001391// Test that we can enable NACK on receive streams.
1392TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001393 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001394 EXPECT_TRUE(AddRecvStream(kSsrc2));
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));
solenberg971cab02016-06-14 10:02:41 -07001400 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001401 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001402 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001403 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001404 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405}
1406
1407// Test that we can disable NACK.
1408TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001409 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001410 cricket::AudioSendParameters parameters;
1411 parameters.codecs.push_back(kOpusCodec);
1412 parameters.codecs[0].AddFeedbackParam(
1413 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1414 cricket::kParamValueEmpty));
1415 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001416 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001417
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001418 parameters.codecs.clear();
1419 parameters.codecs.push_back(kOpusCodec);
1420 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001421 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001422}
1423
1424// Test that we can disable NACK on receive streams.
1425TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001426 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001427 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001428 cricket::AudioSendParameters parameters;
1429 parameters.codecs.push_back(kOpusCodec);
1430 parameters.codecs[0].AddFeedbackParam(
1431 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1432 cricket::kParamValueEmpty));
1433 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001434 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001435 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001436
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001437 parameters.codecs.clear();
1438 parameters.codecs.push_back(kOpusCodec);
1439 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001440 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001441 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001442}
1443
1444// Test that NACK is enabled on a new receive stream.
1445TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001446 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001447 cricket::AudioSendParameters parameters;
1448 parameters.codecs.push_back(kIsacCodec);
1449 parameters.codecs.push_back(kCn16000Codec);
1450 parameters.codecs[0].AddFeedbackParam(
1451 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1452 cricket::kParamValueEmpty));
1453 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001454 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001455
solenberg8189b022016-06-14 12:13:00 -07001456 EXPECT_TRUE(AddRecvStream(kSsrc2));
1457 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1458 EXPECT_TRUE(AddRecvStream(kSsrc3));
1459 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460}
1461
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001462// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001463TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001464 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001465 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001466 cricket::AudioSendParameters parameters;
1467 parameters.codecs.push_back(kOpusCodec);
1468 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001469 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1470}
1471
1472// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001473TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001474 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001475 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001476 cricket::AudioSendParameters parameters;
1477 parameters.codecs.push_back(kOpusCodec);
1478 parameters.codecs[0].bitrate = 0;
1479 parameters.codecs[0].params["useinbandfec"] = "0";
1480 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001481 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1482 webrtc::CodecInst gcodec;
1483 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1484 EXPECT_STREQ("opus", gcodec.plname);
1485 EXPECT_EQ(1, gcodec.channels);
1486 EXPECT_EQ(32000, gcodec.rate);
1487}
1488
1489// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001490TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001491 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001492 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001493 cricket::AudioSendParameters parameters;
1494 parameters.codecs.push_back(kOpusCodec);
1495 parameters.codecs[0].bitrate = 0;
1496 parameters.codecs[0].params["useinbandfec"] = "1";
1497 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001498 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1499 webrtc::CodecInst gcodec;
1500 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1501 EXPECT_STREQ("opus", gcodec.plname);
1502 EXPECT_EQ(1, gcodec.channels);
1503 EXPECT_EQ(32000, gcodec.rate);
1504}
1505
1506// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001507TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001508 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001509 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001510 cricket::AudioSendParameters parameters;
1511 parameters.codecs.push_back(kOpusCodec);
1512 parameters.codecs[0].bitrate = 0;
1513 parameters.codecs[0].params["stereo"] = "1";
1514 parameters.codecs[0].params["useinbandfec"] = "1";
1515 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001516 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1517 webrtc::CodecInst gcodec;
1518 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1519 EXPECT_STREQ("opus", gcodec.plname);
1520 EXPECT_EQ(2, gcodec.channels);
1521 EXPECT_EQ(64000, gcodec.rate);
1522}
1523
1524// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001525TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001526 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001527 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001528 cricket::AudioSendParameters parameters;
1529 parameters.codecs.push_back(kIsacCodec);
1530 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001531 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1532}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001533
1534// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1535TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001536 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001537 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 cricket::AudioSendParameters parameters;
1539 parameters.codecs.push_back(kIsacCodec);
1540 parameters.codecs[0].params["useinbandfec"] = "1";
1541 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001542 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1543}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001544
1545// Test that Opus FEC status can be changed.
1546TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001547 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001548 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001549 cricket::AudioSendParameters parameters;
1550 parameters.codecs.push_back(kOpusCodec);
1551 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001552 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001553 parameters.codecs[0].params["useinbandfec"] = "1";
1554 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001555 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1556}
1557
stefanba4c0e42016-02-04 04:12:24 -08001558TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001559 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001560 cricket::AudioSendParameters send_parameters;
1561 send_parameters.codecs.push_back(kOpusCodec);
1562 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1563 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1564
1565 cricket::AudioRecvParameters recv_parameters;
1566 recv_parameters.codecs.push_back(kIsacCodec);
1567 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001568 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001569 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1570 EXPECT_FALSE(
1571 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1572
ossudedfd282016-06-14 07:12:39 -07001573 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001574 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1575 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1576 EXPECT_TRUE(
1577 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1578}
1579
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001580// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1581TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001582 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001583 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001584 cricket::AudioSendParameters parameters;
1585 parameters.codecs.push_back(kOpusCodec);
1586 parameters.codecs[0].bitrate = 0;
1587 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1588 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001589 EXPECT_EQ(cricket::kOpusBandwidthNb,
1590 voe_.GetMaxEncodingBandwidth(channel_num));
1591 webrtc::CodecInst gcodec;
1592 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1593 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001594
1595 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001596 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1597 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001598 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1599 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001600}
1601
1602// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1603TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001604 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001605 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 cricket::AudioSendParameters parameters;
1607 parameters.codecs.push_back(kOpusCodec);
1608 parameters.codecs[0].bitrate = 0;
1609 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1610 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001611 EXPECT_EQ(cricket::kOpusBandwidthMb,
1612 voe_.GetMaxEncodingBandwidth(channel_num));
1613 webrtc::CodecInst gcodec;
1614 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1615 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001616
1617 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001618 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1619 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001620 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1621 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001622}
1623
1624// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1625TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001626 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001627 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001628 cricket::AudioSendParameters parameters;
1629 parameters.codecs.push_back(kOpusCodec);
1630 parameters.codecs[0].bitrate = 0;
1631 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1632 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001633 EXPECT_EQ(cricket::kOpusBandwidthWb,
1634 voe_.GetMaxEncodingBandwidth(channel_num));
1635 webrtc::CodecInst gcodec;
1636 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1637 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001638
1639 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001640 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001642 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1643 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001644}
1645
1646// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1647TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001648 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001649 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001650 cricket::AudioSendParameters parameters;
1651 parameters.codecs.push_back(kOpusCodec);
1652 parameters.codecs[0].bitrate = 0;
1653 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1654 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001655 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1656 voe_.GetMaxEncodingBandwidth(channel_num));
1657 webrtc::CodecInst gcodec;
1658 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1659 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001660
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001661 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001662 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001664 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1665 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001666}
1667
1668// Test 24000 < maxplaybackrate triggers Opus full band mode.
1669TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001670 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001671 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001672 cricket::AudioSendParameters parameters;
1673 parameters.codecs.push_back(kOpusCodec);
1674 parameters.codecs[0].bitrate = 0;
1675 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1676 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001677 EXPECT_EQ(cricket::kOpusBandwidthFb,
1678 voe_.GetMaxEncodingBandwidth(channel_num));
1679 webrtc::CodecInst gcodec;
1680 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1681 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001682
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001683 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001684 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1685 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001686 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1687 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001688}
1689
1690// Test Opus that without maxplaybackrate, default playback rate is used.
1691TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001692 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001693 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001694 cricket::AudioSendParameters parameters;
1695 parameters.codecs.push_back(kOpusCodec);
1696 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001697 EXPECT_EQ(cricket::kOpusBandwidthFb,
1698 voe_.GetMaxEncodingBandwidth(channel_num));
1699}
1700
1701// Test the with non-Opus, maxplaybackrate has no effect.
1702TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001703 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001704 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001705 cricket::AudioSendParameters parameters;
1706 parameters.codecs.push_back(kIsacCodec);
1707 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1708 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001709 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1710}
1711
1712// Test maxplaybackrate can be set on two streams.
1713TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001714 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001715 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001716 cricket::AudioSendParameters parameters;
1717 parameters.codecs.push_back(kOpusCodec);
1718 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001719 // Default bandwidth is 24000.
1720 EXPECT_EQ(cricket::kOpusBandwidthFb,
1721 voe_.GetMaxEncodingBandwidth(channel_num));
1722
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001723 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001724
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001726 EXPECT_EQ(cricket::kOpusBandwidthNb,
1727 voe_.GetMaxEncodingBandwidth(channel_num));
1728
1729 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1730 channel_num = voe_.GetLastChannel();
1731 EXPECT_EQ(cricket::kOpusBandwidthNb,
1732 voe_.GetMaxEncodingBandwidth(channel_num));
1733}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001734
Minyue Li7100dcd2015-03-27 05:05:59 +01001735// Test that with usedtx=0, Opus DTX is off.
1736TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001737 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001738 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001739 cricket::AudioSendParameters parameters;
1740 parameters.codecs.push_back(kOpusCodec);
1741 parameters.codecs[0].params["usedtx"] = "0";
1742 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001743 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1744}
1745
1746// Test that with usedtx=1, Opus DTX is on.
1747TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001748 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001749 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001750 cricket::AudioSendParameters parameters;
1751 parameters.codecs.push_back(kOpusCodec);
1752 parameters.codecs[0].params["usedtx"] = "1";
1753 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001754 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1755 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1756}
1757
1758// Test that usedtx=1 works with stereo Opus.
1759TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001760 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001761 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001762 cricket::AudioSendParameters parameters;
1763 parameters.codecs.push_back(kOpusCodec);
1764 parameters.codecs[0].params["usedtx"] = "1";
1765 parameters.codecs[0].params["stereo"] = "1";
1766 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001767 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1768 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1769}
1770
1771// Test that usedtx=1 does not work with non Opus.
1772TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001773 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001774 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001775 cricket::AudioSendParameters parameters;
1776 parameters.codecs.push_back(kIsacCodec);
1777 parameters.codecs[0].params["usedtx"] = "1";
1778 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001779 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1780}
1781
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001782// Test that we can switch back and forth between Opus and ISAC with CN.
1783TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001784 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001786 cricket::AudioSendParameters opus_parameters;
1787 opus_parameters.codecs.push_back(kOpusCodec);
1788 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001789 webrtc::CodecInst gcodec;
1790 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001791 EXPECT_EQ(111, gcodec.pltype);
1792 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001793
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001794 cricket::AudioSendParameters isac_parameters;
1795 isac_parameters.codecs.push_back(kIsacCodec);
1796 isac_parameters.codecs.push_back(kCn16000Codec);
1797 isac_parameters.codecs.push_back(kOpusCodec);
1798 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1800 EXPECT_EQ(103, gcodec.pltype);
1801 EXPECT_STREQ("ISAC", gcodec.plname);
1802
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001803 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001805 EXPECT_EQ(111, gcodec.pltype);
1806 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807}
1808
1809// Test that we handle various ways of specifying bitrate.
1810TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001811 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001813 cricket::AudioSendParameters parameters;
1814 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1815 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816 webrtc::CodecInst gcodec;
1817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1818 EXPECT_EQ(103, gcodec.pltype);
1819 EXPECT_STREQ("ISAC", gcodec.plname);
1820 EXPECT_EQ(32000, gcodec.rate);
1821
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 parameters.codecs[0].bitrate = 0; // bitrate == default
1823 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1825 EXPECT_EQ(103, gcodec.pltype);
1826 EXPECT_STREQ("ISAC", gcodec.plname);
1827 EXPECT_EQ(-1, gcodec.rate);
1828
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001829 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
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(28000, gcodec.rate);
1835
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001836 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
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(0, gcodec.pltype);
1840 EXPECT_STREQ("PCMU", gcodec.plname);
1841 EXPECT_EQ(64000, gcodec.rate);
1842
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 parameters.codecs[0].bitrate = 0; // bitrate == default
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] = kOpusCodec;
1851 parameters.codecs[0].bitrate = 0; // bitrate == default
1852 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1854 EXPECT_EQ(111, gcodec.pltype);
1855 EXPECT_STREQ("opus", gcodec.plname);
1856 EXPECT_EQ(32000, gcodec.rate);
1857}
1858
Brave Yao5225dd82015-03-26 07:39:19 +08001859// Test that we could set packet size specified in kCodecParamPTime.
1860TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001861 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001862 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001863 cricket::AudioSendParameters parameters;
1864 parameters.codecs.push_back(kOpusCodec);
1865 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1866 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001867 webrtc::CodecInst gcodec;
1868 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1869 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1870
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001871 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1872 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001873 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1874 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1875
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001876 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1877 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001878 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1879 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1880
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001881 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1882 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1883 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001884 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1885 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1886
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001887 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1888 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1889 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001890 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1891 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1892}
1893
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001894// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001895TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001896 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001897 cricket::AudioSendParameters parameters;
1898 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001899}
1900
1901// Test that we can set send codecs even with telephone-event codec as the first
1902// one on the list.
1903TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001904 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001906 cricket::AudioSendParameters parameters;
1907 parameters.codecs.push_back(kTelephoneEventCodec);
1908 parameters.codecs.push_back(kIsacCodec);
1909 parameters.codecs.push_back(kPcmuCodec);
1910 parameters.codecs[0].id = 98; // DTMF
1911 parameters.codecs[1].id = 96;
1912 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001913 webrtc::CodecInst gcodec;
1914 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001915 EXPECT_EQ(96, gcodec.pltype);
1916 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001917 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001918}
1919
solenberg31642aa2016-03-14 08:00:37 -07001920// Test that payload type range is limited for telephone-event codec.
1921TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001922 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001923 cricket::AudioSendParameters parameters;
1924 parameters.codecs.push_back(kTelephoneEventCodec);
1925 parameters.codecs.push_back(kIsacCodec);
1926 parameters.codecs[0].id = 0; // DTMF
1927 parameters.codecs[1].id = 96;
1928 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1929 EXPECT_TRUE(channel_->CanInsertDtmf());
1930 parameters.codecs[0].id = 128; // DTMF
1931 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1932 EXPECT_FALSE(channel_->CanInsertDtmf());
1933 parameters.codecs[0].id = 127;
1934 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1935 EXPECT_TRUE(channel_->CanInsertDtmf());
1936 parameters.codecs[0].id = -1; // DTMF
1937 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1938 EXPECT_FALSE(channel_->CanInsertDtmf());
1939}
1940
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001941// Test that we can set send codecs even with CN codec as the first
1942// one on the list.
1943TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001944 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001945 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001946 cricket::AudioSendParameters parameters;
1947 parameters.codecs.push_back(kCn16000Codec);
1948 parameters.codecs.push_back(kIsacCodec);
1949 parameters.codecs.push_back(kPcmuCodec);
1950 parameters.codecs[0].id = 98; // wideband CN
1951 parameters.codecs[1].id = 96;
1952 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001953 webrtc::CodecInst gcodec;
1954 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1955 EXPECT_EQ(96, gcodec.pltype);
1956 EXPECT_STREQ("ISAC", gcodec.plname);
1957 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958}
1959
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001960// Test that we set VAD and DTMF types correctly as caller.
1961TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001962 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001964 cricket::AudioSendParameters parameters;
1965 parameters.codecs.push_back(kIsacCodec);
1966 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001968 parameters.codecs.push_back(kCn16000Codec);
1969 parameters.codecs.push_back(kCn8000Codec);
1970 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001971 parameters.codecs[0].id = 96;
1972 parameters.codecs[2].id = 97; // wideband CN
1973 parameters.codecs[4].id = 98; // DTMF
1974 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001975 webrtc::CodecInst gcodec;
1976 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1977 EXPECT_EQ(96, gcodec.pltype);
1978 EXPECT_STREQ("ISAC", gcodec.plname);
1979 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1981 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001982 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001983}
1984
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001985// Test that we set VAD and DTMF types correctly as callee.
1986TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001987 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001988 cricket::AudioSendParameters parameters;
1989 parameters.codecs.push_back(kIsacCodec);
1990 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001991 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001992 parameters.codecs.push_back(kCn16000Codec);
1993 parameters.codecs.push_back(kCn8000Codec);
1994 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001995 parameters.codecs[0].id = 96;
1996 parameters.codecs[2].id = 97; // wideband CN
1997 parameters.codecs[4].id = 98; // DTMF
1998 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001999 EXPECT_TRUE(channel_->AddSendStream(
2000 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002001 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002002
2003 webrtc::CodecInst gcodec;
2004 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2005 EXPECT_EQ(96, gcodec.pltype);
2006 EXPECT_STREQ("ISAC", gcodec.plname);
2007 EXPECT_TRUE(voe_.GetVAD(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002008 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2009 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002010 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002011}
2012
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002013// Test that we only apply VAD if we have a CN codec that matches the
2014// send codec clockrate.
2015TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002016 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002017 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002018 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002019 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002020 parameters.codecs.push_back(kIsacCodec);
2021 parameters.codecs.push_back(kCn16000Codec);
2022 parameters.codecs[1].id = 97;
2023 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002024 webrtc::CodecInst gcodec;
2025 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2026 EXPECT_STREQ("ISAC", gcodec.plname);
2027 EXPECT_TRUE(voe_.GetVAD(channel_num));
2028 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2029 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002030 parameters.codecs[0] = kPcmuCodec;
2031 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002032 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2033 EXPECT_STREQ("PCMU", gcodec.plname);
2034 EXPECT_FALSE(voe_.GetVAD(channel_num));
2035 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002036 parameters.codecs[1] = kCn8000Codec;
2037 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002038 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2039 EXPECT_STREQ("PCMU", gcodec.plname);
2040 EXPECT_TRUE(voe_.GetVAD(channel_num));
2041 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002042 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002043 parameters.codecs[0] = kIsacCodec;
2044 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002045 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2046 EXPECT_STREQ("ISAC", gcodec.plname);
2047 EXPECT_FALSE(voe_.GetVAD(channel_num));
2048}
2049
2050// Test that we perform case-insensitive matching of codec names.
2051TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002052 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002053 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002054 cricket::AudioSendParameters parameters;
2055 parameters.codecs.push_back(kIsacCodec);
2056 parameters.codecs.push_back(kPcmuCodec);
2057 parameters.codecs.push_back(kCn16000Codec);
2058 parameters.codecs.push_back(kCn8000Codec);
2059 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002060 parameters.codecs[0].name = "iSaC";
2061 parameters.codecs[0].id = 96;
2062 parameters.codecs[2].id = 97; // wideband CN
2063 parameters.codecs[4].id = 98; // DTMF
2064 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002065 webrtc::CodecInst gcodec;
2066 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2067 EXPECT_EQ(96, gcodec.pltype);
2068 EXPECT_STREQ("ISAC", gcodec.plname);
2069 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2071 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002072 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002073}
2074
stefanba4c0e42016-02-04 04:12:24 -08002075class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2076 public:
2077 WebRtcVoiceEngineWithSendSideBweTest()
2078 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2079};
2080
2081TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2082 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002083 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002084 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002085 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2086 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2087 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002088 extension.id);
2089 return;
2090 }
2091 }
2092 FAIL() << "Transport sequence number extension not in header-extension list.";
2093}
2094
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002095// Test support for audio level header extension.
2096TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002097 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002098}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002099TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002100 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002101}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002102
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002103// Test support for absolute send time header extension.
2104TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002105 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002106}
2107TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002108 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002109}
2110
solenberg1ac56142015-10-13 03:58:19 -07002111// Test that we can create a channel and start sending on it.
2112TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002113 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002114 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002115 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002116 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002117 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002118 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2119}
2120
2121// Test that a channel will send if and only if it has a source and is enabled
2122// for sending.
2123TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002124 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002125 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2126 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002127 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002128 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2129 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2130 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2131 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2132 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002133}
2134
solenberg94218532016-06-16 10:53:22 -07002135// Test that a channel is muted/unmuted.
2136TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2137 EXPECT_TRUE(SetupSendStream());
2138 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2139 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2140 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2141 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2142 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2143 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2144}
2145
solenberg6d6e7c52016-04-13 09:07:30 -07002146// Test that SetSendParameters() does not alter a stream's send state.
2147TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2148 EXPECT_TRUE(SetupSendStream());
2149 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2150
2151 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002152 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002153 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2154
2155 // Changing RTP header extensions will recreate the AudioSendStream.
2156 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002157 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002158 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2159 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2160
2161 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002162 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002163 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2164
2165 // Changing RTP header extensions will recreate the AudioSendStream.
2166 send_parameters_.extensions.clear();
2167 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2168 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2169}
2170
solenberg1ac56142015-10-13 03:58:19 -07002171// Test that we can create a channel and start playing out on it.
2172TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002173 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002174 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002175 channel_->SetPlayout(true);
2176 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2177 channel_->SetPlayout(false);
2178 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179}
2180
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002181// Test that we can add and remove send streams.
2182TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2183 SetupForMultiSendStream();
2184
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002185 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002186 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002187
solenbergc96df772015-10-21 13:01:53 -07002188 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002189 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002190 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002191 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002192 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002193 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002194 }
tfarina5237aaf2015-11-10 23:44:30 -08002195 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002196
solenbergc96df772015-10-21 13:01:53 -07002197 // Delete the send streams.
2198 for (uint32_t ssrc : kSsrcs4) {
2199 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002200 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002201 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002202 }
solenbergc96df772015-10-21 13:01:53 -07002203 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002204}
2205
2206// Test SetSendCodecs correctly configure the codecs in all send streams.
2207TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2208 SetupForMultiSendStream();
2209
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002210 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002211 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002212 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002213 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002214 }
2215
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002216 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002217 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002218 parameters.codecs.push_back(kIsacCodec);
2219 parameters.codecs.push_back(kCn16000Codec);
2220 parameters.codecs[1].id = 97;
2221 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002222
2223 // Verify ISAC and VAD are corrected configured on all send channels.
2224 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002225 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002226 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002227 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2228 EXPECT_STREQ("ISAC", gcodec.plname);
2229 EXPECT_TRUE(voe_.GetVAD(channel_num));
2230 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2231 }
2232
2233 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002234 parameters.codecs[0] = kPcmuCodec;
2235 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002236 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002237 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002238 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2239 EXPECT_STREQ("PCMU", gcodec.plname);
2240 EXPECT_FALSE(voe_.GetVAD(channel_num));
2241 }
2242}
2243
2244// Test we can SetSend on all send streams correctly.
2245TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2246 SetupForMultiSendStream();
2247
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002248 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002249 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002250 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002251 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002252 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2253 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002254 }
2255
2256 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002257 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002258 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002260 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002261 }
2262
2263 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002264 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002265 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002266 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002267 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002268 }
2269}
2270
2271// Test we can set the correct statistics on all send streams.
2272TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2273 SetupForMultiSendStream();
2274
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002275 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002276 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002277 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002278 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002279 }
solenberg85a04962015-10-27 03:35:21 -07002280
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002281 // Create a receive stream to check that none of the send streams end up in
2282 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002283 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002284
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002285 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002286 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2287 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002288 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002289
solenberg85a04962015-10-27 03:35:21 -07002290 // Check stats for the added streams.
2291 {
2292 cricket::VoiceMediaInfo info;
2293 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002294
solenberg85a04962015-10-27 03:35:21 -07002295 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002296 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002297 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002298 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002299 }
2300
2301 // We have added one receive stream. We should see empty stats.
2302 EXPECT_EQ(info.receivers.size(), 1u);
2303 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002304 }
solenberg1ac56142015-10-13 03:58:19 -07002305
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002306 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002307 {
2308 cricket::VoiceMediaInfo info;
2309 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2310 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002311 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002312 EXPECT_EQ(0u, info.receivers.size());
2313 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002314
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002315 // Deliver a new packet - a default receive stream should be created and we
2316 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002317 {
2318 cricket::VoiceMediaInfo info;
2319 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2320 SetAudioReceiveStreamStats();
2321 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002322 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002323 EXPECT_EQ(1u, info.receivers.size());
2324 VerifyVoiceReceiverInfo(info.receivers[0]);
2325 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002326}
2327
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002328// Test that we can add and remove receive streams, and do proper send/playout.
2329// We can receive on multiple streams while sending one stream.
2330TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002331 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002332
solenberg1ac56142015-10-13 03:58:19 -07002333 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002334 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002335 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336
solenberg1ac56142015-10-13 03:58:19 -07002337 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002338 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenbergd53a3f92016-04-14 13:56:37 -07002339 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002340 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341
solenberg1ac56142015-10-13 03:58:19 -07002342 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002343 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344
2345 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002346 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002347 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2348 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349
2350 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002351 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002352 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353
2354 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002355 channel_->SetPlayout(false);
2356 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2357 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358
aleloi84ef6152016-08-04 05:28:21 -07002359 // Restart playout and make sure recv streams are played out.
2360 channel_->SetPlayout(true);
2361 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2362 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363
aleloi84ef6152016-08-04 05:28:21 -07002364 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2366 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367}
2368
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002370// and start sending on it.
2371TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002372 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002373 cricket::AudioOptions options_adjust_agc;
2374 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 webrtc::AgcConfig agc_config;
2376 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2377 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002378 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002379 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002380 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002381 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002382 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2383 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002384 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002385 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002386 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387}
2388
wu@webrtc.org97077a32013-10-25 21:18:33 +00002389TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002390 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002391 EXPECT_CALL(adm_,
2392 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002393 webrtc::AgcConfig agc_config;
2394 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2395 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002396 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2397 send_parameters_.options.tx_agc_digital_compression_gain =
2398 rtc::Optional<uint16_t>(9);
2399 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2400 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2401 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002402 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2403 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2404 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2405 EXPECT_TRUE(agc_config.limiterEnable);
2406
2407 // Check interaction with adjust_agc_delta. Both should be respected, for
2408 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002409 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2410 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002411 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2412 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2413}
2414
wu@webrtc.org97077a32013-10-25 21:18:33 +00002415TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002416 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002417 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2418 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002419 send_parameters_.options.recording_sample_rate =
2420 rtc::Optional<uint32_t>(48000);
2421 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2422 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002423}
2424
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002426// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002428 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002429 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430}
2431
2432TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2433 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002434 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002435 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002436 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002437 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002438 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2439 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002440 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441
solenberg85a04962015-10-27 03:35:21 -07002442 // Check stats for the added streams.
2443 {
2444 cricket::VoiceMediaInfo info;
2445 EXPECT_EQ(true, channel_->GetStats(&info));
2446
2447 // We have added one send stream. We should see the stats we've set.
2448 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002449 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002450 // We have added one receive stream. We should see empty stats.
2451 EXPECT_EQ(info.receivers.size(), 1u);
2452 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2453 }
solenberg1ac56142015-10-13 03:58:19 -07002454
solenberg566ef242015-11-06 15:34:49 -08002455 // Start sending - this affects some reported stats.
2456 {
2457 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002458 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002459 EXPECT_EQ(true, channel_->GetStats(&info));
2460 VerifyVoiceSenderInfo(info.senders[0], true);
2461 }
2462
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002463 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002464 {
2465 cricket::VoiceMediaInfo info;
2466 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2467 EXPECT_EQ(true, channel_->GetStats(&info));
2468 EXPECT_EQ(1u, info.senders.size());
2469 EXPECT_EQ(0u, info.receivers.size());
2470 }
solenberg1ac56142015-10-13 03:58:19 -07002471
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002472 // Deliver a new packet - a default receive stream should be created and we
2473 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002474 {
2475 cricket::VoiceMediaInfo info;
2476 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2477 SetAudioReceiveStreamStats();
2478 EXPECT_EQ(true, channel_->GetStats(&info));
2479 EXPECT_EQ(1u, info.senders.size());
2480 EXPECT_EQ(1u, info.receivers.size());
2481 VerifyVoiceReceiverInfo(info.receivers[0]);
2482 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483}
2484
2485// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002486// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002487TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002488 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002489 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002490 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002491 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492}
2493
2494// Test that the local SSRC is the same on sending and receiving channels if the
2495// receive channel is created before the send channel.
2496TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002497 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002498 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002500 cricket::StreamParams::CreateLegacy(kSsrc1)));
2501 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2502 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002503}
2504
2505// Test that we can properly receive packets.
2506TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002507 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002508 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002509 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002510
2511 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2512 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002513}
2514
2515// Test that we can properly receive packets on multiple streams.
2516TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002517 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002518 const uint32_t ssrc1 = 1;
2519 const uint32_t ssrc2 = 2;
2520 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002521 EXPECT_TRUE(AddRecvStream(ssrc1));
2522 EXPECT_TRUE(AddRecvStream(ssrc2));
2523 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002525 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002526 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002527 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002528 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529 }
mflodman3d7db262016-04-29 00:57:13 -07002530
2531 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2532 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2533 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2534
2535 EXPECT_EQ(s1.received_packets(), 0);
2536 EXPECT_EQ(s2.received_packets(), 0);
2537 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002538
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002540 EXPECT_EQ(s1.received_packets(), 0);
2541 EXPECT_EQ(s2.received_packets(), 0);
2542 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002543
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002545 EXPECT_EQ(s1.received_packets(), 1);
2546 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2547 EXPECT_EQ(s2.received_packets(), 0);
2548 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002549
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002551 EXPECT_EQ(s1.received_packets(), 1);
2552 EXPECT_EQ(s2.received_packets(), 1);
2553 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2554 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002555
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002557 EXPECT_EQ(s1.received_packets(), 1);
2558 EXPECT_EQ(s2.received_packets(), 1);
2559 EXPECT_EQ(s3.received_packets(), 1);
2560 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002561
mflodman3d7db262016-04-29 00:57:13 -07002562 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2563 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2564 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002565}
2566
solenberg7e63ef02015-11-20 00:19:43 -08002567// Test that receiving on an unsignalled stream works (default channel will be
2568// created).
2569TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002570 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002571 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2572
solenberg7e63ef02015-11-20 00:19:43 -08002573 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002574
2575 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2576 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2577 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002578}
2579
2580// Test that receiving on an unsignalled stream works (default channel will be
2581// created), and that packets will be forwarded to the default channel
2582// regardless of their SSRCs.
2583TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002584 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002585 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002586 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2587
mflodman3d7db262016-04-29 00:57:13 -07002588 // Note that ssrc = 0 is not supported.
2589 uint32_t ssrc = 1;
2590 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002591 rtc::SetBE32(&packet[8], ssrc);
2592 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002593
2594 // Verify we only have one default stream.
2595 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2596 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2597 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002598 }
mflodman3d7db262016-04-29 00:57:13 -07002599
2600 // Sending the same ssrc again should not create a new stream.
2601 --ssrc;
2602 DeliverPacket(packet, sizeof(packet));
2603 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2604 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2605 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002606}
2607
2608// Test that a default channel is created even after a signalled stream has been
2609// added, and that this stream will get any packets for unknown SSRCs.
2610TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002611 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002612 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002613 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2614
2615 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002616 const uint32_t signaled_ssrc = 1;
2617 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002618 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002619 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002620 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2621 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002622
2623 // Note that the first unknown SSRC cannot be 0, because we only support
2624 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002625 const uint32_t unsignaled_ssrc = 7011;
2626 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002627 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002628 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2629 packet, sizeof(packet)));
2630 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2631
2632 DeliverPacket(packet, sizeof(packet));
2633 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2634
2635 rtc::SetBE32(&packet[8], signaled_ssrc);
2636 DeliverPacket(packet, sizeof(packet));
2637 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2638 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002639}
2640
solenberg0a617e22015-10-20 15:49:38 -07002641// Test that we properly handle failures to add a receive stream.
2642TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002643 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002645 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002646}
2647
solenberg0a617e22015-10-20 15:49:38 -07002648// Test that we properly handle failures to add a send stream.
2649TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002650 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002651 voe_.set_fail_create_channel(true);
2652 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2653}
2654
solenberg1ac56142015-10-13 03:58:19 -07002655// Test that AddRecvStream creates new stream.
2656TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002657 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002659 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002660 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661}
2662
2663// Test that after adding a recv stream, we do not decode more codecs than
2664// those previously passed into SetRecvCodecs.
2665TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002666 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002667 cricket::AudioRecvParameters parameters;
2668 parameters.codecs.push_back(kIsacCodec);
2669 parameters.codecs.push_back(kPcmuCodec);
2670 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002671 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 int channel_num2 = voe_.GetLastChannel();
2673 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002674 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002675 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 gcodec.channels = 2;
2677 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2678}
2679
2680// Test that we properly clean up any streams that were added, even if
2681// not explicitly removed.
2682TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002683 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002684 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8189b022016-06-14 12:13:00 -07002685 EXPECT_TRUE(AddRecvStream(1));
2686 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2688 delete channel_;
2689 channel_ = NULL;
2690 EXPECT_EQ(0, voe_.GetNumChannels());
2691}
2692
wu@webrtc.org78187522013-10-07 23:32:02 +00002693TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002694 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002695 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002696}
2697
2698TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002699 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002700 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002701 // Manually delete channel to simulate a failure.
2702 int channel = voe_.GetLastChannel();
2703 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2704 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002705 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002706 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002707 EXPECT_NE(channel, new_channel);
2708 // The last created channel is deleted too.
2709 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002710}
2711
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002712// Test the InsertDtmf on default send stream as caller.
2713TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2714 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002715}
2716
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002717// Test the InsertDtmf on default send stream as callee
2718TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2719 TestInsertDtmf(0, false);
2720}
2721
2722// Test the InsertDtmf on specified send stream as caller.
2723TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2724 TestInsertDtmf(kSsrc1, true);
2725}
2726
2727// Test the InsertDtmf on specified send stream as callee.
2728TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2729 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002730}
2731
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002733 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002734 EXPECT_CALL(adm_,
2735 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2736 EXPECT_CALL(adm_,
2737 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2738 EXPECT_CALL(adm_,
2739 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740 bool ec_enabled;
2741 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742 webrtc::AecmModes aecm_mode;
2743 bool cng_enabled;
2744 bool agc_enabled;
2745 webrtc::AgcModes agc_mode;
2746 webrtc::AgcConfig agc_config;
2747 bool ns_enabled;
2748 webrtc::NsModes ns_mode;
2749 bool highpass_filter_enabled;
2750 bool stereo_swapping_enabled;
2751 bool typing_detection_enabled;
2752 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002753 voe_.GetAecmMode(aecm_mode, cng_enabled);
2754 voe_.GetAgcStatus(agc_enabled, agc_mode);
2755 voe_.GetAgcConfig(agc_config);
2756 voe_.GetNsStatus(ns_enabled, ns_mode);
2757 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2758 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2759 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2760 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002761 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002762 EXPECT_FALSE(cng_enabled);
2763 EXPECT_TRUE(agc_enabled);
2764 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2765 EXPECT_TRUE(ns_enabled);
2766 EXPECT_TRUE(highpass_filter_enabled);
2767 EXPECT_FALSE(stereo_swapping_enabled);
2768 EXPECT_TRUE(typing_detection_enabled);
2769 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2770 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002771 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2772 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002773
solenberg246b8172015-12-08 09:50:23 -08002774 // Nothing set in AudioOptions, so everything should be as default.
2775 send_parameters_.options = cricket::AudioOptions();
2776 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778 voe_.GetAecmMode(aecm_mode, cng_enabled);
2779 voe_.GetAgcStatus(agc_enabled, agc_mode);
2780 voe_.GetAgcConfig(agc_config);
2781 voe_.GetNsStatus(ns_enabled, ns_mode);
2782 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2783 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2784 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2785 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002786 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002787 EXPECT_FALSE(cng_enabled);
2788 EXPECT_TRUE(agc_enabled);
2789 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2790 EXPECT_TRUE(ns_enabled);
2791 EXPECT_TRUE(highpass_filter_enabled);
2792 EXPECT_FALSE(stereo_swapping_enabled);
2793 EXPECT_TRUE(typing_detection_enabled);
2794 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2795 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002796 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2797 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002798
2799 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002800 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2801 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002802 voe_.GetEcStatus(ec_enabled, ec_mode);
2803 EXPECT_FALSE(ec_enabled);
2804
2805 // Turn echo cancellation back on, with settings, and make sure
2806 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002807 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2808 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002810 voe_.GetAecmMode(aecm_mode, cng_enabled);
2811 voe_.GetAgcStatus(agc_enabled, agc_mode);
2812 voe_.GetAgcConfig(agc_config);
2813 voe_.GetNsStatus(ns_enabled, ns_mode);
2814 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2815 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2816 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2817 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002818 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002819 EXPECT_TRUE(agc_enabled);
2820 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2821 EXPECT_TRUE(ns_enabled);
2822 EXPECT_TRUE(highpass_filter_enabled);
2823 EXPECT_FALSE(stereo_swapping_enabled);
2824 EXPECT_TRUE(typing_detection_enabled);
2825 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2826 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2827
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002828 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2829 // control.
solenberg246b8172015-12-08 09:50:23 -08002830 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2831 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002832 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002833 voe_.GetAecmMode(aecm_mode, cng_enabled);
2834 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002835 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002836 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2837
2838 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002839 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2840 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2841 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2842 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002843 voe_.GetEcStatus(ec_enabled, ec_mode);
2844 EXPECT_FALSE(ec_enabled);
2845 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002846 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2847 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002848 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002849 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002850 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002851 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2852
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002853 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002854 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2855 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856 voe_.GetAgcStatus(agc_enabled, agc_mode);
2857 EXPECT_FALSE(agc_enabled);
2858
2859 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002860 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2861 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2862 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002863 voe_.GetAgcStatus(agc_enabled, agc_mode);
2864 EXPECT_TRUE(agc_enabled);
2865 voe_.GetAgcConfig(agc_config);
2866 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2867
2868 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002869 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2870 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2871 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2872 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2873 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002874 voe_.GetNsStatus(ns_enabled, ns_mode);
2875 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2876 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2877 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2878 EXPECT_FALSE(ns_enabled);
2879 EXPECT_FALSE(highpass_filter_enabled);
2880 EXPECT_FALSE(typing_detection_enabled);
2881 EXPECT_TRUE(stereo_swapping_enabled);
2882
solenberg1ac56142015-10-13 03:58:19 -07002883 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002884 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885 voe_.GetEcStatus(ec_enabled, ec_mode);
2886 voe_.GetNsStatus(ns_enabled, ns_mode);
2887 EXPECT_TRUE(ec_enabled);
2888 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2889 EXPECT_FALSE(ns_enabled);
2890 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2891}
2892
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002893TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002894 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002895
2896 bool ec_enabled;
2897 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 bool agc_enabled;
2899 webrtc::AgcModes agc_mode;
2900 bool ns_enabled;
2901 webrtc::NsModes ns_mode;
2902 bool highpass_filter_enabled;
2903 bool stereo_swapping_enabled;
2904 bool typing_detection_enabled;
2905
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002906 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907 voe_.GetAgcStatus(agc_enabled, agc_mode);
2908 voe_.GetNsStatus(ns_enabled, ns_mode);
2909 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2910 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2911 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2912 EXPECT_TRUE(ec_enabled);
2913 EXPECT_TRUE(agc_enabled);
2914 EXPECT_TRUE(ns_enabled);
2915 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002916 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002918}
2919
2920TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2921 webrtc::AgcConfig set_config = {0};
2922 set_config.targetLeveldBOv = 3;
2923 set_config.digitalCompressionGaindB = 9;
2924 set_config.limiterEnable = true;
2925 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926
2927 webrtc::AgcConfig config = {0};
2928 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2929 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2930 EXPECT_EQ(set_config.digitalCompressionGaindB,
2931 config.digitalCompressionGaindB);
2932 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2933}
2934
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002936 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002937 EXPECT_CALL(adm_,
2938 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2939 EXPECT_CALL(adm_,
2940 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2941 EXPECT_CALL(adm_,
2942 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2943
kwiberg686a8ef2016-02-26 03:00:35 -08002944 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002945 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002946 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002947 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002948 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002949 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002950
2951 // Have to add a stream to make SetSend work.
2952 cricket::StreamParams stream1;
2953 stream1.ssrcs.push_back(1);
2954 channel1->AddSendStream(stream1);
2955 cricket::StreamParams stream2;
2956 stream2.ssrcs.push_back(2);
2957 channel2->AddSendStream(stream2);
2958
2959 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002960 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002961 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2962 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2963 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002964 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2965 EXPECT_EQ(parameters_options_all.options, channel1->options());
2966 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2967 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002968
2969 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002970 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002971 parameters_options_no_ns.options.noise_suppression =
2972 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002973 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2974 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002975 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2976 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2977 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002978 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002979
2980 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002981 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002982 parameters_options_no_agc.options.auto_gain_control =
2983 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002984 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002985 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2986 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2987 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002988 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002989
solenberg246b8172015-12-08 09:50:23 -08002990 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002991 bool ec_enabled;
2992 webrtc::EcModes ec_mode;
2993 bool agc_enabled;
2994 webrtc::AgcModes agc_mode;
2995 bool ns_enabled;
2996 webrtc::NsModes ns_mode;
2997 voe_.GetEcStatus(ec_enabled, ec_mode);
2998 voe_.GetAgcStatus(agc_enabled, agc_mode);
2999 voe_.GetNsStatus(ns_enabled, ns_mode);
3000 EXPECT_TRUE(ec_enabled);
3001 EXPECT_TRUE(agc_enabled);
3002 EXPECT_TRUE(ns_enabled);
3003
solenbergd53a3f92016-04-14 13:56:37 -07003004 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003005 voe_.GetEcStatus(ec_enabled, ec_mode);
3006 voe_.GetAgcStatus(agc_enabled, agc_mode);
3007 voe_.GetNsStatus(ns_enabled, ns_mode);
3008 EXPECT_TRUE(ec_enabled);
3009 EXPECT_TRUE(agc_enabled);
3010 EXPECT_FALSE(ns_enabled);
3011
solenbergd53a3f92016-04-14 13:56:37 -07003012 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013 voe_.GetEcStatus(ec_enabled, ec_mode);
3014 voe_.GetAgcStatus(agc_enabled, agc_mode);
3015 voe_.GetNsStatus(ns_enabled, ns_mode);
3016 EXPECT_TRUE(ec_enabled);
3017 EXPECT_FALSE(agc_enabled);
3018 EXPECT_TRUE(ns_enabled);
3019
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003020 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003021 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003022 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3023 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003024 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003025 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003026 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003027 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003028 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003029 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003030 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3031 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3032 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003033 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003034 voe_.GetEcStatus(ec_enabled, ec_mode);
3035 voe_.GetAgcStatus(agc_enabled, agc_mode);
3036 voe_.GetNsStatus(ns_enabled, ns_mode);
3037 EXPECT_TRUE(ec_enabled);
3038 EXPECT_FALSE(agc_enabled);
3039 EXPECT_FALSE(ns_enabled);
3040}
3041
wu@webrtc.orgde305012013-10-31 15:40:38 +00003042// This test verifies DSCP settings are properly applied on voice media channel.
3043TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003044 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003045 cricket::FakeNetworkInterface network_interface;
3046 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003047 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003048
solenbergbc37fc82016-04-04 09:54:44 -07003049 channel.reset(
3050 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003051 channel->SetInterface(&network_interface);
3052 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3053 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3054
3055 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003056 channel.reset(
3057 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003058 channel->SetInterface(&network_interface);
3059 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3060
3061 // Verify that setting the option to false resets the
3062 // DiffServCodePoint.
3063 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003064 channel.reset(
3065 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003066 channel->SetInterface(&network_interface);
3067 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3068 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3069
3070 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003071}
3072
solenberg1ac56142015-10-13 03:58:19 -07003073TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003074 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003075 cricket::WebRtcVoiceMediaChannel* media_channel =
3076 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003077 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003078 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003079 int channel_id = voe_.GetLastChannel();
3080 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3081 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003082 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003083 int channel_id2 = voe_.GetLastChannel();
3084 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003085}
3086
solenberg1ac56142015-10-13 03:58:19 -07003087TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003088 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003089 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003090 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3091 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3092 EXPECT_TRUE(channel_->AddSendStream(
3093 cricket::StreamParams::CreateLegacy(kSsrc1)));
3094 int channel_id = voe_.GetLastChannel();
3095 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3096 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3097 EXPECT_TRUE(channel_->AddSendStream(
3098 cricket::StreamParams::CreateLegacy(kSsrc2)));
3099 int channel_id2 = voe_.GetLastChannel();
3100 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003101}
3102
solenberg4bac9c52015-10-09 02:32:53 -07003103TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003104 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003105 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003106 cricket::StreamParams stream;
3107 stream.ssrcs.push_back(kSsrc2);
3108 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003109 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003110 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003111 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003112}
3113
3114TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003115 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003116 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3117 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003118 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003119 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003120 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3121 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3122 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003123}
3124
pbos8fc7fa72015-07-15 08:02:58 -07003125TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003126 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003127 const std::string kSyncLabel = "AvSyncLabel";
3128
solenbergff976312016-03-30 23:28:51 -07003129 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003130 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3131 sp.sync_label = kSyncLabel;
3132 // Creating two channels to make sure that sync label is set properly for both
3133 // the default voice channel and following ones.
3134 EXPECT_TRUE(channel_->AddRecvStream(sp));
3135 sp.ssrcs[0] += 1;
3136 EXPECT_TRUE(channel_->AddRecvStream(sp));
3137
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003138 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003139 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003140 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003141 << "SyncGroup should be set based on sync_label";
3142 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003143 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003144 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003145}
3146
solenberg3a941542015-11-16 07:34:50 -08003147// TODO(solenberg): Remove, once recv streams are configured through Call.
3148// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003149TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003150 // Test that setting the header extensions results in the expected state
3151 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003152 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003153 ssrcs.push_back(223);
3154 ssrcs.push_back(224);
3155
solenbergff976312016-03-30 23:28:51 -07003156 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003157 cricket::WebRtcVoiceMediaChannel* media_channel =
3158 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003159 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003160 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003161 EXPECT_TRUE(media_channel->AddRecvStream(
3162 cricket::StreamParams::CreateLegacy(ssrc)));
3163 }
3164
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003165 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003166 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003167 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003168 EXPECT_NE(nullptr, s);
3169 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3170 }
3171
3172 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003173 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003174 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003175 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003176 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003177 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003178 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003179 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003180 EXPECT_NE(nullptr, s);
3181 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003182 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3183 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003184 for (const auto& s_ext : s_exts) {
3185 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003186 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003187 }
3188 }
3189 }
3190 }
3191
3192 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003193 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003194 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003195 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003196 EXPECT_NE(nullptr, s);
3197 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3198 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003199}
3200
3201TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3202 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003203 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003204 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003205 static const unsigned char kRtcp[] = {
3206 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3207 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3210 };
jbaucheec21bd2016-03-20 06:15:43 -07003211 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003212
solenbergff976312016-03-30 23:28:51 -07003213 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003214 cricket::WebRtcVoiceMediaChannel* media_channel =
3215 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003216 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003217 EXPECT_TRUE(media_channel->AddRecvStream(
3218 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3219
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003220 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003221 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003222 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003223 EXPECT_EQ(0, s->received_packets());
3224 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3225 EXPECT_EQ(1, s->received_packets());
3226 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3227 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003228}
Minyue2013aec2015-05-13 14:14:42 +02003229
solenberg0a617e22015-10-20 15:49:38 -07003230// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003231// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003232TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003233 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003234 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003235 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003236 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003237 int recv_ch = voe_.GetLastChannel();
3238 EXPECT_NE(recv_ch, default_channel);
3239 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3240 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3241 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003242 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003243 recv_ch = voe_.GetLastChannel();
3244 EXPECT_NE(recv_ch, default_channel);
3245 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003246}
3247
3248TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003249 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003250 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003251
solenberg8189b022016-06-14 12:13:00 -07003252 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003253 int recv_ch = voe_.GetLastChannel();
3254
3255 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3256 int send_ch = voe_.GetLastChannel();
3257
3258 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3259 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3260 // channel of |recv_ch|.This is not a common case, since, normally, only the
3261 // default channel can be associated. However, the default is not deletable.
3262 // So we force the |recv_ch| to associate with a non-default channel.
3263 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3264 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3265
3266 EXPECT_TRUE(channel_->RemoveSendStream(2));
3267 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3268}
stefan658910c2015-09-03 05:48:32 -07003269
deadbeef884f5852016-01-15 09:20:04 -08003270TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003271 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003272 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3273 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003274
3275 // Setting the sink before a recv stream exists should do nothing.
3276 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003277 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003278 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3279
3280 // Now try actually setting the sink.
3281 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3282 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3283
3284 // Now try resetting it.
3285 channel_->SetRawAudioSink(kSsrc1, nullptr);
3286 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3287}
3288
3289TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003290 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003291 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3292 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003293
3294 // Should be able to set a default sink even when no stream exists.
3295 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3296
3297 // Create default channel and ensure it's assigned the default sink.
3298 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3299 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3300
3301 // Try resetting the default sink.
3302 channel_->SetRawAudioSink(0, nullptr);
3303 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3304
3305 // Try setting the default sink while the default stream exists.
3306 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3307 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3308
3309 // If we remove and add a default stream, it should get the same sink.
3310 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3311 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3312 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3313}
3314
skvlad7a43d252016-03-22 15:32:27 -07003315// Test that, just like the video channel, the voice channel communicates the
3316// network state to the call.
3317TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003318 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003319
3320 EXPECT_EQ(webrtc::kNetworkUp,
3321 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3322 EXPECT_EQ(webrtc::kNetworkUp,
3323 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3324
3325 channel_->OnReadyToSend(false);
3326 EXPECT_EQ(webrtc::kNetworkDown,
3327 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3328 EXPECT_EQ(webrtc::kNetworkUp,
3329 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3330
3331 channel_->OnReadyToSend(true);
3332 EXPECT_EQ(webrtc::kNetworkUp,
3333 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3334 EXPECT_EQ(webrtc::kNetworkUp,
3335 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3336}
3337
stefan658910c2015-09-03 05:48:32 -07003338// Tests that the library initializes and shuts down properly.
3339TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossuf93be582016-07-13 06:31:30 -07003340 using testing::_;
3341 using testing::AnyNumber;
3342
ossu29b1a8d2016-06-13 07:34:51 -07003343 // If the VoiceEngine wants to gather available codecs early, that's fine but
3344 // we never want it to create a decoder at this stage.
ossuf93be582016-07-13 06:31:30 -07003345 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
3346 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
3347 ON_CALL(*factory.get(), GetSupportedFormats())
3348 .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
3349 EXPECT_CALL(*factory.get(), GetSupportedFormats())
3350 .Times(AnyNumber());
3351 EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
3352
3353 cricket::WebRtcVoiceEngine engine(nullptr, factory);
kwiberg686a8ef2016-02-26 03:00:35 -08003354 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003355 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003356 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3357 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003358 EXPECT_TRUE(channel != nullptr);
3359 delete channel;
solenbergff976312016-03-30 23:28:51 -07003360}
stefan658910c2015-09-03 05:48:32 -07003361
solenbergff976312016-03-30 23:28:51 -07003362// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003363TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3364 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3365 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3366 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003367 {
ossuf93be582016-07-13 06:31:30 -07003368 cricket::WebRtcVoiceEngine engine(&adm, nullptr);
solenbergff976312016-03-30 23:28:51 -07003369 std::unique_ptr<webrtc::Call> call(
3370 webrtc::Call::Create(webrtc::Call::Config()));
3371 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3372 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3373 EXPECT_TRUE(channel != nullptr);
3374 delete channel;
3375 }
stefan658910c2015-09-03 05:48:32 -07003376}
3377
3378// Tests that the library is configured with the codecs we want.
ossuf93be582016-07-13 06:31:30 -07003379// TODO(ossu): This test should move into the builtin audio codecs module
3380// eventually.
stefan658910c2015-09-03 05:48:32 -07003381TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003382 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3383 // module.
3384
stefan658910c2015-09-03 05:48:32 -07003385 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003386 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003387 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003388 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003389 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003390 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003391 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003392 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003393 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003394 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003395 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003396 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003397 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003398 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003399 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003400 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003401 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003402 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003403 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003404 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003405 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003406 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003407 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003408 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003409 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003410 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003411 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003412 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003413 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003414 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003415 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003416 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003417 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003418 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003419 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003420 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003421 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003422 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003423 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003424 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003425 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003426 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003427 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003428 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003429 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003430 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003431 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003432 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003433 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003434
stefan658910c2015-09-03 05:48:32 -07003435 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuf93be582016-07-13 06:31:30 -07003436 cricket::WebRtcVoiceEngine engine(nullptr,
3437 webrtc::CreateBuiltinAudioDecoderFactory());
stefan658910c2015-09-03 05:48:32 -07003438 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossuf93be582016-07-13 06:31:30 -07003439 engine.send_codecs().begin(); it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003440 if (it->name == "CN" && it->clockrate == 16000) {
3441 EXPECT_EQ(105, it->id);
3442 } else if (it->name == "CN" && it->clockrate == 32000) {
3443 EXPECT_EQ(106, it->id);
3444 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3445 EXPECT_EQ(103, it->id);
3446 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3447 EXPECT_EQ(104, it->id);
3448 } else if (it->name == "G722" && it->clockrate == 8000) {
3449 EXPECT_EQ(9, it->id);
3450 } else if (it->name == "telephone-event") {
3451 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003452 } else if (it->name == "opus") {
3453 EXPECT_EQ(111, it->id);
3454 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3455 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003456 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3457 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3458 }
3459 }
stefan658910c2015-09-03 05:48:32 -07003460}
3461
3462// Tests that VoE supports at least 32 channels
3463TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuf93be582016-07-13 06:31:30 -07003464 cricket::WebRtcVoiceEngine engine(nullptr, nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003465 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003466 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003467
3468 cricket::VoiceMediaChannel* channels[32];
3469 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003470 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003471 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3472 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003473 if (!channel)
3474 break;
stefan658910c2015-09-03 05:48:32 -07003475 channels[num_channels++] = channel;
3476 }
3477
tfarina5237aaf2015-11-10 23:44:30 -08003478 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003479 EXPECT_EQ(expected, num_channels);
3480
3481 while (num_channels > 0) {
3482 delete channels[--num_channels];
3483 }
stefan658910c2015-09-03 05:48:32 -07003484}
3485
3486// Test that we set our preferred codecs properly.
3487TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003488 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3489 // - Check that our builtin codecs are usable by Channel.
3490 // - The codecs provided by the engine is usable by Channel.
3491 // It does not check that the codecs in the RecvParameters are actually
3492 // what we sent in - though it's probably reasonable to expect so, if
3493 // SetRecvParameters returns true.
3494 // I think it will become clear once audio decoder injection is completed.
3495 cricket::WebRtcVoiceEngine engine(
3496 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003497 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003498 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003499 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3500 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003501 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003502 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003503 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003504}