blob: 167ec89267e63381d8fcd1738324d013d2d8484f [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 {
ossu29b1a8d2016-06-13 07:34:51 -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));
ossu29b1a8d2016-06-13 07:34:51 -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));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756 EXPECT_TRUE(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));
762 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 EXPECT_TRUE(voe_.GetPlayout(channel_num));
764}
765
766// Test that we can add a codec while playing.
767TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700768 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200769 cricket::AudioRecvParameters parameters;
770 parameters.codecs.push_back(kIsacCodec);
771 parameters.codecs.push_back(kCn16000Codec);
772 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 EXPECT_TRUE(channel_->SetPlayout(true));
774
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200775 parameters.codecs.push_back(kOpusCodec);
776 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
777 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778 EXPECT_TRUE(voe_.GetPlayout(channel_num));
779 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800780 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
782}
783
784TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700785 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000787 // Test that when autobw is enabled, bitrate is kept as the default
788 // value. autobw is enabled for the following tests because the target
789 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790
791 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700792 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793
794 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700795 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700798 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799}
800
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000801TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700802 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000804 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805
806 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700807 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
808 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
809 // Rates above the max (56000) should be capped.
810 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000811
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700813 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
814 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
815 // Rates above the max (510000) should be capped.
816 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000817}
818
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000819TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700820 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000821
822 // Test that we can only set a maximum bitrate for a fixed-rate codec
823 // if it's bigger than the fixed rate.
824
825 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700826 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
827 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
828 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
829 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
830 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
831 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
832 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000833}
834
835TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700836 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200837 const int kDesiredBitrate = 128000;
838 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700839 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200840 parameters.max_bandwidth_bps = kDesiredBitrate;
841 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000842
843 EXPECT_TRUE(channel_->AddSendStream(
844 cricket::StreamParams::CreateLegacy(kSsrc1)));
845
846 int channel_num = voe_.GetLastChannel();
847 webrtc::CodecInst codec;
848 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200849 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000850}
851
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852// Test that bitrate cannot be set for CBR codecs.
853// Bitrate is ignored if it is higher than the fixed bitrate.
854// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000855TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700856 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857
858 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200859 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
860 int channel_num = voe_.GetLastChannel();
861 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
863 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200864
865 send_parameters_.max_bandwidth_bps = 128000;
866 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
868 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200869
870 send_parameters_.max_bandwidth_bps = 128;
871 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
873 EXPECT_EQ(64000, codec.rate);
874}
875
skvlade0d46372016-04-07 22:59:22 -0700876// Test that the per-stream bitrate limit and the global
877// bitrate limit both apply.
878TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
879 EXPECT_TRUE(SetupSendStream());
880
881 // opus, default bitrate == 64000.
882 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
883 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
884 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
885 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
886
887 // CBR codecs allow both maximums to exceed the bitrate.
888 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
889 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
890 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
891 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
892
893 // CBR codecs don't allow per stream maximums to be too low.
894 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
895 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
896}
897
898// Test that an attempt to set RtpParameters for a stream that does not exist
899// fails.
900TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
901 EXPECT_TRUE(SetupChannel());
902 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700903 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700904 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
905
906 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700907 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700908}
909
910TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700911 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700912 // This test verifies that setting RtpParameters succeeds only if
913 // the structure contains exactly one encoding.
914 // TODO(skvlad): Update this test when we start supporting setting parameters
915 // for each encoding individually.
916
917 EXPECT_TRUE(SetupSendStream());
918 // Setting RtpParameters with no encoding is expected to fail.
919 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700920 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700921 // Setting RtpParameters with exactly one encoding should succeed.
922 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700923 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700924 // Two or more encodings should result in failure.
925 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700926 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700927}
928
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700929// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700930// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700931TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
932 EXPECT_TRUE(SetupSendStream());
933 SetSend(channel_, true);
934 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
935 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700936 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700937 ASSERT_EQ(1u, parameters.encodings.size());
938 ASSERT_TRUE(parameters.encodings[0].active);
939 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700940 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700941 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
942
943 // Now change it back to active and verify we resume sending.
944 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700945 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700946 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
947}
948
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700949// Test that SetRtpSendParameters configures the correct encoding channel for
950// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700951TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
952 SetupForMultiSendStream();
953 // Create send streams.
954 for (uint32_t ssrc : kSsrcs4) {
955 EXPECT_TRUE(
956 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
957 }
958 // Configure one stream to be limited by the stream config, another to be
959 // limited by the global max, and the third one with no per-stream limit
960 // (still subject to the global limit).
961 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
962 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
963 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
964 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
965
966 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
967 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
968 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
969
970 // Remove the global cap; the streams should switch to their respective
971 // maximums (or remain unchanged if there was no other limit on them.)
972 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
973 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
974 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
975 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
976}
977
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700978// Test that GetRtpSendParameters returns the currently configured codecs.
979TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700980 EXPECT_TRUE(SetupSendStream());
981 cricket::AudioSendParameters parameters;
982 parameters.codecs.push_back(kIsacCodec);
983 parameters.codecs.push_back(kPcmuCodec);
984 EXPECT_TRUE(channel_->SetSendParameters(parameters));
985
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700986 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700987 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700988 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
989 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700990}
991
992// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700993TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700994 EXPECT_TRUE(SetupSendStream());
995 cricket::AudioSendParameters parameters;
996 parameters.codecs.push_back(kIsacCodec);
997 parameters.codecs.push_back(kPcmuCodec);
998 EXPECT_TRUE(channel_->SetSendParameters(parameters));
999
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001000 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001001
1002 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001003 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001004
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001005 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1006 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1007 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1008}
1009
1010// Test that GetRtpReceiveParameters returns the currently configured codecs.
1011TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1012 EXPECT_TRUE(SetupRecvStream());
1013 cricket::AudioRecvParameters parameters;
1014 parameters.codecs.push_back(kIsacCodec);
1015 parameters.codecs.push_back(kPcmuCodec);
1016 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1017
1018 webrtc::RtpParameters rtp_parameters =
1019 channel_->GetRtpReceiveParameters(kSsrc1);
1020 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1021 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1022 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1023}
1024
1025// Test that if we set/get parameters multiple times, we get the same results.
1026TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1027 EXPECT_TRUE(SetupRecvStream());
1028 cricket::AudioRecvParameters parameters;
1029 parameters.codecs.push_back(kIsacCodec);
1030 parameters.codecs.push_back(kPcmuCodec);
1031 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1032
1033 webrtc::RtpParameters initial_params =
1034 channel_->GetRtpReceiveParameters(kSsrc1);
1035
1036 // We should be able to set the params we just got.
1037 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1038
1039 // ... And this shouldn't change the params returned by
1040 // GetRtpReceiveParameters.
1041 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1042 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001043}
1044
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045// Test that we apply codecs properly.
1046TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001047 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001048 cricket::AudioSendParameters parameters;
1049 parameters.codecs.push_back(kIsacCodec);
1050 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001051 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001052 parameters.codecs[0].id = 96;
1053 parameters.codecs[0].bitrate = 48000;
1054 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001055 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001056 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057 webrtc::CodecInst gcodec;
1058 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1059 EXPECT_EQ(96, gcodec.pltype);
1060 EXPECT_EQ(48000, gcodec.rate);
1061 EXPECT_STREQ("ISAC", gcodec.plname);
1062 EXPECT_FALSE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001063 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1064 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001065 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066}
1067
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001068// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1069// to apply.
1070TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001071 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001072 cricket::AudioSendParameters parameters;
1073 parameters.codecs.push_back(kIsacCodec);
1074 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001075 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 parameters.codecs[0].id = 96;
1077 parameters.codecs[0].bitrate = 48000;
1078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001079 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1080 // Calling SetSendCodec again with same codec which is already set.
1081 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001082 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001083 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1084}
1085
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001086// Verify that G722 is set with 16000 samples per second to WebRTC.
1087TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001088 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001089 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001090 cricket::AudioSendParameters parameters;
1091 parameters.codecs.push_back(kG722CodecSdp);
1092 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001093 webrtc::CodecInst gcodec;
1094 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1095 EXPECT_STREQ("G722", gcodec.plname);
1096 EXPECT_EQ(1, gcodec.channels);
1097 EXPECT_EQ(16000, gcodec.plfreq);
1098}
1099
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001100// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001102 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001103 cricket::AudioSendParameters parameters;
1104 parameters.codecs.push_back(kOpusCodec);
1105 parameters.codecs[0].bitrate = 0;
1106 parameters.codecs[0].clockrate = 50000;
1107 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108}
1109
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001110// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001112 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001113 cricket::AudioSendParameters parameters;
1114 parameters.codecs.push_back(kOpusCodec);
1115 parameters.codecs[0].bitrate = 0;
1116 parameters.codecs[0].channels = 0;
1117 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118}
1119
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001120// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001122 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001123 cricket::AudioSendParameters parameters;
1124 parameters.codecs.push_back(kOpusCodec);
1125 parameters.codecs[0].bitrate = 0;
1126 parameters.codecs[0].channels = 0;
1127 parameters.codecs[0].params["stereo"] = "1";
1128 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129}
1130
1131// Test that if channel is 1 for opus and there's no stereo, we fail.
1132TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001133 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001134 cricket::AudioSendParameters parameters;
1135 parameters.codecs.push_back(kOpusCodec);
1136 parameters.codecs[0].bitrate = 0;
1137 parameters.codecs[0].channels = 1;
1138 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139}
1140
1141// Test that if channel is 1 for opus and stereo=0, we fail.
1142TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001143 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001144 cricket::AudioSendParameters parameters;
1145 parameters.codecs.push_back(kOpusCodec);
1146 parameters.codecs[0].bitrate = 0;
1147 parameters.codecs[0].channels = 1;
1148 parameters.codecs[0].params["stereo"] = "0";
1149 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150}
1151
1152// Test that if channel is 1 for opus and stereo=1, we fail.
1153TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001154 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001155 cricket::AudioSendParameters parameters;
1156 parameters.codecs.push_back(kOpusCodec);
1157 parameters.codecs[0].bitrate = 0;
1158 parameters.codecs[0].channels = 1;
1159 parameters.codecs[0].params["stereo"] = "1";
1160 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161}
1162
1163// Test that with bitrate=0 and no stereo,
1164// channels and bitrate are 1 and 32000.
1165TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001166 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 cricket::AudioSendParameters parameters;
1169 parameters.codecs.push_back(kOpusCodec);
1170 parameters.codecs[0].bitrate = 0;
1171 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001172 webrtc::CodecInst gcodec;
1173 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1174 EXPECT_STREQ("opus", gcodec.plname);
1175 EXPECT_EQ(1, gcodec.channels);
1176 EXPECT_EQ(32000, gcodec.rate);
1177}
1178
1179// Test that with bitrate=0 and stereo=0,
1180// channels and bitrate are 1 and 32000.
1181TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001182 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001184 cricket::AudioSendParameters parameters;
1185 parameters.codecs.push_back(kOpusCodec);
1186 parameters.codecs[0].bitrate = 0;
1187 parameters.codecs[0].params["stereo"] = "0";
1188 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 webrtc::CodecInst gcodec;
1190 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1191 EXPECT_STREQ("opus", gcodec.plname);
1192 EXPECT_EQ(1, gcodec.channels);
1193 EXPECT_EQ(32000, gcodec.rate);
1194}
1195
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001196// Test that with bitrate=invalid and stereo=0,
1197// channels and bitrate are 1 and 32000.
1198TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001199 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001200 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001201 cricket::AudioSendParameters parameters;
1202 parameters.codecs.push_back(kOpusCodec);
1203 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001204 webrtc::CodecInst gcodec;
1205
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001206 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001207 parameters.codecs[0].bitrate = 5999;
1208 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001209 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1210 EXPECT_STREQ("opus", gcodec.plname);
1211 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001212 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001213
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001214 parameters.codecs[0].bitrate = 510001;
1215 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1217 EXPECT_STREQ("opus", gcodec.plname);
1218 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001219 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001220}
1221
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222// Test that with bitrate=0 and stereo=1,
1223// channels and bitrate are 2 and 64000.
1224TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001225 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001226 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001227 cricket::AudioSendParameters parameters;
1228 parameters.codecs.push_back(kOpusCodec);
1229 parameters.codecs[0].bitrate = 0;
1230 parameters.codecs[0].params["stereo"] = "1";
1231 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001232 webrtc::CodecInst gcodec;
1233 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1234 EXPECT_STREQ("opus", gcodec.plname);
1235 EXPECT_EQ(2, gcodec.channels);
1236 EXPECT_EQ(64000, gcodec.rate);
1237}
1238
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001239// Test that with bitrate=invalid and stereo=1,
1240// channels and bitrate are 2 and 64000.
1241TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001242 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001243 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001244 cricket::AudioSendParameters parameters;
1245 parameters.codecs.push_back(kOpusCodec);
1246 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001247 webrtc::CodecInst gcodec;
1248
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001249 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001250 parameters.codecs[0].bitrate = 5999;
1251 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001252 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1253 EXPECT_STREQ("opus", gcodec.plname);
1254 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001255 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001256
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001257 parameters.codecs[0].bitrate = 510001;
1258 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001259 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1260 EXPECT_STREQ("opus", gcodec.plname);
1261 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001262 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001263}
1264
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265// Test that with bitrate=N and stereo unset,
1266// channels and bitrate are 1 and N.
1267TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001268 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001269 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001270 cricket::AudioSendParameters parameters;
1271 parameters.codecs.push_back(kOpusCodec);
1272 parameters.codecs[0].bitrate = 96000;
1273 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001274 webrtc::CodecInst gcodec;
1275 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1276 EXPECT_EQ(111, gcodec.pltype);
1277 EXPECT_EQ(96000, gcodec.rate);
1278 EXPECT_STREQ("opus", gcodec.plname);
1279 EXPECT_EQ(1, gcodec.channels);
1280 EXPECT_EQ(48000, gcodec.plfreq);
1281}
1282
1283// Test that with bitrate=N and stereo=0,
1284// channels and bitrate are 1 and N.
1285TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001286 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001287 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001288 cricket::AudioSendParameters parameters;
1289 parameters.codecs.push_back(kOpusCodec);
1290 parameters.codecs[0].bitrate = 30000;
1291 parameters.codecs[0].params["stereo"] = "0";
1292 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001293 webrtc::CodecInst gcodec;
1294 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1295 EXPECT_EQ(1, gcodec.channels);
1296 EXPECT_EQ(30000, gcodec.rate);
1297 EXPECT_STREQ("opus", gcodec.plname);
1298}
1299
1300// Test that with bitrate=N and without any parameters,
1301// channels and bitrate are 1 and N.
1302TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001303 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001304 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001305 cricket::AudioSendParameters parameters;
1306 parameters.codecs.push_back(kOpusCodec);
1307 parameters.codecs[0].bitrate = 30000;
1308 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309 webrtc::CodecInst gcodec;
1310 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1311 EXPECT_EQ(1, gcodec.channels);
1312 EXPECT_EQ(30000, gcodec.rate);
1313 EXPECT_STREQ("opus", gcodec.plname);
1314}
1315
1316// Test that with bitrate=N and stereo=1,
1317// channels and bitrate are 2 and N.
1318TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001319 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001321 cricket::AudioSendParameters parameters;
1322 parameters.codecs.push_back(kOpusCodec);
1323 parameters.codecs[0].bitrate = 30000;
1324 parameters.codecs[0].params["stereo"] = "1";
1325 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 webrtc::CodecInst gcodec;
1327 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1328 EXPECT_EQ(2, gcodec.channels);
1329 EXPECT_EQ(30000, gcodec.rate);
1330 EXPECT_STREQ("opus", gcodec.plname);
1331}
1332
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001333// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1334// Also test that the "maxaveragebitrate" can't be set to values outside the
1335// range of 6000 and 510000
1336TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001337 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001338 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001339 cricket::AudioSendParameters parameters;
1340 parameters.codecs.push_back(kOpusCodec);
1341 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001342 webrtc::CodecInst gcodec;
1343
1344 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001345 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1346 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001347 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001348 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001349
1350 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001351 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1352 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001353 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001354 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001355
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001356 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1357 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001358 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1359 EXPECT_EQ(200000, gcodec.rate);
1360}
1361
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001362// Test that we can enable NACK with opus as caller.
1363TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001364 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001365 cricket::AudioSendParameters parameters;
1366 parameters.codecs.push_back(kOpusCodec);
1367 parameters.codecs[0].AddFeedbackParam(
1368 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1369 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001370 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001372 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373}
1374
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001375// Test that we can enable NACK with opus as callee.
1376TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001377 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001378 cricket::AudioSendParameters parameters;
1379 parameters.codecs.push_back(kOpusCodec);
1380 parameters.codecs[0].AddFeedbackParam(
1381 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1382 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001383 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001385 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001386 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001387
1388 EXPECT_TRUE(channel_->AddSendStream(
1389 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001390 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001391}
1392
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001393// Test that we can enable NACK on receive streams.
1394TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001395 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001396 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].AddFeedbackParam(
1400 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1401 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001402 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001403 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001405 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001406 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001407}
1408
1409// Test that we can disable NACK.
1410TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001411 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001412 cricket::AudioSendParameters parameters;
1413 parameters.codecs.push_back(kOpusCodec);
1414 parameters.codecs[0].AddFeedbackParam(
1415 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1416 cricket::kParamValueEmpty));
1417 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001418 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001419
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001420 parameters.codecs.clear();
1421 parameters.codecs.push_back(kOpusCodec);
1422 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001423 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424}
1425
1426// Test that we can disable NACK on receive streams.
1427TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001428 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001429 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001430 cricket::AudioSendParameters parameters;
1431 parameters.codecs.push_back(kOpusCodec);
1432 parameters.codecs[0].AddFeedbackParam(
1433 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1434 cricket::kParamValueEmpty));
1435 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001436 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001437 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001438
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001439 parameters.codecs.clear();
1440 parameters.codecs.push_back(kOpusCodec);
1441 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001442 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001443 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001444}
1445
1446// Test that NACK is enabled on a new receive stream.
1447TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001448 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001449 cricket::AudioSendParameters parameters;
1450 parameters.codecs.push_back(kIsacCodec);
1451 parameters.codecs.push_back(kCn16000Codec);
1452 parameters.codecs[0].AddFeedbackParam(
1453 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1454 cricket::kParamValueEmpty));
1455 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001456 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457
solenberg8189b022016-06-14 12:13:00 -07001458 EXPECT_TRUE(AddRecvStream(kSsrc2));
1459 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1460 EXPECT_TRUE(AddRecvStream(kSsrc3));
1461 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462}
1463
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001464// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001465TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001466 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001467 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001468 cricket::AudioSendParameters parameters;
1469 parameters.codecs.push_back(kOpusCodec);
1470 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001471 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1472}
1473
1474// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001475TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001476 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001477 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001478 cricket::AudioSendParameters parameters;
1479 parameters.codecs.push_back(kOpusCodec);
1480 parameters.codecs[0].bitrate = 0;
1481 parameters.codecs[0].params["useinbandfec"] = "0";
1482 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001483 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1484 webrtc::CodecInst gcodec;
1485 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1486 EXPECT_STREQ("opus", gcodec.plname);
1487 EXPECT_EQ(1, gcodec.channels);
1488 EXPECT_EQ(32000, gcodec.rate);
1489}
1490
1491// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001492TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001493 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001494 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001495 cricket::AudioSendParameters parameters;
1496 parameters.codecs.push_back(kOpusCodec);
1497 parameters.codecs[0].bitrate = 0;
1498 parameters.codecs[0].params["useinbandfec"] = "1";
1499 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001500 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1501 webrtc::CodecInst gcodec;
1502 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1503 EXPECT_STREQ("opus", gcodec.plname);
1504 EXPECT_EQ(1, gcodec.channels);
1505 EXPECT_EQ(32000, gcodec.rate);
1506}
1507
1508// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001509TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001510 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001511 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001512 cricket::AudioSendParameters parameters;
1513 parameters.codecs.push_back(kOpusCodec);
1514 parameters.codecs[0].bitrate = 0;
1515 parameters.codecs[0].params["stereo"] = "1";
1516 parameters.codecs[0].params["useinbandfec"] = "1";
1517 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001518 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1519 webrtc::CodecInst gcodec;
1520 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1521 EXPECT_STREQ("opus", gcodec.plname);
1522 EXPECT_EQ(2, gcodec.channels);
1523 EXPECT_EQ(64000, gcodec.rate);
1524}
1525
1526// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001527TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001528 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001529 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001530 cricket::AudioSendParameters parameters;
1531 parameters.codecs.push_back(kIsacCodec);
1532 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001533 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1534}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001535
1536// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1537TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001538 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001539 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001540 cricket::AudioSendParameters parameters;
1541 parameters.codecs.push_back(kIsacCodec);
1542 parameters.codecs[0].params["useinbandfec"] = "1";
1543 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001544 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1545}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001546
1547// Test that Opus FEC status can be changed.
1548TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001549 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001550 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001551 cricket::AudioSendParameters parameters;
1552 parameters.codecs.push_back(kOpusCodec);
1553 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001554 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001555 parameters.codecs[0].params["useinbandfec"] = "1";
1556 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001557 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1558}
1559
stefanba4c0e42016-02-04 04:12:24 -08001560TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001561 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001562 cricket::AudioSendParameters send_parameters;
1563 send_parameters.codecs.push_back(kOpusCodec);
1564 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1565 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1566
1567 cricket::AudioRecvParameters recv_parameters;
1568 recv_parameters.codecs.push_back(kIsacCodec);
1569 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001570 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001571 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1572 EXPECT_FALSE(
1573 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1574
ossudedfd282016-06-14 07:12:39 -07001575 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001576 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1577 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1578 EXPECT_TRUE(
1579 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1580}
1581
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001582// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1583TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001584 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001585 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 cricket::AudioSendParameters parameters;
1587 parameters.codecs.push_back(kOpusCodec);
1588 parameters.codecs[0].bitrate = 0;
1589 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1590 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001591 EXPECT_EQ(cricket::kOpusBandwidthNb,
1592 voe_.GetMaxEncodingBandwidth(channel_num));
1593 webrtc::CodecInst gcodec;
1594 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1595 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001596
1597 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001598 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1599 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001600 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1601 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001602}
1603
1604// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1605TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001606 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001607 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001608 cricket::AudioSendParameters parameters;
1609 parameters.codecs.push_back(kOpusCodec);
1610 parameters.codecs[0].bitrate = 0;
1611 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1612 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001613 EXPECT_EQ(cricket::kOpusBandwidthMb,
1614 voe_.GetMaxEncodingBandwidth(channel_num));
1615 webrtc::CodecInst gcodec;
1616 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1617 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001618
1619 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001620 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001622 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1623 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001624}
1625
1626// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1627TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001628 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001629 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001630 cricket::AudioSendParameters parameters;
1631 parameters.codecs.push_back(kOpusCodec);
1632 parameters.codecs[0].bitrate = 0;
1633 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1634 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001635 EXPECT_EQ(cricket::kOpusBandwidthWb,
1636 voe_.GetMaxEncodingBandwidth(channel_num));
1637 webrtc::CodecInst gcodec;
1638 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1639 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001640
1641 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001642 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1643 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001644 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1645 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001646}
1647
1648// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1649TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001650 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001651 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001652 cricket::AudioSendParameters parameters;
1653 parameters.codecs.push_back(kOpusCodec);
1654 parameters.codecs[0].bitrate = 0;
1655 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1656 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001657 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1658 voe_.GetMaxEncodingBandwidth(channel_num));
1659 webrtc::CodecInst gcodec;
1660 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1661 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001662
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001663 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001664 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1665 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001666 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1667 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001668}
1669
1670// Test 24000 < maxplaybackrate triggers Opus full band mode.
1671TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001672 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001673 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001674 cricket::AudioSendParameters parameters;
1675 parameters.codecs.push_back(kOpusCodec);
1676 parameters.codecs[0].bitrate = 0;
1677 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1678 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001679 EXPECT_EQ(cricket::kOpusBandwidthFb,
1680 voe_.GetMaxEncodingBandwidth(channel_num));
1681 webrtc::CodecInst gcodec;
1682 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1683 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001684
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001685 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001686 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1687 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001688 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1689 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001690}
1691
1692// Test Opus that without maxplaybackrate, default playback rate is used.
1693TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001694 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001695 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001696 cricket::AudioSendParameters parameters;
1697 parameters.codecs.push_back(kOpusCodec);
1698 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001699 EXPECT_EQ(cricket::kOpusBandwidthFb,
1700 voe_.GetMaxEncodingBandwidth(channel_num));
1701}
1702
1703// Test the with non-Opus, maxplaybackrate has no effect.
1704TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001705 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001706 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001707 cricket::AudioSendParameters parameters;
1708 parameters.codecs.push_back(kIsacCodec);
1709 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1710 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001711 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1712}
1713
1714// Test maxplaybackrate can be set on two streams.
1715TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001716 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001717 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001718 cricket::AudioSendParameters parameters;
1719 parameters.codecs.push_back(kOpusCodec);
1720 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001721 // Default bandwidth is 24000.
1722 EXPECT_EQ(cricket::kOpusBandwidthFb,
1723 voe_.GetMaxEncodingBandwidth(channel_num));
1724
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001726
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001728 EXPECT_EQ(cricket::kOpusBandwidthNb,
1729 voe_.GetMaxEncodingBandwidth(channel_num));
1730
1731 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1732 channel_num = voe_.GetLastChannel();
1733 EXPECT_EQ(cricket::kOpusBandwidthNb,
1734 voe_.GetMaxEncodingBandwidth(channel_num));
1735}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001736
Minyue Li7100dcd2015-03-27 05:05:59 +01001737// Test that with usedtx=0, Opus DTX is off.
1738TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001739 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001740 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001741 cricket::AudioSendParameters parameters;
1742 parameters.codecs.push_back(kOpusCodec);
1743 parameters.codecs[0].params["usedtx"] = "0";
1744 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001745 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1746}
1747
1748// Test that with usedtx=1, Opus DTX is on.
1749TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001750 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001751 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001752 cricket::AudioSendParameters parameters;
1753 parameters.codecs.push_back(kOpusCodec);
1754 parameters.codecs[0].params["usedtx"] = "1";
1755 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001756 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1757 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1758}
1759
1760// Test that usedtx=1 works with stereo Opus.
1761TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001762 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001763 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001764 cricket::AudioSendParameters parameters;
1765 parameters.codecs.push_back(kOpusCodec);
1766 parameters.codecs[0].params["usedtx"] = "1";
1767 parameters.codecs[0].params["stereo"] = "1";
1768 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001769 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1770 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1771}
1772
1773// Test that usedtx=1 does not work with non Opus.
1774TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001775 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001776 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001777 cricket::AudioSendParameters parameters;
1778 parameters.codecs.push_back(kIsacCodec);
1779 parameters.codecs[0].params["usedtx"] = "1";
1780 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001781 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1782}
1783
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001784// Test that we can switch back and forth between Opus and ISAC with CN.
1785TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001786 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001788 cricket::AudioSendParameters opus_parameters;
1789 opus_parameters.codecs.push_back(kOpusCodec);
1790 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 webrtc::CodecInst gcodec;
1792 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001793 EXPECT_EQ(111, gcodec.pltype);
1794 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001796 cricket::AudioSendParameters isac_parameters;
1797 isac_parameters.codecs.push_back(kIsacCodec);
1798 isac_parameters.codecs.push_back(kCn16000Codec);
1799 isac_parameters.codecs.push_back(kOpusCodec);
1800 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1802 EXPECT_EQ(103, gcodec.pltype);
1803 EXPECT_STREQ("ISAC", gcodec.plname);
1804
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001805 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001806 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001807 EXPECT_EQ(111, gcodec.pltype);
1808 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001809}
1810
1811// Test that we handle various ways of specifying bitrate.
1812TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001813 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001814 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001815 cricket::AudioSendParameters parameters;
1816 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1817 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 webrtc::CodecInst gcodec;
1819 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1820 EXPECT_EQ(103, gcodec.pltype);
1821 EXPECT_STREQ("ISAC", gcodec.plname);
1822 EXPECT_EQ(32000, gcodec.rate);
1823
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001824 parameters.codecs[0].bitrate = 0; // bitrate == default
1825 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001826 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1827 EXPECT_EQ(103, gcodec.pltype);
1828 EXPECT_STREQ("ISAC", gcodec.plname);
1829 EXPECT_EQ(-1, gcodec.rate);
1830
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001831 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1832 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1834 EXPECT_EQ(103, gcodec.pltype);
1835 EXPECT_STREQ("ISAC", gcodec.plname);
1836 EXPECT_EQ(28000, gcodec.rate);
1837
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001838 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1841 EXPECT_EQ(0, gcodec.pltype);
1842 EXPECT_STREQ("PCMU", gcodec.plname);
1843 EXPECT_EQ(64000, gcodec.rate);
1844
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001845 parameters.codecs[0].bitrate = 0; // bitrate == default
1846 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1848 EXPECT_EQ(0, gcodec.pltype);
1849 EXPECT_STREQ("PCMU", gcodec.plname);
1850 EXPECT_EQ(64000, gcodec.rate);
1851
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 parameters.codecs[0] = kOpusCodec;
1853 parameters.codecs[0].bitrate = 0; // bitrate == default
1854 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1856 EXPECT_EQ(111, gcodec.pltype);
1857 EXPECT_STREQ("opus", gcodec.plname);
1858 EXPECT_EQ(32000, gcodec.rate);
1859}
1860
Brave Yao5225dd82015-03-26 07:39:19 +08001861// Test that we could set packet size specified in kCodecParamPTime.
1862TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001863 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001864 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001865 cricket::AudioSendParameters parameters;
1866 parameters.codecs.push_back(kOpusCodec);
1867 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1868 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001869 webrtc::CodecInst gcodec;
1870 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1871 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1872
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001873 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1874 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001875 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1876 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1877
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001878 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1879 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001880 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1881 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1882
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001883 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1884 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1885 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001886 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1887 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1888
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001889 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1890 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1891 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001892 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1893 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1894}
1895
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001896// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001898 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001899 cricket::AudioSendParameters parameters;
1900 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001901}
1902
1903// Test that we can set send codecs even with telephone-event codec as the first
1904// one on the list.
1905TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001906 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001908 cricket::AudioSendParameters parameters;
1909 parameters.codecs.push_back(kTelephoneEventCodec);
1910 parameters.codecs.push_back(kIsacCodec);
1911 parameters.codecs.push_back(kPcmuCodec);
1912 parameters.codecs[0].id = 98; // DTMF
1913 parameters.codecs[1].id = 96;
1914 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915 webrtc::CodecInst gcodec;
1916 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001917 EXPECT_EQ(96, gcodec.pltype);
1918 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001919 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001920}
1921
solenberg31642aa2016-03-14 08:00:37 -07001922// Test that payload type range is limited for telephone-event codec.
1923TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001924 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001925 cricket::AudioSendParameters parameters;
1926 parameters.codecs.push_back(kTelephoneEventCodec);
1927 parameters.codecs.push_back(kIsacCodec);
1928 parameters.codecs[0].id = 0; // DTMF
1929 parameters.codecs[1].id = 96;
1930 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1931 EXPECT_TRUE(channel_->CanInsertDtmf());
1932 parameters.codecs[0].id = 128; // DTMF
1933 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1934 EXPECT_FALSE(channel_->CanInsertDtmf());
1935 parameters.codecs[0].id = 127;
1936 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1937 EXPECT_TRUE(channel_->CanInsertDtmf());
1938 parameters.codecs[0].id = -1; // DTMF
1939 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1940 EXPECT_FALSE(channel_->CanInsertDtmf());
1941}
1942
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001943// Test that we can set send codecs even with CN codec as the first
1944// one on the list.
1945TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001946 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001947 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001948 cricket::AudioSendParameters parameters;
1949 parameters.codecs.push_back(kCn16000Codec);
1950 parameters.codecs.push_back(kIsacCodec);
1951 parameters.codecs.push_back(kPcmuCodec);
1952 parameters.codecs[0].id = 98; // wideband CN
1953 parameters.codecs[1].id = 96;
1954 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001955 webrtc::CodecInst gcodec;
1956 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1957 EXPECT_EQ(96, gcodec.pltype);
1958 EXPECT_STREQ("ISAC", gcodec.plname);
1959 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960}
1961
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001962// Test that we set VAD and DTMF types correctly as caller.
1963TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001964 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001966 cricket::AudioSendParameters parameters;
1967 parameters.codecs.push_back(kIsacCodec);
1968 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001970 parameters.codecs.push_back(kCn16000Codec);
1971 parameters.codecs.push_back(kCn8000Codec);
1972 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 parameters.codecs[0].id = 96;
1974 parameters.codecs[2].id = 97; // wideband CN
1975 parameters.codecs[4].id = 98; // DTMF
1976 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001977 webrtc::CodecInst gcodec;
1978 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1979 EXPECT_EQ(96, gcodec.pltype);
1980 EXPECT_STREQ("ISAC", gcodec.plname);
1981 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001982 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1983 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001984 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985}
1986
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001987// Test that we set VAD and DTMF types correctly as callee.
1988TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001989 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001990 cricket::AudioSendParameters parameters;
1991 parameters.codecs.push_back(kIsacCodec);
1992 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001993 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001994 parameters.codecs.push_back(kCn16000Codec);
1995 parameters.codecs.push_back(kCn8000Codec);
1996 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001997 parameters.codecs[0].id = 96;
1998 parameters.codecs[2].id = 97; // wideband CN
1999 parameters.codecs[4].id = 98; // DTMF
2000 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002001 EXPECT_TRUE(channel_->AddSendStream(
2002 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002003 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002004
2005 webrtc::CodecInst gcodec;
2006 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2007 EXPECT_EQ(96, gcodec.pltype);
2008 EXPECT_STREQ("ISAC", gcodec.plname);
2009 EXPECT_TRUE(voe_.GetVAD(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002010 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2011 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002012 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002013}
2014
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015// Test that we only apply VAD if we have a CN codec that matches the
2016// send codec clockrate.
2017TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002018 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002019 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002020 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002021 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002022 parameters.codecs.push_back(kIsacCodec);
2023 parameters.codecs.push_back(kCn16000Codec);
2024 parameters.codecs[1].id = 97;
2025 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026 webrtc::CodecInst gcodec;
2027 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2028 EXPECT_STREQ("ISAC", gcodec.plname);
2029 EXPECT_TRUE(voe_.GetVAD(channel_num));
2030 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2031 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002032 parameters.codecs[0] = kPcmuCodec;
2033 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002034 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2035 EXPECT_STREQ("PCMU", gcodec.plname);
2036 EXPECT_FALSE(voe_.GetVAD(channel_num));
2037 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002038 parameters.codecs[1] = kCn8000Codec;
2039 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002040 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2041 EXPECT_STREQ("PCMU", gcodec.plname);
2042 EXPECT_TRUE(voe_.GetVAD(channel_num));
2043 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002044 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002045 parameters.codecs[0] = kIsacCodec;
2046 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002047 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2048 EXPECT_STREQ("ISAC", gcodec.plname);
2049 EXPECT_FALSE(voe_.GetVAD(channel_num));
2050}
2051
2052// Test that we perform case-insensitive matching of codec names.
2053TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002054 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002055 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002056 cricket::AudioSendParameters parameters;
2057 parameters.codecs.push_back(kIsacCodec);
2058 parameters.codecs.push_back(kPcmuCodec);
2059 parameters.codecs.push_back(kCn16000Codec);
2060 parameters.codecs.push_back(kCn8000Codec);
2061 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002062 parameters.codecs[0].name = "iSaC";
2063 parameters.codecs[0].id = 96;
2064 parameters.codecs[2].id = 97; // wideband CN
2065 parameters.codecs[4].id = 98; // DTMF
2066 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067 webrtc::CodecInst gcodec;
2068 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2069 EXPECT_EQ(96, gcodec.pltype);
2070 EXPECT_STREQ("ISAC", gcodec.plname);
2071 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002072 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2073 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002074 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002075}
2076
stefanba4c0e42016-02-04 04:12:24 -08002077class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2078 public:
2079 WebRtcVoiceEngineWithSendSideBweTest()
2080 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2081};
2082
2083TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2084 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002085 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002086 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002087 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2088 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2089 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002090 extension.id);
2091 return;
2092 }
2093 }
2094 FAIL() << "Transport sequence number extension not in header-extension list.";
2095}
2096
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002097// Test support for audio level header extension.
2098TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002099 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002100}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002101TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002102 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002103}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002104
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002105// Test support for absolute send time header extension.
2106TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002107 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002108}
2109TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002110 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002111}
2112
solenberg1ac56142015-10-13 03:58:19 -07002113// Test that we can create a channel and start sending on it.
2114TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002115 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002116 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002117 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002118 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002119 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002120 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2121}
2122
2123// Test that a channel will send if and only if it has a source and is enabled
2124// for sending.
2125TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002126 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002127 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2128 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002129 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002130 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2131 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2132 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2133 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2134 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002135}
2136
solenberg94218532016-06-16 10:53:22 -07002137// Test that a channel is muted/unmuted.
2138TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2139 EXPECT_TRUE(SetupSendStream());
2140 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2141 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2142 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2143 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2144 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2145 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2146}
2147
solenberg6d6e7c52016-04-13 09:07:30 -07002148// Test that SetSendParameters() does not alter a stream's send state.
2149TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2150 EXPECT_TRUE(SetupSendStream());
2151 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2152
2153 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002154 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002155 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2156
2157 // Changing RTP header extensions will recreate the AudioSendStream.
2158 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002159 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002160 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2161 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2162
2163 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002164 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002165 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2166
2167 // Changing RTP header extensions will recreate the AudioSendStream.
2168 send_parameters_.extensions.clear();
2169 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2170 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2171}
2172
solenberg1ac56142015-10-13 03:58:19 -07002173// Test that we can create a channel and start playing out on it.
2174TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002175 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002176 int channel_num = voe_.GetLastChannel();
2177 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2178 EXPECT_TRUE(channel_->SetPlayout(true));
2179 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180 EXPECT_TRUE(channel_->SetPlayout(false));
2181 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2182}
2183
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002184// Test that we can add and remove send streams.
2185TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2186 SetupForMultiSendStream();
2187
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002188 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002189 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002190
solenbergc96df772015-10-21 13:01:53 -07002191 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002192 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002193 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002194 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002195 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002196 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002197 }
tfarina5237aaf2015-11-10 23:44:30 -08002198 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002199
solenbergc96df772015-10-21 13:01:53 -07002200 // Delete the send streams.
2201 for (uint32_t ssrc : kSsrcs4) {
2202 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002203 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002204 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002205 }
solenbergc96df772015-10-21 13:01:53 -07002206 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002207}
2208
2209// Test SetSendCodecs correctly configure the codecs in all send streams.
2210TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2211 SetupForMultiSendStream();
2212
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002214 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002215 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002216 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002217 }
2218
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002219 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002220 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002221 parameters.codecs.push_back(kIsacCodec);
2222 parameters.codecs.push_back(kCn16000Codec);
2223 parameters.codecs[1].id = 97;
2224 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002225
2226 // Verify ISAC and VAD are corrected configured on all send channels.
2227 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002228 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002229 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002230 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2231 EXPECT_STREQ("ISAC", gcodec.plname);
2232 EXPECT_TRUE(voe_.GetVAD(channel_num));
2233 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2234 }
2235
2236 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002237 parameters.codecs[0] = kPcmuCodec;
2238 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002239 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002240 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002241 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2242 EXPECT_STREQ("PCMU", gcodec.plname);
2243 EXPECT_FALSE(voe_.GetVAD(channel_num));
2244 }
2245}
2246
2247// Test we can SetSend on all send streams correctly.
2248TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2249 SetupForMultiSendStream();
2250
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002251 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002252 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002253 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002254 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002255 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2256 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002257 }
2258
2259 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002260 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002261 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002262 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002263 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264 }
2265
2266 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002267 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002268 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002269 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002270 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271 }
2272}
2273
2274// Test we can set the correct statistics on all send streams.
2275TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2276 SetupForMultiSendStream();
2277
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002278 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002279 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002280 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002281 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282 }
solenberg85a04962015-10-27 03:35:21 -07002283
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002284 // Create a receive stream to check that none of the send streams end up in
2285 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002286 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002287
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002288 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002289 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2290 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002291 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002292
solenberg85a04962015-10-27 03:35:21 -07002293 // Check stats for the added streams.
2294 {
2295 cricket::VoiceMediaInfo info;
2296 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002297
solenberg85a04962015-10-27 03:35:21 -07002298 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002299 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002300 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002301 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002302 }
2303
2304 // We have added one receive stream. We should see empty stats.
2305 EXPECT_EQ(info.receivers.size(), 1u);
2306 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002307 }
solenberg1ac56142015-10-13 03:58:19 -07002308
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002309 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002310 {
2311 cricket::VoiceMediaInfo info;
2312 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2313 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002314 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002315 EXPECT_EQ(0u, info.receivers.size());
2316 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002317
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002318 // Deliver a new packet - a default receive stream should be created and we
2319 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002320 {
2321 cricket::VoiceMediaInfo info;
2322 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2323 SetAudioReceiveStreamStats();
2324 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002325 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002326 EXPECT_EQ(1u, info.receivers.size());
2327 VerifyVoiceReceiverInfo(info.receivers[0]);
2328 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002329}
2330
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002331// Test that we can add and remove receive streams, and do proper send/playout.
2332// We can receive on multiple streams while sending one stream.
2333TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002334 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335 int channel_num1 = voe_.GetLastChannel();
2336
solenberg1ac56142015-10-13 03:58:19 -07002337 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002338 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002340 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341
solenberg1ac56142015-10-13 03:58:19 -07002342 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002343 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002345 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002346 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347
solenberg1ac56142015-10-13 03:58:19 -07002348 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2350 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2351
2352 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002353 EXPECT_TRUE(AddRecvStream(kSsrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354 int channel_num3 = voe_.GetLastChannel();
2355 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2356 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2357 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358
2359 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002360 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002361 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362
2363 // Stop playout.
2364 EXPECT_TRUE(channel_->SetPlayout(false));
2365 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2366 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2367 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2368
solenberg1ac56142015-10-13 03:58:19 -07002369 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370 EXPECT_TRUE(channel_->SetPlayout(true));
2371 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2372 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2373 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2374
solenberg1ac56142015-10-13 03:58:19 -07002375 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2377 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002378 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379}
2380
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002382// and start sending on it.
2383TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002384 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002385 cricket::AudioOptions options_adjust_agc;
2386 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387 webrtc::AgcConfig agc_config;
2388 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2389 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002390 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002391 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002392 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002393 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002394 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2395 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002396 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002397 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002398 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399}
2400
wu@webrtc.org97077a32013-10-25 21:18:33 +00002401TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002402 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002403 EXPECT_CALL(adm_,
2404 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002405 webrtc::AgcConfig agc_config;
2406 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2407 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002408 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2409 send_parameters_.options.tx_agc_digital_compression_gain =
2410 rtc::Optional<uint16_t>(9);
2411 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2412 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2413 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002414 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2415 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2416 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2417 EXPECT_TRUE(agc_config.limiterEnable);
2418
2419 // Check interaction with adjust_agc_delta. Both should be respected, for
2420 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002421 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2422 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002423 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2424 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2425}
2426
wu@webrtc.org97077a32013-10-25 21:18:33 +00002427TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002428 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002429 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2430 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002431 send_parameters_.options.recording_sample_rate =
2432 rtc::Optional<uint32_t>(48000);
2433 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2434 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002435}
2436
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002438// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002440 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002441 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442}
2443
2444TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2445 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002446 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002447 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002448 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002449 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002450 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2451 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002452 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453
solenberg85a04962015-10-27 03:35:21 -07002454 // Check stats for the added streams.
2455 {
2456 cricket::VoiceMediaInfo info;
2457 EXPECT_EQ(true, channel_->GetStats(&info));
2458
2459 // We have added one send stream. We should see the stats we've set.
2460 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002461 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002462 // We have added one receive stream. We should see empty stats.
2463 EXPECT_EQ(info.receivers.size(), 1u);
2464 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2465 }
solenberg1ac56142015-10-13 03:58:19 -07002466
solenberg566ef242015-11-06 15:34:49 -08002467 // Start sending - this affects some reported stats.
2468 {
2469 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002470 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002471 EXPECT_EQ(true, channel_->GetStats(&info));
2472 VerifyVoiceSenderInfo(info.senders[0], true);
2473 }
2474
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002475 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002476 {
2477 cricket::VoiceMediaInfo info;
2478 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2479 EXPECT_EQ(true, channel_->GetStats(&info));
2480 EXPECT_EQ(1u, info.senders.size());
2481 EXPECT_EQ(0u, info.receivers.size());
2482 }
solenberg1ac56142015-10-13 03:58:19 -07002483
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002484 // Deliver a new packet - a default receive stream should be created and we
2485 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002486 {
2487 cricket::VoiceMediaInfo info;
2488 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2489 SetAudioReceiveStreamStats();
2490 EXPECT_EQ(true, channel_->GetStats(&info));
2491 EXPECT_EQ(1u, info.senders.size());
2492 EXPECT_EQ(1u, info.receivers.size());
2493 VerifyVoiceReceiverInfo(info.receivers[0]);
2494 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495}
2496
2497// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002498// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002500 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002501 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002502 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002503 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504}
2505
2506// Test that the local SSRC is the same on sending and receiving channels if the
2507// receive channel is created before the send channel.
2508TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002509 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002510 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002512 cricket::StreamParams::CreateLegacy(kSsrc1)));
2513 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2514 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002515}
2516
2517// Test that we can properly receive packets.
2518TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002519 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002520 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002522
2523 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2524 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002525}
2526
2527// Test that we can properly receive packets on multiple streams.
2528TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002529 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002530 const uint32_t ssrc1 = 1;
2531 const uint32_t ssrc2 = 2;
2532 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002533 EXPECT_TRUE(AddRecvStream(ssrc1));
2534 EXPECT_TRUE(AddRecvStream(ssrc2));
2535 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002537 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002538 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002540 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541 }
mflodman3d7db262016-04-29 00:57:13 -07002542
2543 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2544 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2545 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2546
2547 EXPECT_EQ(s1.received_packets(), 0);
2548 EXPECT_EQ(s2.received_packets(), 0);
2549 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002550
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002551 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002552 EXPECT_EQ(s1.received_packets(), 0);
2553 EXPECT_EQ(s2.received_packets(), 0);
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[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002557 EXPECT_EQ(s1.received_packets(), 1);
2558 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2559 EXPECT_EQ(s2.received_packets(), 0);
2560 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002561
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002562 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002563 EXPECT_EQ(s1.received_packets(), 1);
2564 EXPECT_EQ(s2.received_packets(), 1);
2565 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2566 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002567
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002568 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002569 EXPECT_EQ(s1.received_packets(), 1);
2570 EXPECT_EQ(s2.received_packets(), 1);
2571 EXPECT_EQ(s3.received_packets(), 1);
2572 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002573
mflodman3d7db262016-04-29 00:57:13 -07002574 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2575 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2576 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002577}
2578
solenberg7e63ef02015-11-20 00:19:43 -08002579// Test that receiving on an unsignalled stream works (default channel will be
2580// created).
2581TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002582 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002583 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2584
solenberg7e63ef02015-11-20 00:19:43 -08002585 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002586
2587 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2588 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2589 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002590}
2591
2592// Test that receiving on an unsignalled stream works (default channel will be
2593// created), and that packets will be forwarded to the default channel
2594// regardless of their SSRCs.
2595TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002596 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002597 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002598 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2599
mflodman3d7db262016-04-29 00:57:13 -07002600 // Note that ssrc = 0 is not supported.
2601 uint32_t ssrc = 1;
2602 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002603 rtc::SetBE32(&packet[8], ssrc);
2604 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002605
2606 // Verify we only have one default stream.
2607 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2608 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2609 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002610 }
mflodman3d7db262016-04-29 00:57:13 -07002611
2612 // Sending the same ssrc again should not create a new stream.
2613 --ssrc;
2614 DeliverPacket(packet, sizeof(packet));
2615 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2616 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2617 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002618}
2619
2620// Test that a default channel is created even after a signalled stream has been
2621// added, and that this stream will get any packets for unknown SSRCs.
2622TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002623 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002624 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002625 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2626
2627 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002628 const uint32_t signaled_ssrc = 1;
2629 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002630 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002631 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002632 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2633 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002634
2635 // Note that the first unknown SSRC cannot be 0, because we only support
2636 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002637 const uint32_t unsignaled_ssrc = 7011;
2638 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002639 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002640 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2641 packet, sizeof(packet)));
2642 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2643
2644 DeliverPacket(packet, sizeof(packet));
2645 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2646
2647 rtc::SetBE32(&packet[8], signaled_ssrc);
2648 DeliverPacket(packet, sizeof(packet));
2649 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2650 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002651}
2652
solenberg0a617e22015-10-20 15:49:38 -07002653// Test that we properly handle failures to add a receive stream.
2654TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002655 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002657 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658}
2659
solenberg0a617e22015-10-20 15:49:38 -07002660// Test that we properly handle failures to add a send stream.
2661TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002662 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002663 voe_.set_fail_create_channel(true);
2664 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2665}
2666
solenberg1ac56142015-10-13 03:58:19 -07002667// Test that AddRecvStream creates new stream.
2668TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002669 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002671 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002672 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673}
2674
2675// Test that after adding a recv stream, we do not decode more codecs than
2676// those previously passed into SetRecvCodecs.
2677TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002678 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002679 cricket::AudioRecvParameters parameters;
2680 parameters.codecs.push_back(kIsacCodec);
2681 parameters.codecs.push_back(kPcmuCodec);
2682 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002683 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002684 int channel_num2 = voe_.GetLastChannel();
2685 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002686 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002687 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002688 gcodec.channels = 2;
2689 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2690}
2691
2692// Test that we properly clean up any streams that were added, even if
2693// not explicitly removed.
2694TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002695 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002696 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8189b022016-06-14 12:13:00 -07002697 EXPECT_TRUE(AddRecvStream(1));
2698 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002699 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2700 delete channel_;
2701 channel_ = NULL;
2702 EXPECT_EQ(0, voe_.GetNumChannels());
2703}
2704
wu@webrtc.org78187522013-10-07 23:32:02 +00002705TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002706 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002707 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002708}
2709
2710TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002711 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002712 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002713 // Manually delete channel to simulate a failure.
2714 int channel = voe_.GetLastChannel();
2715 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2716 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002717 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002718 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002719 EXPECT_NE(channel, new_channel);
2720 // The last created channel is deleted too.
2721 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002722}
2723
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002724// Test the InsertDtmf on default send stream as caller.
2725TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2726 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002727}
2728
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002729// Test the InsertDtmf on default send stream as callee
2730TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2731 TestInsertDtmf(0, false);
2732}
2733
2734// Test the InsertDtmf on specified send stream as caller.
2735TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2736 TestInsertDtmf(kSsrc1, true);
2737}
2738
2739// Test the InsertDtmf on specified send stream as callee.
2740TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2741 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742}
2743
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002744TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002745 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002746 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002747 SetSend(channel_, true);
solenberg8189b022016-06-14 12:13:00 -07002748 EXPECT_TRUE(AddRecvStream(2));
2749 EXPECT_TRUE(AddRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002750 EXPECT_TRUE(channel_->SetPlayout(true));
2751 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2752 EXPECT_TRUE(channel_->SetPlayout(false));
2753 EXPECT_FALSE(channel_->SetPlayout(true));
2754}
2755
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002757 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002758 EXPECT_CALL(adm_,
2759 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2760 EXPECT_CALL(adm_,
2761 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2762 EXPECT_CALL(adm_,
2763 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002764 bool ec_enabled;
2765 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766 webrtc::AecmModes aecm_mode;
2767 bool cng_enabled;
2768 bool agc_enabled;
2769 webrtc::AgcModes agc_mode;
2770 webrtc::AgcConfig agc_config;
2771 bool ns_enabled;
2772 webrtc::NsModes ns_mode;
2773 bool highpass_filter_enabled;
2774 bool stereo_swapping_enabled;
2775 bool typing_detection_enabled;
2776 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777 voe_.GetAecmMode(aecm_mode, cng_enabled);
2778 voe_.GetAgcStatus(agc_enabled, agc_mode);
2779 voe_.GetAgcConfig(agc_config);
2780 voe_.GetNsStatus(ns_enabled, ns_mode);
2781 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2782 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2783 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2784 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002785 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002786 EXPECT_FALSE(cng_enabled);
2787 EXPECT_TRUE(agc_enabled);
2788 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2789 EXPECT_TRUE(ns_enabled);
2790 EXPECT_TRUE(highpass_filter_enabled);
2791 EXPECT_FALSE(stereo_swapping_enabled);
2792 EXPECT_TRUE(typing_detection_enabled);
2793 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2794 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002795 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2796 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002797
solenberg246b8172015-12-08 09:50:23 -08002798 // Nothing set in AudioOptions, so everything should be as default.
2799 send_parameters_.options = cricket::AudioOptions();
2800 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002801 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002802 voe_.GetAecmMode(aecm_mode, cng_enabled);
2803 voe_.GetAgcStatus(agc_enabled, agc_mode);
2804 voe_.GetAgcConfig(agc_config);
2805 voe_.GetNsStatus(ns_enabled, ns_mode);
2806 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2807 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2808 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2809 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002810 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811 EXPECT_FALSE(cng_enabled);
2812 EXPECT_TRUE(agc_enabled);
2813 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2814 EXPECT_TRUE(ns_enabled);
2815 EXPECT_TRUE(highpass_filter_enabled);
2816 EXPECT_FALSE(stereo_swapping_enabled);
2817 EXPECT_TRUE(typing_detection_enabled);
2818 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2819 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002820 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2821 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822
2823 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002824 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2825 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002826 voe_.GetEcStatus(ec_enabled, ec_mode);
2827 EXPECT_FALSE(ec_enabled);
2828
2829 // Turn echo cancellation back on, with settings, and make sure
2830 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002831 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2832 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002833 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002834 voe_.GetAecmMode(aecm_mode, cng_enabled);
2835 voe_.GetAgcStatus(agc_enabled, agc_mode);
2836 voe_.GetAgcConfig(agc_config);
2837 voe_.GetNsStatus(ns_enabled, ns_mode);
2838 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2839 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2840 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2841 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002842 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843 EXPECT_TRUE(agc_enabled);
2844 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2845 EXPECT_TRUE(ns_enabled);
2846 EXPECT_TRUE(highpass_filter_enabled);
2847 EXPECT_FALSE(stereo_swapping_enabled);
2848 EXPECT_TRUE(typing_detection_enabled);
2849 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2850 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2851
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002852 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2853 // control.
solenberg246b8172015-12-08 09:50:23 -08002854 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2855 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002856 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002857 voe_.GetAecmMode(aecm_mode, cng_enabled);
2858 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002859 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002860 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2861
2862 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002863 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2864 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2865 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2866 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002867 voe_.GetEcStatus(ec_enabled, ec_mode);
2868 EXPECT_FALSE(ec_enabled);
2869 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002870 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2871 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002872 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002873 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002874 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002875 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2876
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002877 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002878 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2879 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002880 voe_.GetAgcStatus(agc_enabled, agc_mode);
2881 EXPECT_FALSE(agc_enabled);
2882
2883 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002884 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2885 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2886 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002887 voe_.GetAgcStatus(agc_enabled, agc_mode);
2888 EXPECT_TRUE(agc_enabled);
2889 voe_.GetAgcConfig(agc_config);
2890 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2891
2892 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002893 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2894 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2895 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2896 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2897 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 voe_.GetNsStatus(ns_enabled, ns_mode);
2899 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2900 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2901 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2902 EXPECT_FALSE(ns_enabled);
2903 EXPECT_FALSE(highpass_filter_enabled);
2904 EXPECT_FALSE(typing_detection_enabled);
2905 EXPECT_TRUE(stereo_swapping_enabled);
2906
solenberg1ac56142015-10-13 03:58:19 -07002907 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002908 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909 voe_.GetEcStatus(ec_enabled, ec_mode);
2910 voe_.GetNsStatus(ns_enabled, ns_mode);
2911 EXPECT_TRUE(ec_enabled);
2912 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2913 EXPECT_FALSE(ns_enabled);
2914 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2915}
2916
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002917TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002918 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919
2920 bool ec_enabled;
2921 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002922 bool agc_enabled;
2923 webrtc::AgcModes agc_mode;
2924 bool ns_enabled;
2925 webrtc::NsModes ns_mode;
2926 bool highpass_filter_enabled;
2927 bool stereo_swapping_enabled;
2928 bool typing_detection_enabled;
2929
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002931 voe_.GetAgcStatus(agc_enabled, agc_mode);
2932 voe_.GetNsStatus(ns_enabled, ns_mode);
2933 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2934 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2935 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2936 EXPECT_TRUE(ec_enabled);
2937 EXPECT_TRUE(agc_enabled);
2938 EXPECT_TRUE(ns_enabled);
2939 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002940 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942}
2943
2944TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2945 webrtc::AgcConfig set_config = {0};
2946 set_config.targetLeveldBOv = 3;
2947 set_config.digitalCompressionGaindB = 9;
2948 set_config.limiterEnable = true;
2949 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002950
2951 webrtc::AgcConfig config = {0};
2952 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2953 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2954 EXPECT_EQ(set_config.digitalCompressionGaindB,
2955 config.digitalCompressionGaindB);
2956 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2957}
2958
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002959TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002960 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002961 EXPECT_CALL(adm_,
2962 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2963 EXPECT_CALL(adm_,
2964 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2965 EXPECT_CALL(adm_,
2966 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2967
kwiberg686a8ef2016-02-26 03:00:35 -08002968 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002969 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002970 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002971 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002972 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002973 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002974
2975 // Have to add a stream to make SetSend work.
2976 cricket::StreamParams stream1;
2977 stream1.ssrcs.push_back(1);
2978 channel1->AddSendStream(stream1);
2979 cricket::StreamParams stream2;
2980 stream2.ssrcs.push_back(2);
2981 channel2->AddSendStream(stream2);
2982
2983 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002984 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002985 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2986 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2987 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002988 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2989 EXPECT_EQ(parameters_options_all.options, channel1->options());
2990 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2991 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002992
2993 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002994 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002995 parameters_options_no_ns.options.noise_suppression =
2996 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002997 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2998 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002999 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3000 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3001 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003002 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003
3004 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003005 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003006 parameters_options_no_agc.options.auto_gain_control =
3007 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003008 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003009 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3010 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3011 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003012 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013
solenberg246b8172015-12-08 09:50:23 -08003014 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003015 bool ec_enabled;
3016 webrtc::EcModes ec_mode;
3017 bool agc_enabled;
3018 webrtc::AgcModes agc_mode;
3019 bool ns_enabled;
3020 webrtc::NsModes ns_mode;
3021 voe_.GetEcStatus(ec_enabled, ec_mode);
3022 voe_.GetAgcStatus(agc_enabled, agc_mode);
3023 voe_.GetNsStatus(ns_enabled, ns_mode);
3024 EXPECT_TRUE(ec_enabled);
3025 EXPECT_TRUE(agc_enabled);
3026 EXPECT_TRUE(ns_enabled);
3027
solenbergd53a3f92016-04-14 13:56:37 -07003028 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003029 voe_.GetEcStatus(ec_enabled, ec_mode);
3030 voe_.GetAgcStatus(agc_enabled, agc_mode);
3031 voe_.GetNsStatus(ns_enabled, ns_mode);
3032 EXPECT_TRUE(ec_enabled);
3033 EXPECT_TRUE(agc_enabled);
3034 EXPECT_FALSE(ns_enabled);
3035
solenbergd53a3f92016-04-14 13:56:37 -07003036 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003037 voe_.GetEcStatus(ec_enabled, ec_mode);
3038 voe_.GetAgcStatus(agc_enabled, agc_mode);
3039 voe_.GetNsStatus(ns_enabled, ns_mode);
3040 EXPECT_TRUE(ec_enabled);
3041 EXPECT_FALSE(agc_enabled);
3042 EXPECT_TRUE(ns_enabled);
3043
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003044 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003045 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003046 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3047 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003048 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003049 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003050 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003051 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003052 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003053 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003054 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3055 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3056 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003057 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003058 voe_.GetEcStatus(ec_enabled, ec_mode);
3059 voe_.GetAgcStatus(agc_enabled, agc_mode);
3060 voe_.GetNsStatus(ns_enabled, ns_mode);
3061 EXPECT_TRUE(ec_enabled);
3062 EXPECT_FALSE(agc_enabled);
3063 EXPECT_FALSE(ns_enabled);
3064}
3065
wu@webrtc.orgde305012013-10-31 15:40:38 +00003066// This test verifies DSCP settings are properly applied on voice media channel.
3067TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003068 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003069 cricket::FakeNetworkInterface network_interface;
3070 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003071 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003072
solenbergbc37fc82016-04-04 09:54:44 -07003073 channel.reset(
3074 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003075 channel->SetInterface(&network_interface);
3076 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3077 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3078
3079 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003080 channel.reset(
3081 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003082 channel->SetInterface(&network_interface);
3083 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3084
3085 // Verify that setting the option to false resets the
3086 // DiffServCodePoint.
3087 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003088 channel.reset(
3089 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003090 channel->SetInterface(&network_interface);
3091 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3092 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3093
3094 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003095}
3096
solenberg1ac56142015-10-13 03:58:19 -07003097TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003098 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003099 cricket::WebRtcVoiceMediaChannel* media_channel =
3100 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003101 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003102 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003103 int channel_id = voe_.GetLastChannel();
3104 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3105 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003106 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003107 int channel_id2 = voe_.GetLastChannel();
3108 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003109}
3110
solenberg1ac56142015-10-13 03:58:19 -07003111TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003112 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003113 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003114 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3115 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3116 EXPECT_TRUE(channel_->AddSendStream(
3117 cricket::StreamParams::CreateLegacy(kSsrc1)));
3118 int channel_id = voe_.GetLastChannel();
3119 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3120 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3121 EXPECT_TRUE(channel_->AddSendStream(
3122 cricket::StreamParams::CreateLegacy(kSsrc2)));
3123 int channel_id2 = voe_.GetLastChannel();
3124 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003125}
3126
solenberg4bac9c52015-10-09 02:32:53 -07003127TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003128 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003129 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003130 cricket::StreamParams stream;
3131 stream.ssrcs.push_back(kSsrc2);
3132 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003133 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003134 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003135 float scale = 0;
3136 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3137 EXPECT_DOUBLE_EQ(3, scale);
3138}
3139
3140TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003141 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003142 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3143 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3144 int channel_id = voe_.GetLastChannel();
3145 float scale = 0;
3146 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3147 EXPECT_DOUBLE_EQ(2, scale);
3148 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003149 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003150 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003151}
3152
pbos8fc7fa72015-07-15 08:02:58 -07003153TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003154 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003155 const std::string kSyncLabel = "AvSyncLabel";
3156
solenbergff976312016-03-30 23:28:51 -07003157 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003158 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3159 sp.sync_label = kSyncLabel;
3160 // Creating two channels to make sure that sync label is set properly for both
3161 // the default voice channel and following ones.
3162 EXPECT_TRUE(channel_->AddRecvStream(sp));
3163 sp.ssrcs[0] += 1;
3164 EXPECT_TRUE(channel_->AddRecvStream(sp));
3165
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003166 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003167 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003168 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003169 << "SyncGroup should be set based on sync_label";
3170 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003171 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003172 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003173}
3174
solenberg3a941542015-11-16 07:34:50 -08003175// TODO(solenberg): Remove, once recv streams are configured through Call.
3176// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003177TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003178 // Test that setting the header extensions results in the expected state
3179 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003180 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003181 ssrcs.push_back(223);
3182 ssrcs.push_back(224);
3183
solenbergff976312016-03-30 23:28:51 -07003184 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003185 cricket::WebRtcVoiceMediaChannel* media_channel =
3186 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003187 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003188 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003189 EXPECT_TRUE(media_channel->AddRecvStream(
3190 cricket::StreamParams::CreateLegacy(ssrc)));
3191 }
3192
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003193 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
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 }
3199
3200 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003201 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003202 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003203 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003204 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003205 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003206 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003207 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003208 EXPECT_NE(nullptr, s);
3209 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003210 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3211 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003212 for (const auto& s_ext : s_exts) {
3213 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003214 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003215 }
3216 }
3217 }
3218 }
3219
3220 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003221 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003222 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003223 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003224 EXPECT_NE(nullptr, s);
3225 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3226 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003227}
3228
3229TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3230 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003231 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003232 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003233 static const unsigned char kRtcp[] = {
3234 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3235 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3238 };
jbaucheec21bd2016-03-20 06:15:43 -07003239 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003240
solenbergff976312016-03-30 23:28:51 -07003241 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003242 cricket::WebRtcVoiceMediaChannel* media_channel =
3243 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003244 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003245 EXPECT_TRUE(media_channel->AddRecvStream(
3246 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3247
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003248 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003249 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003250 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003251 EXPECT_EQ(0, s->received_packets());
3252 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3253 EXPECT_EQ(1, s->received_packets());
3254 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3255 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003256}
Minyue2013aec2015-05-13 14:14:42 +02003257
solenberg0a617e22015-10-20 15:49:38 -07003258// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003259// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003260TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003261 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003262 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003263 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003264 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003265 int recv_ch = voe_.GetLastChannel();
3266 EXPECT_NE(recv_ch, default_channel);
3267 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3268 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3269 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003270 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003271 recv_ch = voe_.GetLastChannel();
3272 EXPECT_NE(recv_ch, default_channel);
3273 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003274}
3275
3276TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003277 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003278 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003279
solenberg8189b022016-06-14 12:13:00 -07003280 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003281 int recv_ch = voe_.GetLastChannel();
3282
3283 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3284 int send_ch = voe_.GetLastChannel();
3285
3286 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3287 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3288 // channel of |recv_ch|.This is not a common case, since, normally, only the
3289 // default channel can be associated. However, the default is not deletable.
3290 // So we force the |recv_ch| to associate with a non-default channel.
3291 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3292 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3293
3294 EXPECT_TRUE(channel_->RemoveSendStream(2));
3295 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3296}
stefan658910c2015-09-03 05:48:32 -07003297
deadbeef884f5852016-01-15 09:20:04 -08003298TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003299 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003300 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3301 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003302
3303 // Setting the sink before a recv stream exists should do nothing.
3304 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003305 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003306 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3307
3308 // Now try actually setting the sink.
3309 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3310 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3311
3312 // Now try resetting it.
3313 channel_->SetRawAudioSink(kSsrc1, nullptr);
3314 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3315}
3316
3317TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003318 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003319 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3320 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003321
3322 // Should be able to set a default sink even when no stream exists.
3323 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3324
3325 // Create default channel and ensure it's assigned the default sink.
3326 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3327 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3328
3329 // Try resetting the default sink.
3330 channel_->SetRawAudioSink(0, nullptr);
3331 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3332
3333 // Try setting the default sink while the default stream exists.
3334 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3335 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3336
3337 // If we remove and add a default stream, it should get the same sink.
3338 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3339 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3340 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3341}
3342
skvlad7a43d252016-03-22 15:32:27 -07003343// Test that, just like the video channel, the voice channel communicates the
3344// network state to the call.
3345TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003346 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003347
3348 EXPECT_EQ(webrtc::kNetworkUp,
3349 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3350 EXPECT_EQ(webrtc::kNetworkUp,
3351 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3352
3353 channel_->OnReadyToSend(false);
3354 EXPECT_EQ(webrtc::kNetworkDown,
3355 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3356 EXPECT_EQ(webrtc::kNetworkUp,
3357 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3358
3359 channel_->OnReadyToSend(true);
3360 EXPECT_EQ(webrtc::kNetworkUp,
3361 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3362 EXPECT_EQ(webrtc::kNetworkUp,
3363 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3364}
3365
stefan658910c2015-09-03 05:48:32 -07003366// Tests that the library initializes and shuts down properly.
3367TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003368 using testing::_;
3369 using testing::AnyNumber;
3370
3371 // If the VoiceEngine wants to gather available codecs early, that's fine but
3372 // we never want it to create a decoder at this stage.
3373 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
3374 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
3375 ON_CALL(*factory.get(), GetSupportedFormats())
3376 .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
3377 EXPECT_CALL(*factory.get(), GetSupportedFormats())
3378 .Times(AnyNumber());
3379 EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
3380
3381 cricket::WebRtcVoiceEngine engine(nullptr, factory);
kwiberg686a8ef2016-02-26 03:00:35 -08003382 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003383 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003384 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3385 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003386 EXPECT_TRUE(channel != nullptr);
3387 delete channel;
solenbergff976312016-03-30 23:28:51 -07003388}
stefan658910c2015-09-03 05:48:32 -07003389
solenbergff976312016-03-30 23:28:51 -07003390// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003391TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3392 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3393 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3394 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003395 {
ossu29b1a8d2016-06-13 07:34:51 -07003396 cricket::WebRtcVoiceEngine engine(&adm, nullptr);
solenbergff976312016-03-30 23:28:51 -07003397 std::unique_ptr<webrtc::Call> call(
3398 webrtc::Call::Create(webrtc::Call::Config()));
3399 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3400 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3401 EXPECT_TRUE(channel != nullptr);
3402 delete channel;
3403 }
stefan658910c2015-09-03 05:48:32 -07003404}
3405
3406// Tests that the library is configured with the codecs we want.
ossudedfd282016-06-14 07:12:39 -07003407// TODO(ossu): This test should move into the builtin audio codecs module
3408// eventually.
stefan658910c2015-09-03 05:48:32 -07003409TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003410 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3411 // module.
3412
stefan658910c2015-09-03 05:48:32 -07003413 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003414 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003415 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003416 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003417 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003418 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003419 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003420 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003421 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003422 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003423 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003424 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003425 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003426 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003427 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003428 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003429 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003430 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003431 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003432 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003433 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003434 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003435 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003436 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003437 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003438 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003439 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003440 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003441 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003442 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003443 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003444 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003445 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003446 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003447 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003448 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003449 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003450 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003451 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003452 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003453 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003454 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003455 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003456 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003457 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003458 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003459 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003460 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003461 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003462
stefan658910c2015-09-03 05:48:32 -07003463 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossu29b1a8d2016-06-13 07:34:51 -07003464 cricket::WebRtcVoiceEngine engine(nullptr,
3465 webrtc::CreateBuiltinAudioDecoderFactory());
stefan658910c2015-09-03 05:48:32 -07003466 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossudedfd282016-06-14 07:12:39 -07003467 engine.send_codecs().begin(); it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003468 if (it->name == "CN" && it->clockrate == 16000) {
3469 EXPECT_EQ(105, it->id);
3470 } else if (it->name == "CN" && it->clockrate == 32000) {
3471 EXPECT_EQ(106, it->id);
3472 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3473 EXPECT_EQ(103, it->id);
3474 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3475 EXPECT_EQ(104, it->id);
3476 } else if (it->name == "G722" && it->clockrate == 8000) {
3477 EXPECT_EQ(9, it->id);
3478 } else if (it->name == "telephone-event") {
3479 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003480 } else if (it->name == "opus") {
3481 EXPECT_EQ(111, it->id);
3482 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3483 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003484 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3485 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3486 }
3487 }
stefan658910c2015-09-03 05:48:32 -07003488}
3489
3490// Tests that VoE supports at least 32 channels
3491TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossu29b1a8d2016-06-13 07:34:51 -07003492 cricket::WebRtcVoiceEngine engine(nullptr, nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003493 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003494 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003495
3496 cricket::VoiceMediaChannel* channels[32];
3497 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003498 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003499 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3500 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003501 if (!channel)
3502 break;
stefan658910c2015-09-03 05:48:32 -07003503 channels[num_channels++] = channel;
3504 }
3505
tfarina5237aaf2015-11-10 23:44:30 -08003506 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003507 EXPECT_EQ(expected, num_channels);
3508
3509 while (num_channels > 0) {
3510 delete channels[--num_channels];
3511 }
stefan658910c2015-09-03 05:48:32 -07003512}
3513
3514// Test that we set our preferred codecs properly.
3515TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003516 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3517 // - Check that our builtin codecs are usable by Channel.
3518 // - The codecs provided by the engine is usable by Channel.
3519 // It does not check that the codecs in the RecvParameters are actually
3520 // what we sent in - though it's probably reasonable to expect so, if
3521 // SetRecvParameters returns true.
3522 // I think it will become clear once audio decoder injection is completed.
3523 cricket::WebRtcVoiceEngine engine(
3524 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003525 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003526 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003527 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3528 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003529 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003530 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003531 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003532}