blob: fe265ed19e360ec91a1cab6d52ad5d3e7cf1eeec [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, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 engine) { // volume
64 }
65};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020066} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067
solenbergff976312016-03-30 23:28:51 -070068// Tests that our stub library "works".
69TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070070 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
71 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
72 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070073 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
75 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070076 cricket::FakeWebRtcVoiceEngine voe;
77 EXPECT_FALSE(voe.IsInited());
78 {
ossu29b1a8d2016-06-13 07:34:51 -070079 cricket::WebRtcVoiceEngine engine(&adm, nullptr, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070080 EXPECT_TRUE(voe.IsInited());
81 }
82 EXPECT_FALSE(voe.IsInited());
83}
84
deadbeef884f5852016-01-15 09:20:04 -080085class FakeAudioSink : public webrtc::AudioSinkInterface {
86 public:
87 void OnData(const Data& audio) override {}
88};
89
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080090class FakeAudioSource : public cricket::AudioSource {
91 void SetSink(Sink* sink) override {}
92};
93
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094class WebRtcVoiceEngineTestFake : public testing::Test {
95 public:
stefanba4c0e42016-02-04 04:12:24 -080096 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
97
98 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070099 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
100 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
101 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700102 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
103 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
104 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
ossu29b1a8d2016-06-13 07:34:51 -0700105 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, nullptr,
solenbergbc37fc82016-04-04 09:54:44 -0700106 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200107 send_parameters_.codecs.push_back(kPcmuCodec);
108 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109 }
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 }
solenbergff976312016-03-30 23:28:51 -0700115 bool SetupRecvStream() {
116 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700117 return false;
118 }
119 return channel_->AddRecvStream(
120 cricket::StreamParams::CreateLegacy(kSsrc1));
121 }
solenbergff976312016-03-30 23:28:51 -0700122 bool SetupSendStream() {
123 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000124 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800126 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
127 return false;
128 }
129 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000131 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700132 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700133 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800134 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700135 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700136 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800137 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000138 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700140 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000141 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200143 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000145 }
146
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100147 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
148 const auto* send_stream = call_.GetAudioSendStream(ssrc);
149 EXPECT_TRUE(send_stream);
150 return *send_stream;
151 }
152
deadbeef884f5852016-01-15 09:20:04 -0800153 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
154 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
155 EXPECT_TRUE(recv_stream);
156 return *recv_stream;
157 }
158
solenberg3a941542015-11-16 07:34:50 -0800159 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800160 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800161 }
162
solenberg7add0582015-11-20 09:59:34 -0800163 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800164 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800165 }
166
solenbergd53a3f92016-04-14 13:56:37 -0700167 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
168 ASSERT_TRUE(channel);
169 if (enable) {
170 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
171 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
172 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
173 }
174 channel->SetSend(enable);
175 }
176
Peter Boström0c4e06b2015-10-07 12:23:21 +0200177 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700178 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000179 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700180 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000181 // send stream.
182 EXPECT_TRUE(channel_->AddSendStream(
183 cricket::StreamParams::CreateLegacy(kSsrc1)));
184 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000185
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200187 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700188 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800190 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200191 send_parameters_.codecs.push_back(kTelephoneEventCodec);
192 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000193 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000194
195 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700196 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800197 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000198 EXPECT_TRUE(channel_->AddSendStream(
199 cricket::StreamParams::CreateLegacy(kSsrc1)));
200 }
201
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800203 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100205 // Test send.
206 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
207 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
208 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800209 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100210 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
211 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
212 EXPECT_EQ(2, telephone_event.event_code);
213 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000214 }
215
216 // Test that send bandwidth is set correctly.
217 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000218 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
219 // |expected_result| is the expected result from SetMaxSendBandwidth().
220 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700221 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
222 int max_bitrate,
223 bool expected_result,
224 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200225 cricket::AudioSendParameters parameters;
226 parameters.codecs.push_back(codec);
227 parameters.max_bandwidth_bps = max_bitrate;
228 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
229
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000231 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000233 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 }
235
skvlade0d46372016-04-07 22:59:22 -0700236 // Sets the per-stream maximum bitrate limit for the specified SSRC.
237 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700238 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700239 EXPECT_EQ(1UL, parameters.encodings.size());
240
241 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700242 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700243 }
244
245 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
246 cricket::AudioSendParameters send_parameters;
247 send_parameters.codecs.push_back(codec);
248 send_parameters.max_bandwidth_bps = bitrate;
249 return channel_->SetSendParameters(send_parameters);
250 }
251
252 int GetCodecBitrate(int32_t ssrc) {
253 cricket::WebRtcVoiceMediaChannel* media_channel =
254 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
255 int channel = media_channel->GetSendChannelId(ssrc);
256 EXPECT_NE(-1, channel);
257 webrtc::CodecInst codec;
258 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
259 return codec.rate;
260 }
261
262 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
263 int global_max,
264 int stream_max,
265 bool expected_result,
266 int expected_codec_bitrate) {
267 // Clear the bitrate limit from the previous test case.
268 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
269
270 // Attempt to set the requested bitrate limits.
271 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
272 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
273
274 // Verify that reading back the parameters gives results
275 // consistent with the Set() result.
276 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700277 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700278 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
279 EXPECT_EQ(expected_result ? stream_max : -1,
280 resulting_parameters.encodings[0].max_bitrate_bps);
281
282 // Verify that the codec settings have the expected bitrate.
283 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
284 }
285
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000286 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700287 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000288
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000289 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800290 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000291
292 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700293 send_parameters_.extensions.push_back(
294 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200295 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800296 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000297
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000298 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200299 send_parameters_.extensions.clear();
300 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800301 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000302
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000303 // Ensure extension is set properly.
304 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700305 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200306 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800307 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700308 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800309 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000310
solenberg7add0582015-11-20 09:59:34 -0800311 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000312 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700313 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800314 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
315 call_.GetAudioSendStream(kSsrc2));
316 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700317 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800318 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000319
320 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200321 send_parameters_.codecs.push_back(kPcmuCodec);
322 send_parameters_.extensions.clear();
323 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800324 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
325 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000326 }
327
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000328 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700329 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000330
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000331 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800332 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000333
334 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700335 recv_parameters_.extensions.push_back(
336 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800337 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
338 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000339
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000340 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800341 recv_parameters_.extensions.clear();
342 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
343 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000344
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000345 // Ensure extension is set properly.
346 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700347 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800348 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
349 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700350 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800351 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000352
solenberg7add0582015-11-20 09:59:34 -0800353 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000354 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700355 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800356 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
357 call_.GetAudioReceiveStream(kSsrc2));
358 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700359 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800360 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000361
362 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800363 recv_parameters_.extensions.clear();
364 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
365 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
366 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000367 }
368
solenberg85a04962015-10-27 03:35:21 -0700369 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
370 webrtc::AudioSendStream::Stats stats;
371 stats.local_ssrc = 12;
372 stats.bytes_sent = 345;
373 stats.packets_sent = 678;
374 stats.packets_lost = 9012;
375 stats.fraction_lost = 34.56f;
376 stats.codec_name = "codec_name_send";
377 stats.ext_seqnum = 789;
378 stats.jitter_ms = 12;
379 stats.rtt_ms = 345;
380 stats.audio_level = 678;
381 stats.aec_quality_min = 9.01f;
382 stats.echo_delay_median_ms = 234;
383 stats.echo_delay_std_ms = 567;
384 stats.echo_return_loss = 890;
385 stats.echo_return_loss_enhancement = 1234;
386 stats.typing_noise_detected = true;
387 return stats;
388 }
389 void SetAudioSendStreamStats() {
390 for (auto* s : call_.GetAudioSendStreams()) {
391 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200392 }
solenberg85a04962015-10-27 03:35:21 -0700393 }
solenberg566ef242015-11-06 15:34:49 -0800394 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
395 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700396 const auto stats = GetAudioSendStreamStats();
397 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
398 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
399 EXPECT_EQ(info.packets_sent, stats.packets_sent);
400 EXPECT_EQ(info.packets_lost, stats.packets_lost);
401 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
402 EXPECT_EQ(info.codec_name, stats.codec_name);
403 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
404 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
405 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
406 EXPECT_EQ(info.audio_level, stats.audio_level);
407 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
408 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
409 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
410 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
411 EXPECT_EQ(info.echo_return_loss_enhancement,
412 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800413 EXPECT_EQ(info.typing_noise_detected,
414 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700415 }
416
417 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
418 webrtc::AudioReceiveStream::Stats stats;
419 stats.remote_ssrc = 123;
420 stats.bytes_rcvd = 456;
421 stats.packets_rcvd = 768;
422 stats.packets_lost = 101;
423 stats.fraction_lost = 23.45f;
424 stats.codec_name = "codec_name_recv";
425 stats.ext_seqnum = 678;
426 stats.jitter_ms = 901;
427 stats.jitter_buffer_ms = 234;
428 stats.jitter_buffer_preferred_ms = 567;
429 stats.delay_estimate_ms = 890;
430 stats.audio_level = 1234;
431 stats.expand_rate = 5.67f;
432 stats.speech_expand_rate = 8.90f;
433 stats.secondary_decoded_rate = 1.23f;
434 stats.accelerate_rate = 4.56f;
435 stats.preemptive_expand_rate = 7.89f;
436 stats.decoding_calls_to_silence_generator = 12;
437 stats.decoding_calls_to_neteq = 345;
438 stats.decoding_normal = 67890;
439 stats.decoding_plc = 1234;
440 stats.decoding_cng = 5678;
441 stats.decoding_plc_cng = 9012;
442 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200443 return stats;
444 }
445 void SetAudioReceiveStreamStats() {
446 for (auto* s : call_.GetAudioReceiveStreams()) {
447 s->SetStats(GetAudioReceiveStreamStats());
448 }
449 }
450 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700451 const auto stats = GetAudioReceiveStreamStats();
452 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
453 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
454 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
455 EXPECT_EQ(info.packets_lost, stats.packets_lost);
456 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
457 EXPECT_EQ(info.codec_name, stats.codec_name);
458 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
459 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
460 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200461 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700462 stats.jitter_buffer_preferred_ms);
463 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
464 EXPECT_EQ(info.audio_level, stats.audio_level);
465 EXPECT_EQ(info.expand_rate, stats.expand_rate);
466 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
467 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
468 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
469 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200470 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700471 stats.decoding_calls_to_silence_generator);
472 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
473 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
474 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
475 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
476 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
477 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200478 }
479
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700481 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200482 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700484 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700485 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200486 cricket::AudioSendParameters send_parameters_;
487 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800488 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800489 private:
490 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491};
492
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493// Tests that we can create and destroy a channel.
494TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700495 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496}
497
solenberg31fec402016-05-06 02:13:12 -0700498// Test that we can add a send stream and that it has the correct defaults.
499TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
500 EXPECT_TRUE(SetupChannel());
501 EXPECT_TRUE(
502 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
503 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
504 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
505 EXPECT_EQ("", config.rtp.c_name);
506 EXPECT_EQ(0u, config.rtp.extensions.size());
507 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
508 config.send_transport);
509}
510
511// Test that we can add a receive stream and that it has the correct defaults.
512TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
513 EXPECT_TRUE(SetupChannel());
514 EXPECT_TRUE(
515 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
516 const webrtc::AudioReceiveStream::Config& config =
517 GetRecvStreamConfig(kSsrc1);
518 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
519 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
520 EXPECT_FALSE(config.rtp.transport_cc);
521 EXPECT_EQ(0u, config.rtp.extensions.size());
522 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
523 config.rtcp_send_transport);
524 EXPECT_EQ("", config.sync_group);
525}
526
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700528// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700529// TODO(ossu): This test should move into a separate builtin audio codecs
530// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700531TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700532 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000533 ASSERT_FALSE(codecs.empty());
534 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
535 EXPECT_EQ(48000, codecs[0].clockrate);
536 EXPECT_EQ(2, codecs[0].channels);
537 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538}
539
stefanba4c0e42016-02-04 04:12:24 -0800540TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700541 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800542 bool opus_found = false;
543 for (cricket::AudioCodec codec : codecs) {
544 if (codec.name == "opus") {
545 EXPECT_TRUE(HasTransportCc(codec));
546 opus_found = true;
547 }
548 }
549 EXPECT_TRUE(opus_found);
550}
551
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000552// Tests that we can find codecs by name or id, and that we interpret the
553// clockrate and bitrate fields properly.
554TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
555 cricket::AudioCodec codec;
556 webrtc::CodecInst codec_inst;
557 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800558 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800560 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800562 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
563 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000564 // Find ISAC with a different payload id.
565 codec = kIsacCodec;
566 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800567 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 EXPECT_EQ(codec.id, codec_inst.pltype);
569 // Find PCMU with a 0 clockrate.
570 codec = kPcmuCodec;
571 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800572 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 EXPECT_EQ(codec.id, codec_inst.pltype);
574 EXPECT_EQ(8000, codec_inst.plfreq);
575 // Find PCMU with a 0 bitrate.
576 codec = kPcmuCodec;
577 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800578 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 EXPECT_EQ(codec.id, codec_inst.pltype);
580 EXPECT_EQ(64000, codec_inst.rate);
581 // Find ISAC with an explicit bitrate.
582 codec = kIsacCodec;
583 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800584 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 EXPECT_EQ(codec.id, codec_inst.pltype);
586 EXPECT_EQ(32000, codec_inst.rate);
587}
588
589// Test that we set our inbound codecs properly, including changing PT.
590TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700591 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200592 cricket::AudioRecvParameters parameters;
593 parameters.codecs.push_back(kIsacCodec);
594 parameters.codecs.push_back(kPcmuCodec);
595 parameters.codecs.push_back(kTelephoneEventCodec);
596 parameters.codecs[0].id = 106; // collide with existing telephone-event
597 parameters.codecs[2].id = 126;
598 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700599 EXPECT_TRUE(channel_->AddRecvStream(
600 cricket::StreamParams::CreateLegacy(kSsrc1)));
601 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800603 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 gcodec.plfreq = 16000;
605 gcodec.channels = 1;
606 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
607 EXPECT_EQ(106, gcodec.pltype);
608 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800609 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 gcodec.plfreq = 8000;
611 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
612 EXPECT_EQ(126, gcodec.pltype);
613 EXPECT_STREQ("telephone-event", gcodec.plname);
614}
615
616// Test that we fail to set an unknown inbound codec.
617TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700618 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 cricket::AudioRecvParameters parameters;
620 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700621 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200622 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623}
624
625// Test that we fail if we have duplicate types in the inbound list.
626TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700627 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200628 cricket::AudioRecvParameters parameters;
629 parameters.codecs.push_back(kIsacCodec);
630 parameters.codecs.push_back(kCn16000Codec);
631 parameters.codecs[1].id = kIsacCodec.id;
632 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633}
634
635// Test that we can decode OPUS without stereo parameters.
636TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700637 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200638 cricket::AudioRecvParameters parameters;
639 parameters.codecs.push_back(kIsacCodec);
640 parameters.codecs.push_back(kPcmuCodec);
641 parameters.codecs.push_back(kOpusCodec);
642 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 EXPECT_TRUE(channel_->AddRecvStream(
644 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700645 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800647 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 // Even without stereo parameters, recv codecs still specify channels = 2.
649 EXPECT_EQ(2, opus.channels);
650 EXPECT_EQ(111, opus.pltype);
651 EXPECT_STREQ("opus", opus.plname);
652 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700653 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 EXPECT_EQ(111, opus.pltype);
655}
656
657// Test that we can decode OPUS with stereo = 0.
658TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700659 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200660 cricket::AudioRecvParameters parameters;
661 parameters.codecs.push_back(kIsacCodec);
662 parameters.codecs.push_back(kPcmuCodec);
663 parameters.codecs.push_back(kOpusCodec);
664 parameters.codecs[2].params["stereo"] = "0";
665 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 EXPECT_TRUE(channel_->AddRecvStream(
667 cricket::StreamParams::CreateLegacy(kSsrc1)));
668 int channel_num2 = voe_.GetLastChannel();
669 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800670 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 // Even when stereo is off, recv codecs still specify channels = 2.
672 EXPECT_EQ(2, opus.channels);
673 EXPECT_EQ(111, opus.pltype);
674 EXPECT_STREQ("opus", opus.plname);
675 opus.pltype = 0;
676 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
677 EXPECT_EQ(111, opus.pltype);
678}
679
680// Test that we can decode OPUS with stereo = 1.
681TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700682 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200683 cricket::AudioRecvParameters parameters;
684 parameters.codecs.push_back(kIsacCodec);
685 parameters.codecs.push_back(kPcmuCodec);
686 parameters.codecs.push_back(kOpusCodec);
687 parameters.codecs[2].params["stereo"] = "1";
688 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 EXPECT_TRUE(channel_->AddRecvStream(
690 cricket::StreamParams::CreateLegacy(kSsrc1)));
691 int channel_num2 = voe_.GetLastChannel();
692 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800693 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694 EXPECT_EQ(2, opus.channels);
695 EXPECT_EQ(111, opus.pltype);
696 EXPECT_STREQ("opus", opus.plname);
697 opus.pltype = 0;
698 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
699 EXPECT_EQ(111, opus.pltype);
700}
701
702// Test that changes to recv codecs are applied to all streams.
703TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700704 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200705 cricket::AudioRecvParameters parameters;
706 parameters.codecs.push_back(kIsacCodec);
707 parameters.codecs.push_back(kPcmuCodec);
708 parameters.codecs.push_back(kTelephoneEventCodec);
709 parameters.codecs[0].id = 106; // collide with existing telephone-event
710 parameters.codecs[2].id = 126;
711 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712 EXPECT_TRUE(channel_->AddRecvStream(
713 cricket::StreamParams::CreateLegacy(kSsrc1)));
714 int channel_num2 = voe_.GetLastChannel();
715 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800716 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 gcodec.plfreq = 16000;
718 gcodec.channels = 1;
719 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
720 EXPECT_EQ(106, gcodec.pltype);
721 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800722 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723 gcodec.plfreq = 8000;
724 gcodec.channels = 1;
725 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
726 EXPECT_EQ(126, gcodec.pltype);
727 EXPECT_STREQ("telephone-event", gcodec.plname);
728}
729
730TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700731 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200732 cricket::AudioRecvParameters parameters;
733 parameters.codecs.push_back(kIsacCodec);
734 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200735 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000736
737 int channel_num2 = voe_.GetLastChannel();
738 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800739 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 gcodec.plfreq = 16000;
741 gcodec.channels = 1;
742 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
743 EXPECT_EQ(106, gcodec.pltype);
744 EXPECT_STREQ("ISAC", gcodec.plname);
745}
746
747// Test that we can apply the same set of codecs again while playing.
748TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700749 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200750 cricket::AudioRecvParameters parameters;
751 parameters.codecs.push_back(kIsacCodec);
752 parameters.codecs.push_back(kCn16000Codec);
753 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756
757 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200758 parameters.codecs[0].id = 127;
759 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
760 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_TRUE(voe_.GetPlayout(channel_num));
762}
763
764// Test that we can add a codec while playing.
765TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700766 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200767 cricket::AudioRecvParameters parameters;
768 parameters.codecs.push_back(kIsacCodec);
769 parameters.codecs.push_back(kCn16000Codec);
770 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771 EXPECT_TRUE(channel_->SetPlayout(true));
772
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200773 parameters.codecs.push_back(kOpusCodec);
774 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
775 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_TRUE(voe_.GetPlayout(channel_num));
777 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800778 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
780}
781
782TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700783 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000785 // Test that when autobw is enabled, bitrate is kept as the default
786 // value. autobw is enabled for the following tests because the target
787 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788
789 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700790 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
792 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700793 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700796 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797}
798
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000799TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700800 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000802 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803
804 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700805 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
806 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
807 // Rates above the max (56000) should be capped.
808 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700811 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
812 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
813 // Rates above the max (510000) should be capped.
814 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815}
816
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000817TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700818 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000819
820 // Test that we can only set a maximum bitrate for a fixed-rate codec
821 // if it's bigger than the fixed rate.
822
823 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700824 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
825 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
826 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
827 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
828 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
829 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
830 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000831}
832
833TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700834 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835 const int kDesiredBitrate = 128000;
836 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700837 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200838 parameters.max_bandwidth_bps = kDesiredBitrate;
839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000840
841 EXPECT_TRUE(channel_->AddSendStream(
842 cricket::StreamParams::CreateLegacy(kSsrc1)));
843
844 int channel_num = voe_.GetLastChannel();
845 webrtc::CodecInst codec;
846 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200847 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000848}
849
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000850// Test that bitrate cannot be set for CBR codecs.
851// Bitrate is ignored if it is higher than the fixed bitrate.
852// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000853TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700854 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855
856 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
858 int channel_num = voe_.GetLastChannel();
859 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
861 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200862
863 send_parameters_.max_bandwidth_bps = 128000;
864 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
866 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200867
868 send_parameters_.max_bandwidth_bps = 128;
869 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
871 EXPECT_EQ(64000, codec.rate);
872}
873
skvlade0d46372016-04-07 22:59:22 -0700874// Test that the per-stream bitrate limit and the global
875// bitrate limit both apply.
876TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
877 EXPECT_TRUE(SetupSendStream());
878
879 // opus, default bitrate == 64000.
880 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
881 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
882 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
883 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
884
885 // CBR codecs allow both maximums to exceed the bitrate.
886 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
887 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
888 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
889 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
890
891 // CBR codecs don't allow per stream maximums to be too low.
892 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
893 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
894}
895
896// Test that an attempt to set RtpParameters for a stream that does not exist
897// fails.
898TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
899 EXPECT_TRUE(SetupChannel());
900 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700901 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700902 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
903
904 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700905 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700906}
907
908TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700909 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700910 // This test verifies that setting RtpParameters succeeds only if
911 // the structure contains exactly one encoding.
912 // TODO(skvlad): Update this test when we start supporting setting parameters
913 // for each encoding individually.
914
915 EXPECT_TRUE(SetupSendStream());
916 // Setting RtpParameters with no encoding is expected to fail.
917 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700918 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700919 // Setting RtpParameters with exactly one encoding should succeed.
920 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700921 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700922 // Two or more encodings should result in failure.
923 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700924 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700925}
926
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700927// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700928// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700929TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
930 EXPECT_TRUE(SetupSendStream());
931 SetSend(channel_, true);
932 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
933 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700934 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700935 ASSERT_EQ(1u, parameters.encodings.size());
936 ASSERT_TRUE(parameters.encodings[0].active);
937 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700938 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700939 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
940
941 // Now change it back to active and verify we resume sending.
942 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700943 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700944 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
945}
946
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700947// Test that SetRtpSendParameters configures the correct encoding channel for
948// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700949TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
950 SetupForMultiSendStream();
951 // Create send streams.
952 for (uint32_t ssrc : kSsrcs4) {
953 EXPECT_TRUE(
954 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
955 }
956 // Configure one stream to be limited by the stream config, another to be
957 // limited by the global max, and the third one with no per-stream limit
958 // (still subject to the global limit).
959 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
960 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
961 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
962 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
963
964 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
965 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
966 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
967
968 // Remove the global cap; the streams should switch to their respective
969 // maximums (or remain unchanged if there was no other limit on them.)
970 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
971 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
972 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
973 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
974}
975
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700976// Test that GetRtpSendParameters returns the currently configured codecs.
977TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700978 EXPECT_TRUE(SetupSendStream());
979 cricket::AudioSendParameters parameters;
980 parameters.codecs.push_back(kIsacCodec);
981 parameters.codecs.push_back(kPcmuCodec);
982 EXPECT_TRUE(channel_->SetSendParameters(parameters));
983
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700984 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700985 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700986 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
987 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700988}
989
990// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700991TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700992 EXPECT_TRUE(SetupSendStream());
993 cricket::AudioSendParameters parameters;
994 parameters.codecs.push_back(kIsacCodec);
995 parameters.codecs.push_back(kPcmuCodec);
996 EXPECT_TRUE(channel_->SetSendParameters(parameters));
997
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700998 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700999
1000 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001001 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001002
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001003 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1004 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1005 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1006}
1007
1008// Test that GetRtpReceiveParameters returns the currently configured codecs.
1009TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1010 EXPECT_TRUE(SetupRecvStream());
1011 cricket::AudioRecvParameters parameters;
1012 parameters.codecs.push_back(kIsacCodec);
1013 parameters.codecs.push_back(kPcmuCodec);
1014 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1015
1016 webrtc::RtpParameters rtp_parameters =
1017 channel_->GetRtpReceiveParameters(kSsrc1);
1018 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1019 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1020 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1021}
1022
1023// Test that if we set/get parameters multiple times, we get the same results.
1024TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1025 EXPECT_TRUE(SetupRecvStream());
1026 cricket::AudioRecvParameters parameters;
1027 parameters.codecs.push_back(kIsacCodec);
1028 parameters.codecs.push_back(kPcmuCodec);
1029 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1030
1031 webrtc::RtpParameters initial_params =
1032 channel_->GetRtpReceiveParameters(kSsrc1);
1033
1034 // We should be able to set the params we just got.
1035 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1036
1037 // ... And this shouldn't change the params returned by
1038 // GetRtpReceiveParameters.
1039 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1040 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001041}
1042
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043// Test that we apply codecs properly.
1044TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001045 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001046 cricket::AudioSendParameters parameters;
1047 parameters.codecs.push_back(kIsacCodec);
1048 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001049 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001050 parameters.codecs[0].id = 96;
1051 parameters.codecs[0].bitrate = 48000;
1052 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001053 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001054 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001055 webrtc::CodecInst gcodec;
1056 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1057 EXPECT_EQ(96, gcodec.pltype);
1058 EXPECT_EQ(48000, gcodec.rate);
1059 EXPECT_STREQ("ISAC", gcodec.plname);
1060 EXPECT_FALSE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001061 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1062 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001063 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001064}
1065
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001066// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1067// to apply.
1068TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001069 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 cricket::AudioSendParameters parameters;
1071 parameters.codecs.push_back(kIsacCodec);
1072 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001073 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001074 parameters.codecs[0].id = 96;
1075 parameters.codecs[0].bitrate = 48000;
1076 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001077 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1078 // Calling SetSendCodec again with same codec which is already set.
1079 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001081 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1082}
1083
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001084// Verify that G722 is set with 16000 samples per second to WebRTC.
1085TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001086 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001087 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001088 cricket::AudioSendParameters parameters;
1089 parameters.codecs.push_back(kG722CodecSdp);
1090 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001091 webrtc::CodecInst gcodec;
1092 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1093 EXPECT_STREQ("G722", gcodec.plname);
1094 EXPECT_EQ(1, gcodec.channels);
1095 EXPECT_EQ(16000, gcodec.plfreq);
1096}
1097
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001098// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001100 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001101 cricket::AudioSendParameters parameters;
1102 parameters.codecs.push_back(kOpusCodec);
1103 parameters.codecs[0].bitrate = 0;
1104 parameters.codecs[0].clockrate = 50000;
1105 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106}
1107
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001108// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001110 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001111 cricket::AudioSendParameters parameters;
1112 parameters.codecs.push_back(kOpusCodec);
1113 parameters.codecs[0].bitrate = 0;
1114 parameters.codecs[0].channels = 0;
1115 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116}
1117
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001118// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001120 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001121 cricket::AudioSendParameters parameters;
1122 parameters.codecs.push_back(kOpusCodec);
1123 parameters.codecs[0].bitrate = 0;
1124 parameters.codecs[0].channels = 0;
1125 parameters.codecs[0].params["stereo"] = "1";
1126 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127}
1128
1129// Test that if channel is 1 for opus and there's no stereo, we fail.
1130TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001131 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001132 cricket::AudioSendParameters parameters;
1133 parameters.codecs.push_back(kOpusCodec);
1134 parameters.codecs[0].bitrate = 0;
1135 parameters.codecs[0].channels = 1;
1136 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137}
1138
1139// Test that if channel is 1 for opus and stereo=0, we fail.
1140TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001141 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001142 cricket::AudioSendParameters parameters;
1143 parameters.codecs.push_back(kOpusCodec);
1144 parameters.codecs[0].bitrate = 0;
1145 parameters.codecs[0].channels = 1;
1146 parameters.codecs[0].params["stereo"] = "0";
1147 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148}
1149
1150// Test that if channel is 1 for opus and stereo=1, we fail.
1151TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001152 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001153 cricket::AudioSendParameters parameters;
1154 parameters.codecs.push_back(kOpusCodec);
1155 parameters.codecs[0].bitrate = 0;
1156 parameters.codecs[0].channels = 1;
1157 parameters.codecs[0].params["stereo"] = "1";
1158 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159}
1160
1161// Test that with bitrate=0 and no stereo,
1162// channels and bitrate are 1 and 32000.
1163TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001164 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001166 cricket::AudioSendParameters parameters;
1167 parameters.codecs.push_back(kOpusCodec);
1168 parameters.codecs[0].bitrate = 0;
1169 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 webrtc::CodecInst gcodec;
1171 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1172 EXPECT_STREQ("opus", gcodec.plname);
1173 EXPECT_EQ(1, gcodec.channels);
1174 EXPECT_EQ(32000, gcodec.rate);
1175}
1176
1177// Test that with bitrate=0 and stereo=0,
1178// channels and bitrate are 1 and 32000.
1179TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001180 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001181 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001182 cricket::AudioSendParameters parameters;
1183 parameters.codecs.push_back(kOpusCodec);
1184 parameters.codecs[0].bitrate = 0;
1185 parameters.codecs[0].params["stereo"] = "0";
1186 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187 webrtc::CodecInst gcodec;
1188 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1189 EXPECT_STREQ("opus", gcodec.plname);
1190 EXPECT_EQ(1, gcodec.channels);
1191 EXPECT_EQ(32000, gcodec.rate);
1192}
1193
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001194// Test that with bitrate=invalid and stereo=0,
1195// channels and bitrate are 1 and 32000.
1196TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001197 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001198 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001199 cricket::AudioSendParameters parameters;
1200 parameters.codecs.push_back(kOpusCodec);
1201 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001202 webrtc::CodecInst gcodec;
1203
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001204 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001205 parameters.codecs[0].bitrate = 5999;
1206 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001207 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1208 EXPECT_STREQ("opus", gcodec.plname);
1209 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001210 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001211
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001212 parameters.codecs[0].bitrate = 510001;
1213 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001214 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1215 EXPECT_STREQ("opus", gcodec.plname);
1216 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001217 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001218}
1219
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220// Test that with bitrate=0 and stereo=1,
1221// channels and bitrate are 2 and 64000.
1222TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001223 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 cricket::AudioSendParameters parameters;
1226 parameters.codecs.push_back(kOpusCodec);
1227 parameters.codecs[0].bitrate = 0;
1228 parameters.codecs[0].params["stereo"] = "1";
1229 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230 webrtc::CodecInst gcodec;
1231 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1232 EXPECT_STREQ("opus", gcodec.plname);
1233 EXPECT_EQ(2, gcodec.channels);
1234 EXPECT_EQ(64000, gcodec.rate);
1235}
1236
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001237// Test that with bitrate=invalid and stereo=1,
1238// channels and bitrate are 2 and 64000.
1239TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001240 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001241 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001242 cricket::AudioSendParameters parameters;
1243 parameters.codecs.push_back(kOpusCodec);
1244 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001245 webrtc::CodecInst gcodec;
1246
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001247 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001248 parameters.codecs[0].bitrate = 5999;
1249 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001250 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1251 EXPECT_STREQ("opus", gcodec.plname);
1252 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001253 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001254
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001255 parameters.codecs[0].bitrate = 510001;
1256 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001257 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1258 EXPECT_STREQ("opus", gcodec.plname);
1259 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001260 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001261}
1262
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263// Test that with bitrate=N and stereo unset,
1264// channels and bitrate are 1 and N.
1265TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001266 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001267 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001268 cricket::AudioSendParameters parameters;
1269 parameters.codecs.push_back(kOpusCodec);
1270 parameters.codecs[0].bitrate = 96000;
1271 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272 webrtc::CodecInst gcodec;
1273 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1274 EXPECT_EQ(111, gcodec.pltype);
1275 EXPECT_EQ(96000, gcodec.rate);
1276 EXPECT_STREQ("opus", gcodec.plname);
1277 EXPECT_EQ(1, gcodec.channels);
1278 EXPECT_EQ(48000, gcodec.plfreq);
1279}
1280
1281// Test that with bitrate=N and stereo=0,
1282// channels and bitrate are 1 and N.
1283TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001284 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001285 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001286 cricket::AudioSendParameters parameters;
1287 parameters.codecs.push_back(kOpusCodec);
1288 parameters.codecs[0].bitrate = 30000;
1289 parameters.codecs[0].params["stereo"] = "0";
1290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 webrtc::CodecInst gcodec;
1292 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1293 EXPECT_EQ(1, gcodec.channels);
1294 EXPECT_EQ(30000, gcodec.rate);
1295 EXPECT_STREQ("opus", gcodec.plname);
1296}
1297
1298// Test that with bitrate=N and without any parameters,
1299// channels and bitrate are 1 and N.
1300TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001301 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001302 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001303 cricket::AudioSendParameters parameters;
1304 parameters.codecs.push_back(kOpusCodec);
1305 parameters.codecs[0].bitrate = 30000;
1306 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307 webrtc::CodecInst gcodec;
1308 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1309 EXPECT_EQ(1, gcodec.channels);
1310 EXPECT_EQ(30000, gcodec.rate);
1311 EXPECT_STREQ("opus", gcodec.plname);
1312}
1313
1314// Test that with bitrate=N and stereo=1,
1315// channels and bitrate are 2 and N.
1316TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001317 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001318 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 cricket::AudioSendParameters parameters;
1320 parameters.codecs.push_back(kOpusCodec);
1321 parameters.codecs[0].bitrate = 30000;
1322 parameters.codecs[0].params["stereo"] = "1";
1323 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324 webrtc::CodecInst gcodec;
1325 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1326 EXPECT_EQ(2, gcodec.channels);
1327 EXPECT_EQ(30000, gcodec.rate);
1328 EXPECT_STREQ("opus", gcodec.plname);
1329}
1330
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001331// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1332// Also test that the "maxaveragebitrate" can't be set to values outside the
1333// range of 6000 and 510000
1334TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001335 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001336 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001337 cricket::AudioSendParameters parameters;
1338 parameters.codecs.push_back(kOpusCodec);
1339 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001340 webrtc::CodecInst gcodec;
1341
1342 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1344 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001346 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001347
1348 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001349 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1350 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001351 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001352 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001353
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001354 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1355 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001356 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1357 EXPECT_EQ(200000, gcodec.rate);
1358}
1359
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001360// Test that we can enable NACK with opus as caller.
1361TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001362 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 cricket::AudioSendParameters parameters;
1364 parameters.codecs.push_back(kOpusCodec);
1365 parameters.codecs[0].AddFeedbackParam(
1366 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1367 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001368 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001369 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001370 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371}
1372
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001373// Test that we can enable NACK with opus as callee.
1374TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001375 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001376 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001377 cricket::AudioSendParameters parameters;
1378 parameters.codecs.push_back(kOpusCodec);
1379 parameters.codecs[0].AddFeedbackParam(
1380 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1381 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001382 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001383 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001384 // NACK should be enabled even with no send stream.
1385 EXPECT_TRUE(voe_.GetNACK(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001386
1387 EXPECT_TRUE(channel_->AddSendStream(
1388 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001389 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001390}
1391
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001392// Test that we can enable NACK on receive streams.
1393TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001394 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001395 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1396 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].AddFeedbackParam(
1400 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1401 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001402 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001403 EXPECT_FALSE(voe_.GetNACK(channel_num2));
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);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001406 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1407}
1408
1409// Test that we can disable NACK.
1410TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001411 EXPECT_TRUE(SetupSendStream());
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());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001429 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1430 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001431 cricket::AudioSendParameters parameters;
1432 parameters.codecs.push_back(kOpusCodec);
1433 parameters.codecs[0].AddFeedbackParam(
1434 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1435 cricket::kParamValueEmpty));
1436 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001437 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001438 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1439
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001440 parameters.codecs.clear();
1441 parameters.codecs.push_back(kOpusCodec);
1442 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001443 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001444 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1445}
1446
1447// Test that NACK is enabled on a new receive stream.
1448TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001449 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001450 cricket::AudioSendParameters parameters;
1451 parameters.codecs.push_back(kIsacCodec);
1452 parameters.codecs.push_back(kCn16000Codec);
1453 parameters.codecs[0].AddFeedbackParam(
1454 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1455 cricket::kParamValueEmpty));
1456 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001457 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458
1459 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
solenberg971cab02016-06-14 10:02:41 -07001460 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001461 EXPECT_TRUE(voe_.GetNACK(channel_num));
1462 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1463 channel_num = voe_.GetLastChannel();
1464 EXPECT_TRUE(voe_.GetNACK(channel_num));
1465}
1466
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001467// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001468TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001469 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001470 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001471 cricket::AudioSendParameters parameters;
1472 parameters.codecs.push_back(kOpusCodec);
1473 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001474 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1475}
1476
1477// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001478TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001479 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001480 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001481 cricket::AudioSendParameters parameters;
1482 parameters.codecs.push_back(kOpusCodec);
1483 parameters.codecs[0].bitrate = 0;
1484 parameters.codecs[0].params["useinbandfec"] = "0";
1485 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001486 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1487 webrtc::CodecInst gcodec;
1488 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1489 EXPECT_STREQ("opus", gcodec.plname);
1490 EXPECT_EQ(1, gcodec.channels);
1491 EXPECT_EQ(32000, gcodec.rate);
1492}
1493
1494// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001495TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001496 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001497 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001498 cricket::AudioSendParameters parameters;
1499 parameters.codecs.push_back(kOpusCodec);
1500 parameters.codecs[0].bitrate = 0;
1501 parameters.codecs[0].params["useinbandfec"] = "1";
1502 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001503 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1504 webrtc::CodecInst gcodec;
1505 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1506 EXPECT_STREQ("opus", gcodec.plname);
1507 EXPECT_EQ(1, gcodec.channels);
1508 EXPECT_EQ(32000, gcodec.rate);
1509}
1510
1511// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001512TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001513 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001514 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 cricket::AudioSendParameters parameters;
1516 parameters.codecs.push_back(kOpusCodec);
1517 parameters.codecs[0].bitrate = 0;
1518 parameters.codecs[0].params["stereo"] = "1";
1519 parameters.codecs[0].params["useinbandfec"] = "1";
1520 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001521 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1522 webrtc::CodecInst gcodec;
1523 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1524 EXPECT_STREQ("opus", gcodec.plname);
1525 EXPECT_EQ(2, gcodec.channels);
1526 EXPECT_EQ(64000, gcodec.rate);
1527}
1528
1529// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001530TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001531 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001532 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001533 cricket::AudioSendParameters parameters;
1534 parameters.codecs.push_back(kIsacCodec);
1535 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001536 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1537}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001538
1539// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1540TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001541 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001542 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001543 cricket::AudioSendParameters parameters;
1544 parameters.codecs.push_back(kIsacCodec);
1545 parameters.codecs[0].params["useinbandfec"] = "1";
1546 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001547 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1548}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001549
1550// Test that Opus FEC status can be changed.
1551TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001552 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001553 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001554 cricket::AudioSendParameters parameters;
1555 parameters.codecs.push_back(kOpusCodec);
1556 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001557 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001558 parameters.codecs[0].params["useinbandfec"] = "1";
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1561}
1562
stefanba4c0e42016-02-04 04:12:24 -08001563TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001564 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001565 cricket::AudioSendParameters send_parameters;
1566 send_parameters.codecs.push_back(kOpusCodec);
1567 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1568 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1569
1570 cricket::AudioRecvParameters recv_parameters;
1571 recv_parameters.codecs.push_back(kIsacCodec);
1572 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1573 EXPECT_TRUE(
1574 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1575 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1576 EXPECT_FALSE(
1577 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1578
ossudedfd282016-06-14 07:12:39 -07001579 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001580 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1581 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1582 EXPECT_TRUE(
1583 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1584}
1585
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001586// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1587TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001588 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001589 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001590 cricket::AudioSendParameters parameters;
1591 parameters.codecs.push_back(kOpusCodec);
1592 parameters.codecs[0].bitrate = 0;
1593 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1594 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001595 EXPECT_EQ(cricket::kOpusBandwidthNb,
1596 voe_.GetMaxEncodingBandwidth(channel_num));
1597 webrtc::CodecInst gcodec;
1598 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1599 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001600
1601 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001602 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1603 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001604 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1605 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001606}
1607
1608// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1609TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001610 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001611 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001612 cricket::AudioSendParameters parameters;
1613 parameters.codecs.push_back(kOpusCodec);
1614 parameters.codecs[0].bitrate = 0;
1615 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1616 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001617 EXPECT_EQ(cricket::kOpusBandwidthMb,
1618 voe_.GetMaxEncodingBandwidth(channel_num));
1619 webrtc::CodecInst gcodec;
1620 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1621 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001622
1623 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001624 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1625 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001626 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1627 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001628}
1629
1630// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1631TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001632 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001633 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001634 cricket::AudioSendParameters parameters;
1635 parameters.codecs.push_back(kOpusCodec);
1636 parameters.codecs[0].bitrate = 0;
1637 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1638 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001639 EXPECT_EQ(cricket::kOpusBandwidthWb,
1640 voe_.GetMaxEncodingBandwidth(channel_num));
1641 webrtc::CodecInst gcodec;
1642 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1643 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001644
1645 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001646 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1647 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001648 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1649 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001650}
1651
1652// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1653TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001654 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001655 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001656 cricket::AudioSendParameters parameters;
1657 parameters.codecs.push_back(kOpusCodec);
1658 parameters.codecs[0].bitrate = 0;
1659 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1660 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001661 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1662 voe_.GetMaxEncodingBandwidth(channel_num));
1663 webrtc::CodecInst gcodec;
1664 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1665 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001666
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001667 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001668 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1669 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001670 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1671 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001672}
1673
1674// Test 24000 < maxplaybackrate triggers Opus full band mode.
1675TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001676 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001677 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001678 cricket::AudioSendParameters parameters;
1679 parameters.codecs.push_back(kOpusCodec);
1680 parameters.codecs[0].bitrate = 0;
1681 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1682 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001683 EXPECT_EQ(cricket::kOpusBandwidthFb,
1684 voe_.GetMaxEncodingBandwidth(channel_num));
1685 webrtc::CodecInst gcodec;
1686 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1687 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001688
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001689 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001690 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1691 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001692 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1693 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001694}
1695
1696// Test Opus that without maxplaybackrate, default playback rate is used.
1697TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001698 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001699 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001700 cricket::AudioSendParameters parameters;
1701 parameters.codecs.push_back(kOpusCodec);
1702 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001703 EXPECT_EQ(cricket::kOpusBandwidthFb,
1704 voe_.GetMaxEncodingBandwidth(channel_num));
1705}
1706
1707// Test the with non-Opus, maxplaybackrate has no effect.
1708TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001709 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001710 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 cricket::AudioSendParameters parameters;
1712 parameters.codecs.push_back(kIsacCodec);
1713 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1714 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001715 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1716}
1717
1718// Test maxplaybackrate can be set on two streams.
1719TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001720 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001721 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001722 cricket::AudioSendParameters parameters;
1723 parameters.codecs.push_back(kOpusCodec);
1724 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001725 // Default bandwidth is 24000.
1726 EXPECT_EQ(cricket::kOpusBandwidthFb,
1727 voe_.GetMaxEncodingBandwidth(channel_num));
1728
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001729 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001730
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001731 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001732 EXPECT_EQ(cricket::kOpusBandwidthNb,
1733 voe_.GetMaxEncodingBandwidth(channel_num));
1734
1735 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1736 channel_num = voe_.GetLastChannel();
1737 EXPECT_EQ(cricket::kOpusBandwidthNb,
1738 voe_.GetMaxEncodingBandwidth(channel_num));
1739}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001740
Minyue Li7100dcd2015-03-27 05:05:59 +01001741// Test that with usedtx=0, Opus DTX is off.
1742TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001743 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001744 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001745 cricket::AudioSendParameters parameters;
1746 parameters.codecs.push_back(kOpusCodec);
1747 parameters.codecs[0].params["usedtx"] = "0";
1748 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001749 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1750}
1751
1752// Test that with usedtx=1, Opus DTX is on.
1753TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001754 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001755 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001756 cricket::AudioSendParameters parameters;
1757 parameters.codecs.push_back(kOpusCodec);
1758 parameters.codecs[0].params["usedtx"] = "1";
1759 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001760 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1761 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1762}
1763
1764// Test that usedtx=1 works with stereo Opus.
1765TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001766 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001767 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001768 cricket::AudioSendParameters parameters;
1769 parameters.codecs.push_back(kOpusCodec);
1770 parameters.codecs[0].params["usedtx"] = "1";
1771 parameters.codecs[0].params["stereo"] = "1";
1772 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001773 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1774 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1775}
1776
1777// Test that usedtx=1 does not work with non Opus.
1778TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001779 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001780 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001781 cricket::AudioSendParameters parameters;
1782 parameters.codecs.push_back(kIsacCodec);
1783 parameters.codecs[0].params["usedtx"] = "1";
1784 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001785 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1786}
1787
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001788// Test that we can switch back and forth between Opus and ISAC with CN.
1789TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001790 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001792 cricket::AudioSendParameters opus_parameters;
1793 opus_parameters.codecs.push_back(kOpusCodec);
1794 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795 webrtc::CodecInst gcodec;
1796 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001797 EXPECT_EQ(111, gcodec.pltype);
1798 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001800 cricket::AudioSendParameters isac_parameters;
1801 isac_parameters.codecs.push_back(kIsacCodec);
1802 isac_parameters.codecs.push_back(kCn16000Codec);
1803 isac_parameters.codecs.push_back(kOpusCodec);
1804 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1806 EXPECT_EQ(103, gcodec.pltype);
1807 EXPECT_STREQ("ISAC", gcodec.plname);
1808
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001809 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001811 EXPECT_EQ(111, gcodec.pltype);
1812 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813}
1814
1815// Test that we handle various ways of specifying bitrate.
1816TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001817 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001819 cricket::AudioSendParameters parameters;
1820 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1821 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001822 webrtc::CodecInst gcodec;
1823 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1824 EXPECT_EQ(103, gcodec.pltype);
1825 EXPECT_STREQ("ISAC", gcodec.plname);
1826 EXPECT_EQ(32000, gcodec.rate);
1827
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001828 parameters.codecs[0].bitrate = 0; // bitrate == default
1829 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001830 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1831 EXPECT_EQ(103, gcodec.pltype);
1832 EXPECT_STREQ("ISAC", gcodec.plname);
1833 EXPECT_EQ(-1, gcodec.rate);
1834
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001835 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1836 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1838 EXPECT_EQ(103, gcodec.pltype);
1839 EXPECT_STREQ("ISAC", gcodec.plname);
1840 EXPECT_EQ(28000, gcodec.rate);
1841
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001842 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1843 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001844 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1845 EXPECT_EQ(0, gcodec.pltype);
1846 EXPECT_STREQ("PCMU", gcodec.plname);
1847 EXPECT_EQ(64000, gcodec.rate);
1848
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001849 parameters.codecs[0].bitrate = 0; // bitrate == default
1850 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1852 EXPECT_EQ(0, gcodec.pltype);
1853 EXPECT_STREQ("PCMU", gcodec.plname);
1854 EXPECT_EQ(64000, gcodec.rate);
1855
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001856 parameters.codecs[0] = kOpusCodec;
1857 parameters.codecs[0].bitrate = 0; // bitrate == default
1858 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001859 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1860 EXPECT_EQ(111, gcodec.pltype);
1861 EXPECT_STREQ("opus", gcodec.plname);
1862 EXPECT_EQ(32000, gcodec.rate);
1863}
1864
Brave Yao5225dd82015-03-26 07:39:19 +08001865// Test that we could set packet size specified in kCodecParamPTime.
1866TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001867 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001868 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001869 cricket::AudioSendParameters parameters;
1870 parameters.codecs.push_back(kOpusCodec);
1871 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1872 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001873 webrtc::CodecInst gcodec;
1874 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1875 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1876
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001877 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1878 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001879 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1880 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1881
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001882 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1883 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001884 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1885 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1886
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001887 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1888 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1889 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001890 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1891 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1892
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001893 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1894 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1895 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001896 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1897 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1898}
1899
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001900// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001901TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001902 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001903 cricket::AudioSendParameters parameters;
1904 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001905}
1906
1907// Test that we can set send codecs even with telephone-event codec as the first
1908// one on the list.
1909TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001910 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001912 cricket::AudioSendParameters parameters;
1913 parameters.codecs.push_back(kTelephoneEventCodec);
1914 parameters.codecs.push_back(kIsacCodec);
1915 parameters.codecs.push_back(kPcmuCodec);
1916 parameters.codecs[0].id = 98; // DTMF
1917 parameters.codecs[1].id = 96;
1918 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 webrtc::CodecInst gcodec;
1920 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001921 EXPECT_EQ(96, gcodec.pltype);
1922 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001923 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001924}
1925
solenberg31642aa2016-03-14 08:00:37 -07001926// Test that payload type range is limited for telephone-event codec.
1927TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001928 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001929 cricket::AudioSendParameters parameters;
1930 parameters.codecs.push_back(kTelephoneEventCodec);
1931 parameters.codecs.push_back(kIsacCodec);
1932 parameters.codecs[0].id = 0; // DTMF
1933 parameters.codecs[1].id = 96;
1934 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1935 EXPECT_TRUE(channel_->CanInsertDtmf());
1936 parameters.codecs[0].id = 128; // DTMF
1937 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1938 EXPECT_FALSE(channel_->CanInsertDtmf());
1939 parameters.codecs[0].id = 127;
1940 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1941 EXPECT_TRUE(channel_->CanInsertDtmf());
1942 parameters.codecs[0].id = -1; // DTMF
1943 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1944 EXPECT_FALSE(channel_->CanInsertDtmf());
1945}
1946
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001947// Test that we can set send codecs even with CN codec as the first
1948// one on the list.
1949TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001950 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001951 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001952 cricket::AudioSendParameters parameters;
1953 parameters.codecs.push_back(kCn16000Codec);
1954 parameters.codecs.push_back(kIsacCodec);
1955 parameters.codecs.push_back(kPcmuCodec);
1956 parameters.codecs[0].id = 98; // wideband CN
1957 parameters.codecs[1].id = 96;
1958 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001959 webrtc::CodecInst gcodec;
1960 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1961 EXPECT_EQ(96, gcodec.pltype);
1962 EXPECT_STREQ("ISAC", gcodec.plname);
1963 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964}
1965
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001966// Test that we set VAD and DTMF types correctly as caller.
1967TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001968 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001970 cricket::AudioSendParameters parameters;
1971 parameters.codecs.push_back(kIsacCodec);
1972 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001974 parameters.codecs.push_back(kCn16000Codec);
1975 parameters.codecs.push_back(kCn8000Codec);
1976 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001977 parameters.codecs[0].id = 96;
1978 parameters.codecs[2].id = 97; // wideband CN
1979 parameters.codecs[4].id = 98; // DTMF
1980 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001981 webrtc::CodecInst gcodec;
1982 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1983 EXPECT_EQ(96, gcodec.pltype);
1984 EXPECT_STREQ("ISAC", gcodec.plname);
1985 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001986 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1987 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001988 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001989}
1990
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001991// Test that we set VAD and DTMF types correctly as callee.
1992TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001993 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001994 cricket::AudioSendParameters parameters;
1995 parameters.codecs.push_back(kIsacCodec);
1996 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001997 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001998 parameters.codecs.push_back(kCn16000Codec);
1999 parameters.codecs.push_back(kCn8000Codec);
2000 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002001 parameters.codecs[0].id = 96;
2002 parameters.codecs[2].id = 97; // wideband CN
2003 parameters.codecs[4].id = 98; // DTMF
2004 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002005 EXPECT_TRUE(channel_->AddSendStream(
2006 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002007 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002008
2009 webrtc::CodecInst gcodec;
2010 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2011 EXPECT_EQ(96, gcodec.pltype);
2012 EXPECT_STREQ("ISAC", gcodec.plname);
2013 EXPECT_TRUE(voe_.GetVAD(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002014 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2015 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002016 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002017}
2018
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002019// Test that we only apply VAD if we have a CN codec that matches the
2020// send codec clockrate.
2021TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002022 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002023 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002024 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002025 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002026 parameters.codecs.push_back(kIsacCodec);
2027 parameters.codecs.push_back(kCn16000Codec);
2028 parameters.codecs[1].id = 97;
2029 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002030 webrtc::CodecInst gcodec;
2031 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2032 EXPECT_STREQ("ISAC", gcodec.plname);
2033 EXPECT_TRUE(voe_.GetVAD(channel_num));
2034 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2035 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002036 parameters.codecs[0] = kPcmuCodec;
2037 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002038 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2039 EXPECT_STREQ("PCMU", gcodec.plname);
2040 EXPECT_FALSE(voe_.GetVAD(channel_num));
2041 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002042 parameters.codecs[1] = kCn8000Codec;
2043 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002044 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2045 EXPECT_STREQ("PCMU", gcodec.plname);
2046 EXPECT_TRUE(voe_.GetVAD(channel_num));
2047 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002048 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002049 parameters.codecs[0] = kIsacCodec;
2050 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2052 EXPECT_STREQ("ISAC", gcodec.plname);
2053 EXPECT_FALSE(voe_.GetVAD(channel_num));
2054}
2055
2056// Test that we perform case-insensitive matching of codec names.
2057TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002058 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002059 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002060 cricket::AudioSendParameters parameters;
2061 parameters.codecs.push_back(kIsacCodec);
2062 parameters.codecs.push_back(kPcmuCodec);
2063 parameters.codecs.push_back(kCn16000Codec);
2064 parameters.codecs.push_back(kCn8000Codec);
2065 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002066 parameters.codecs[0].name = "iSaC";
2067 parameters.codecs[0].id = 96;
2068 parameters.codecs[2].id = 97; // wideband CN
2069 parameters.codecs[4].id = 98; // DTMF
2070 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002071 webrtc::CodecInst gcodec;
2072 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2073 EXPECT_EQ(96, gcodec.pltype);
2074 EXPECT_STREQ("ISAC", gcodec.plname);
2075 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002076 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2077 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002078 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079}
2080
stefanba4c0e42016-02-04 04:12:24 -08002081class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2082 public:
2083 WebRtcVoiceEngineWithSendSideBweTest()
2084 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2085};
2086
2087TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2088 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002089 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002090 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002091 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2092 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2093 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002094 extension.id);
2095 return;
2096 }
2097 }
2098 FAIL() << "Transport sequence number extension not in header-extension list.";
2099}
2100
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002101// Test support for audio level header extension.
2102TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002103 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002104}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002105TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002106 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002107}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002108
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002109// Test support for absolute send time header extension.
2110TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002111 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002112}
2113TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002114 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002115}
2116
solenberg1ac56142015-10-13 03:58:19 -07002117// Test that we can create a channel and start sending on it.
2118TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002119 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002120 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002121 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002122 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002123 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002124 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2125}
2126
2127// Test that a channel will send if and only if it has a source and is enabled
2128// for sending.
2129TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002130 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002131 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2132 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002133 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002134 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2135 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2136 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2137 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2138 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002139}
2140
solenberg6d6e7c52016-04-13 09:07:30 -07002141// Test that SetSendParameters() does not alter a stream's send state.
2142TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2143 EXPECT_TRUE(SetupSendStream());
2144 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2145
2146 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002147 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002148 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2149
2150 // Changing RTP header extensions will recreate the AudioSendStream.
2151 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002152 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002153 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2154 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2155
2156 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002157 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002158 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2159
2160 // Changing RTP header extensions will recreate the AudioSendStream.
2161 send_parameters_.extensions.clear();
2162 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2163 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2164}
2165
solenberg1ac56142015-10-13 03:58:19 -07002166// Test that we can create a channel and start playing out on it.
2167TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002168 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002169 int channel_num = voe_.GetLastChannel();
2170 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2171 EXPECT_TRUE(channel_->SetPlayout(true));
2172 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 EXPECT_TRUE(channel_->SetPlayout(false));
2174 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2175}
2176
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002177// Test that we can add and remove send streams.
2178TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2179 SetupForMultiSendStream();
2180
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002181 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002182 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002183
solenbergc96df772015-10-21 13:01:53 -07002184 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002185 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002186 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002187 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002188 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002189 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002190 }
tfarina5237aaf2015-11-10 23:44:30 -08002191 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002192
solenbergc96df772015-10-21 13:01:53 -07002193 // Delete the send streams.
2194 for (uint32_t ssrc : kSsrcs4) {
2195 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002196 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002197 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002198 }
solenbergc96df772015-10-21 13:01:53 -07002199 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002200}
2201
2202// Test SetSendCodecs correctly configure the codecs in all send streams.
2203TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2204 SetupForMultiSendStream();
2205
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002206 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002207 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002208 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002209 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002210 }
2211
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002212 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002214 parameters.codecs.push_back(kIsacCodec);
2215 parameters.codecs.push_back(kCn16000Codec);
2216 parameters.codecs[1].id = 97;
2217 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002218
2219 // Verify ISAC and VAD are corrected configured on all send channels.
2220 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002221 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002222 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002223 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2224 EXPECT_STREQ("ISAC", gcodec.plname);
2225 EXPECT_TRUE(voe_.GetVAD(channel_num));
2226 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2227 }
2228
2229 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002230 parameters.codecs[0] = kPcmuCodec;
2231 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002232 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002233 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002234 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2235 EXPECT_STREQ("PCMU", gcodec.plname);
2236 EXPECT_FALSE(voe_.GetVAD(channel_num));
2237 }
2238}
2239
2240// Test we can SetSend on all send streams correctly.
2241TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2242 SetupForMultiSendStream();
2243
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002244 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002245 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002246 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002247 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002248 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2249 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002250 }
2251
2252 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002253 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002254 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002255 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002256 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002257 }
2258
2259 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002260 SetSend(channel_, false);
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 stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002263 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264 }
2265}
2266
2267// Test we can set the correct statistics on all send streams.
2268TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2269 SetupForMultiSendStream();
2270
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002272 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002273 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002274 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002275 }
solenberg85a04962015-10-27 03:35:21 -07002276
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002277 // Create a receive stream to check that none of the send streams end up in
2278 // the receive stream stats.
2279 EXPECT_TRUE(channel_->AddRecvStream(
2280 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg971cab02016-06-14 10:02:41 -07002281
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002283 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2284 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002285 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002286
solenberg85a04962015-10-27 03:35:21 -07002287 // Check stats for the added streams.
2288 {
2289 cricket::VoiceMediaInfo info;
2290 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002291
solenberg85a04962015-10-27 03:35:21 -07002292 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002293 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002294 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002295 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002296 }
2297
2298 // We have added one receive stream. We should see empty stats.
2299 EXPECT_EQ(info.receivers.size(), 1u);
2300 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002301 }
solenberg1ac56142015-10-13 03:58:19 -07002302
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002303 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002304 {
2305 cricket::VoiceMediaInfo info;
2306 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2307 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002308 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002309 EXPECT_EQ(0u, info.receivers.size());
2310 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002311
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002312 // Deliver a new packet - a default receive stream should be created and we
2313 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002314 {
2315 cricket::VoiceMediaInfo info;
2316 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2317 SetAudioReceiveStreamStats();
2318 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002319 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002320 EXPECT_EQ(1u, info.receivers.size());
2321 VerifyVoiceReceiverInfo(info.receivers[0]);
2322 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002323}
2324
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002325// Test that we can add and remove receive streams, and do proper send/playout.
2326// We can receive on multiple streams while sending one stream.
2327TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002328 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002329 int channel_num1 = voe_.GetLastChannel();
2330
solenberg1ac56142015-10-13 03:58:19 -07002331 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002332 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002333 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002334 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335
solenberg1ac56142015-10-13 03:58:19 -07002336 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002337 EXPECT_TRUE(
2338 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002340 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002341 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342
solenberg1ac56142015-10-13 03:58:19 -07002343 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2345 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2346
2347 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002348 EXPECT_TRUE(
2349 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350 int channel_num3 = voe_.GetLastChannel();
2351 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2352 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2353 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354
2355 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002356 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002357 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358
2359 // Stop playout.
2360 EXPECT_TRUE(channel_->SetPlayout(false));
2361 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2362 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2363 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2364
solenberg1ac56142015-10-13 03:58:19 -07002365 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366 EXPECT_TRUE(channel_->SetPlayout(true));
2367 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2368 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2369 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2370
solenberg1ac56142015-10-13 03:58:19 -07002371 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2373 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002374 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375}
2376
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002378// and start sending on it.
2379TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002380 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002381 cricket::AudioOptions options_adjust_agc;
2382 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383 webrtc::AgcConfig agc_config;
2384 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2385 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002386 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002387 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002388 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002389 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2391 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002392 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002393 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002394 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395}
2396
wu@webrtc.org97077a32013-10-25 21:18:33 +00002397TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002398 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002399 EXPECT_CALL(adm_,
2400 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002401 webrtc::AgcConfig agc_config;
2402 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2403 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002404 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2405 send_parameters_.options.tx_agc_digital_compression_gain =
2406 rtc::Optional<uint16_t>(9);
2407 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2408 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2409 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002410 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2411 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2412 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2413 EXPECT_TRUE(agc_config.limiterEnable);
2414
2415 // Check interaction with adjust_agc_delta. Both should be respected, for
2416 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002417 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2418 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002419 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2420 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2421}
2422
wu@webrtc.org97077a32013-10-25 21:18:33 +00002423TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002424 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002425 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2426 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002427 send_parameters_.options.recording_sample_rate =
2428 rtc::Optional<uint32_t>(48000);
2429 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2430 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002431}
2432
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002434// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002435TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002436 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002437 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002438}
2439
2440TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2441 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002442 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002443 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002444 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002445 EXPECT_TRUE(channel_->AddRecvStream(
2446 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002447 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2448 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002449 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450
solenberg85a04962015-10-27 03:35:21 -07002451 // Check stats for the added streams.
2452 {
2453 cricket::VoiceMediaInfo info;
2454 EXPECT_EQ(true, channel_->GetStats(&info));
2455
2456 // We have added one send stream. We should see the stats we've set.
2457 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002458 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002459 // We have added one receive stream. We should see empty stats.
2460 EXPECT_EQ(info.receivers.size(), 1u);
2461 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2462 }
solenberg1ac56142015-10-13 03:58:19 -07002463
solenberg566ef242015-11-06 15:34:49 -08002464 // Start sending - this affects some reported stats.
2465 {
2466 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002467 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002468 EXPECT_EQ(true, channel_->GetStats(&info));
2469 VerifyVoiceSenderInfo(info.senders[0], true);
2470 }
2471
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002472 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002473 {
2474 cricket::VoiceMediaInfo info;
2475 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2476 EXPECT_EQ(true, channel_->GetStats(&info));
2477 EXPECT_EQ(1u, info.senders.size());
2478 EXPECT_EQ(0u, info.receivers.size());
2479 }
solenberg1ac56142015-10-13 03:58:19 -07002480
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002481 // Deliver a new packet - a default receive stream should be created and we
2482 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002483 {
2484 cricket::VoiceMediaInfo info;
2485 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2486 SetAudioReceiveStreamStats();
2487 EXPECT_EQ(true, channel_->GetStats(&info));
2488 EXPECT_EQ(1u, info.senders.size());
2489 EXPECT_EQ(1u, info.receivers.size());
2490 VerifyVoiceReceiverInfo(info.receivers[0]);
2491 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492}
2493
2494// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002495// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002497 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002498 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002499 EXPECT_TRUE(channel_->AddRecvStream(
2500 cricket::StreamParams::CreateLegacy(kSsrc2)));
2501 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002502}
2503
2504// Test that the local SSRC is the same on sending and receiving channels if the
2505// receive channel is created before the send channel.
2506TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002507 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2509 int receive_channel_num = voe_.GetLastChannel();
2510 EXPECT_TRUE(channel_->AddSendStream(
2511 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512
solenberg3a941542015-11-16 07:34:50 -08002513 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002514 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
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());
solenberg7e63ef02015-11-20 00:19:43 -08002520 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(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;
2533 EXPECT_TRUE(channel_->AddRecvStream(
2534 cricket::StreamParams::CreateLegacy(ssrc1)));
2535 EXPECT_TRUE(channel_->AddRecvStream(
2536 cricket::StreamParams::CreateLegacy(ssrc2)));
2537 EXPECT_TRUE(channel_->AddRecvStream(
2538 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002540 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002541 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002542 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002543 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 }
mflodman3d7db262016-04-29 00:57:13 -07002545
2546 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2547 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2548 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2549
2550 EXPECT_EQ(s1.received_packets(), 0);
2551 EXPECT_EQ(s2.received_packets(), 0);
2552 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002553
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002554 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002555 EXPECT_EQ(s1.received_packets(), 0);
2556 EXPECT_EQ(s2.received_packets(), 0);
2557 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002558
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002560 EXPECT_EQ(s1.received_packets(), 1);
2561 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2562 EXPECT_EQ(s2.received_packets(), 0);
2563 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002564
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002565 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002566 EXPECT_EQ(s1.received_packets(), 1);
2567 EXPECT_EQ(s2.received_packets(), 1);
2568 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2569 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002570
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002572 EXPECT_EQ(s1.received_packets(), 1);
2573 EXPECT_EQ(s2.received_packets(), 1);
2574 EXPECT_EQ(s3.received_packets(), 1);
2575 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002576
mflodman3d7db262016-04-29 00:57:13 -07002577 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2578 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2579 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580}
2581
solenberg7e63ef02015-11-20 00:19:43 -08002582// Test that receiving on an unsignalled stream works (default channel will be
2583// created).
2584TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002585 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002586 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2587
solenberg7e63ef02015-11-20 00:19:43 -08002588 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002589
2590 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2591 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2592 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002593}
2594
2595// Test that receiving on an unsignalled stream works (default channel will be
2596// created), and that packets will be forwarded to the default channel
2597// regardless of their SSRCs.
2598TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002599 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002600 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002601 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2602
mflodman3d7db262016-04-29 00:57:13 -07002603 // Note that ssrc = 0 is not supported.
2604 uint32_t ssrc = 1;
2605 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002606 rtc::SetBE32(&packet[8], ssrc);
2607 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002608
2609 // Verify we only have one default stream.
2610 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2611 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2612 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002613 }
mflodman3d7db262016-04-29 00:57:13 -07002614
2615 // Sending the same ssrc again should not create a new stream.
2616 --ssrc;
2617 DeliverPacket(packet, sizeof(packet));
2618 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2619 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2620 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002621}
2622
2623// Test that a default channel is created even after a signalled stream has been
2624// added, and that this stream will get any packets for unknown SSRCs.
2625TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002626 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002627 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002628 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2629
2630 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002631 const uint32_t signaled_ssrc = 1;
2632 rtc::SetBE32(&packet[8], signaled_ssrc);
2633 EXPECT_TRUE(channel_->AddRecvStream(
2634 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002635 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002636 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2637 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002638
2639 // Note that the first unknown SSRC cannot be 0, because we only support
2640 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002641 const uint32_t unsignaled_ssrc = 7011;
2642 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002643 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002644 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2645 packet, sizeof(packet)));
2646 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2647
2648 DeliverPacket(packet, sizeof(packet));
2649 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2650
2651 rtc::SetBE32(&packet[8], signaled_ssrc);
2652 DeliverPacket(packet, sizeof(packet));
2653 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2654 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002655}
2656
solenberg0a617e22015-10-20 15:49:38 -07002657// Test that we properly handle failures to add a receive stream.
2658TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002659 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002662}
2663
solenberg0a617e22015-10-20 15:49:38 -07002664// Test that we properly handle failures to add a send stream.
2665TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002666 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002667 voe_.set_fail_create_channel(true);
2668 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2669}
2670
solenberg1ac56142015-10-13 03:58:19 -07002671// Test that AddRecvStream creates new stream.
2672TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002673 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674 int channel_num = voe_.GetLastChannel();
2675 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002676 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677}
2678
2679// Test that after adding a recv stream, we do not decode more codecs than
2680// those previously passed into SetRecvCodecs.
2681TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002682 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002683 cricket::AudioRecvParameters parameters;
2684 parameters.codecs.push_back(kIsacCodec);
2685 parameters.codecs.push_back(kPcmuCodec);
2686 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687 EXPECT_TRUE(channel_->AddRecvStream(
2688 cricket::StreamParams::CreateLegacy(kSsrc1)));
2689 int channel_num2 = voe_.GetLastChannel();
2690 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002691 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002692 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693 gcodec.channels = 2;
2694 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2695}
2696
2697// Test that we properly clean up any streams that were added, even if
2698// not explicitly removed.
2699TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002700 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002701 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2703 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2704 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2705 delete channel_;
2706 channel_ = NULL;
2707 EXPECT_EQ(0, voe_.GetNumChannels());
2708}
2709
wu@webrtc.org78187522013-10-07 23:32:02 +00002710TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002711 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002712 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2713}
2714
2715TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002716 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002717 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002718 // Manually delete channel to simulate a failure.
2719 int channel = voe_.GetLastChannel();
2720 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2721 // Add recv stream 2 should work.
2722 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002723 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002724 EXPECT_NE(channel, new_channel);
2725 // The last created channel is deleted too.
2726 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002727}
2728
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002729// Test the InsertDtmf on default send stream as caller.
2730TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2731 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732}
2733
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002734// Test the InsertDtmf on default send stream as callee
2735TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2736 TestInsertDtmf(0, false);
2737}
2738
2739// Test the InsertDtmf on specified send stream as caller.
2740TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2741 TestInsertDtmf(kSsrc1, true);
2742}
2743
2744// Test the InsertDtmf on specified send stream as callee.
2745TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2746 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747}
2748
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002749TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002750 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002751 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002752 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002753 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2754 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2755 EXPECT_TRUE(channel_->SetPlayout(true));
2756 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2757 EXPECT_TRUE(channel_->SetPlayout(false));
2758 EXPECT_FALSE(channel_->SetPlayout(true));
2759}
2760
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002761TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002762 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002763 EXPECT_CALL(adm_,
2764 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2765 EXPECT_CALL(adm_,
2766 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2767 EXPECT_CALL(adm_,
2768 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769 bool ec_enabled;
2770 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002771 webrtc::AecmModes aecm_mode;
2772 bool cng_enabled;
2773 bool agc_enabled;
2774 webrtc::AgcModes agc_mode;
2775 webrtc::AgcConfig agc_config;
2776 bool ns_enabled;
2777 webrtc::NsModes ns_mode;
2778 bool highpass_filter_enabled;
2779 bool stereo_swapping_enabled;
2780 bool typing_detection_enabled;
2781 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002782 voe_.GetAecmMode(aecm_mode, cng_enabled);
2783 voe_.GetAgcStatus(agc_enabled, agc_mode);
2784 voe_.GetAgcConfig(agc_config);
2785 voe_.GetNsStatus(ns_enabled, ns_mode);
2786 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2787 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2788 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2789 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002790 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002791 EXPECT_FALSE(cng_enabled);
2792 EXPECT_TRUE(agc_enabled);
2793 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2794 EXPECT_TRUE(ns_enabled);
2795 EXPECT_TRUE(highpass_filter_enabled);
2796 EXPECT_FALSE(stereo_swapping_enabled);
2797 EXPECT_TRUE(typing_detection_enabled);
2798 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2799 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002800 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2801 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002802
solenberg246b8172015-12-08 09:50:23 -08002803 // Nothing set in AudioOptions, so everything should be as default.
2804 send_parameters_.options = cricket::AudioOptions();
2805 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002806 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807 voe_.GetAecmMode(aecm_mode, cng_enabled);
2808 voe_.GetAgcStatus(agc_enabled, agc_mode);
2809 voe_.GetAgcConfig(agc_config);
2810 voe_.GetNsStatus(ns_enabled, ns_mode);
2811 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2812 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2813 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2814 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002815 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002816 EXPECT_FALSE(cng_enabled);
2817 EXPECT_TRUE(agc_enabled);
2818 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2819 EXPECT_TRUE(ns_enabled);
2820 EXPECT_TRUE(highpass_filter_enabled);
2821 EXPECT_FALSE(stereo_swapping_enabled);
2822 EXPECT_TRUE(typing_detection_enabled);
2823 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2824 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002825 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2826 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827
2828 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002829 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2830 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002831 voe_.GetEcStatus(ec_enabled, ec_mode);
2832 EXPECT_FALSE(ec_enabled);
2833
2834 // Turn echo cancellation back on, with settings, and make sure
2835 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002836 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2837 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002838 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002839 voe_.GetAecmMode(aecm_mode, cng_enabled);
2840 voe_.GetAgcStatus(agc_enabled, agc_mode);
2841 voe_.GetAgcConfig(agc_config);
2842 voe_.GetNsStatus(ns_enabled, ns_mode);
2843 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2844 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2845 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2846 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002847 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002848 EXPECT_TRUE(agc_enabled);
2849 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2850 EXPECT_TRUE(ns_enabled);
2851 EXPECT_TRUE(highpass_filter_enabled);
2852 EXPECT_FALSE(stereo_swapping_enabled);
2853 EXPECT_TRUE(typing_detection_enabled);
2854 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2855 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2856
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002857 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2858 // control.
solenberg246b8172015-12-08 09:50:23 -08002859 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2860 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002861 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002862 voe_.GetAecmMode(aecm_mode, cng_enabled);
2863 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002864 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002865 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2866
2867 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002868 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2869 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2870 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2871 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002872 voe_.GetEcStatus(ec_enabled, ec_mode);
2873 EXPECT_FALSE(ec_enabled);
2874 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002875 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2876 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002877 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002878 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002879 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002880 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2881
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002882 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002883 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2884 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885 voe_.GetAgcStatus(agc_enabled, agc_mode);
2886 EXPECT_FALSE(agc_enabled);
2887
2888 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002889 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2890 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2891 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002892 voe_.GetAgcStatus(agc_enabled, agc_mode);
2893 EXPECT_TRUE(agc_enabled);
2894 voe_.GetAgcConfig(agc_config);
2895 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2896
2897 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002898 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2899 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2900 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2901 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2902 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903 voe_.GetNsStatus(ns_enabled, ns_mode);
2904 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2905 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2906 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2907 EXPECT_FALSE(ns_enabled);
2908 EXPECT_FALSE(highpass_filter_enabled);
2909 EXPECT_FALSE(typing_detection_enabled);
2910 EXPECT_TRUE(stereo_swapping_enabled);
2911
solenberg1ac56142015-10-13 03:58:19 -07002912 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002913 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002914 voe_.GetEcStatus(ec_enabled, ec_mode);
2915 voe_.GetNsStatus(ns_enabled, ns_mode);
2916 EXPECT_TRUE(ec_enabled);
2917 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2918 EXPECT_FALSE(ns_enabled);
2919 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2920}
2921
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002922TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002923 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002924
2925 bool ec_enabled;
2926 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927 bool agc_enabled;
2928 webrtc::AgcModes agc_mode;
2929 bool ns_enabled;
2930 webrtc::NsModes ns_mode;
2931 bool highpass_filter_enabled;
2932 bool stereo_swapping_enabled;
2933 bool typing_detection_enabled;
2934
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002936 voe_.GetAgcStatus(agc_enabled, agc_mode);
2937 voe_.GetNsStatus(ns_enabled, ns_mode);
2938 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2939 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2940 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2941 EXPECT_TRUE(ec_enabled);
2942 EXPECT_TRUE(agc_enabled);
2943 EXPECT_TRUE(ns_enabled);
2944 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002945 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002947}
2948
2949TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2950 webrtc::AgcConfig set_config = {0};
2951 set_config.targetLeveldBOv = 3;
2952 set_config.digitalCompressionGaindB = 9;
2953 set_config.limiterEnable = true;
2954 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002955
2956 webrtc::AgcConfig config = {0};
2957 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2958 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2959 EXPECT_EQ(set_config.digitalCompressionGaindB,
2960 config.digitalCompressionGaindB);
2961 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2962}
2963
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002964TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002965 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002966 EXPECT_CALL(adm_,
2967 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2968 EXPECT_CALL(adm_,
2969 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2970 EXPECT_CALL(adm_,
2971 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2972
kwiberg686a8ef2016-02-26 03:00:35 -08002973 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002974 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002975 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002976 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002977 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002978 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002979
2980 // Have to add a stream to make SetSend work.
2981 cricket::StreamParams stream1;
2982 stream1.ssrcs.push_back(1);
2983 channel1->AddSendStream(stream1);
2984 cricket::StreamParams stream2;
2985 stream2.ssrcs.push_back(2);
2986 channel2->AddSendStream(stream2);
2987
2988 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002989 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002990 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2991 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2992 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002993 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2994 EXPECT_EQ(parameters_options_all.options, channel1->options());
2995 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2996 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002997
2998 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002999 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003000 parameters_options_no_ns.options.noise_suppression =
3001 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003002 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3003 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003004 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3005 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3006 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003007 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003008
3009 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003010 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003011 parameters_options_no_agc.options.auto_gain_control =
3012 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003013 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003014 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3015 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3016 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003017 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018
solenberg246b8172015-12-08 09:50:23 -08003019 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003020 bool ec_enabled;
3021 webrtc::EcModes ec_mode;
3022 bool agc_enabled;
3023 webrtc::AgcModes agc_mode;
3024 bool ns_enabled;
3025 webrtc::NsModes ns_mode;
3026 voe_.GetEcStatus(ec_enabled, ec_mode);
3027 voe_.GetAgcStatus(agc_enabled, agc_mode);
3028 voe_.GetNsStatus(ns_enabled, ns_mode);
3029 EXPECT_TRUE(ec_enabled);
3030 EXPECT_TRUE(agc_enabled);
3031 EXPECT_TRUE(ns_enabled);
3032
solenbergd53a3f92016-04-14 13:56:37 -07003033 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003034 voe_.GetEcStatus(ec_enabled, ec_mode);
3035 voe_.GetAgcStatus(agc_enabled, agc_mode);
3036 voe_.GetNsStatus(ns_enabled, ns_mode);
3037 EXPECT_TRUE(ec_enabled);
3038 EXPECT_TRUE(agc_enabled);
3039 EXPECT_FALSE(ns_enabled);
3040
solenbergd53a3f92016-04-14 13:56:37 -07003041 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003042 voe_.GetEcStatus(ec_enabled, ec_mode);
3043 voe_.GetAgcStatus(agc_enabled, agc_mode);
3044 voe_.GetNsStatus(ns_enabled, ns_mode);
3045 EXPECT_TRUE(ec_enabled);
3046 EXPECT_FALSE(agc_enabled);
3047 EXPECT_TRUE(ns_enabled);
3048
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003049 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003050 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003051 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3052 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003053 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003054 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003055 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003056 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003057 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003058 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003059 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3060 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3061 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003062 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003063 voe_.GetEcStatus(ec_enabled, ec_mode);
3064 voe_.GetAgcStatus(agc_enabled, agc_mode);
3065 voe_.GetNsStatus(ns_enabled, ns_mode);
3066 EXPECT_TRUE(ec_enabled);
3067 EXPECT_FALSE(agc_enabled);
3068 EXPECT_FALSE(ns_enabled);
3069}
3070
wu@webrtc.orgde305012013-10-31 15:40:38 +00003071// This test verifies DSCP settings are properly applied on voice media channel.
3072TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003073 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003074 cricket::FakeNetworkInterface network_interface;
3075 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003076 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003077
solenbergbc37fc82016-04-04 09:54:44 -07003078 channel.reset(
3079 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003080 channel->SetInterface(&network_interface);
3081 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3082 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3083
3084 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003085 channel.reset(
3086 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003087 channel->SetInterface(&network_interface);
3088 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3089
3090 // Verify that setting the option to false resets the
3091 // DiffServCodePoint.
3092 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003093 channel.reset(
3094 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003095 channel->SetInterface(&network_interface);
3096 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3097 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3098
3099 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003100}
3101
solenberg1ac56142015-10-13 03:58:19 -07003102TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003103 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003104 cricket::WebRtcVoiceMediaChannel* media_channel =
3105 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003106 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3107 EXPECT_TRUE(channel_->AddRecvStream(
3108 cricket::StreamParams::CreateLegacy(kSsrc1)));
3109 int channel_id = voe_.GetLastChannel();
3110 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3111 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3112 EXPECT_TRUE(channel_->AddRecvStream(
3113 cricket::StreamParams::CreateLegacy(kSsrc2)));
3114 int channel_id2 = voe_.GetLastChannel();
3115 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003116}
3117
solenberg1ac56142015-10-13 03:58:19 -07003118TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003119 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003120 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003121 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3122 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3123 EXPECT_TRUE(channel_->AddSendStream(
3124 cricket::StreamParams::CreateLegacy(kSsrc1)));
3125 int channel_id = voe_.GetLastChannel();
3126 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3127 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3128 EXPECT_TRUE(channel_->AddSendStream(
3129 cricket::StreamParams::CreateLegacy(kSsrc2)));
3130 int channel_id2 = voe_.GetLastChannel();
3131 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003132}
3133
solenberg4bac9c52015-10-09 02:32:53 -07003134TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003135 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003136 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003137 cricket::StreamParams stream;
3138 stream.ssrcs.push_back(kSsrc2);
3139 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003140 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003141 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003142 float scale = 0;
3143 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3144 EXPECT_DOUBLE_EQ(3, scale);
3145}
3146
3147TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003148 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003149 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3150 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3151 int channel_id = voe_.GetLastChannel();
3152 float scale = 0;
3153 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3154 EXPECT_DOUBLE_EQ(2, scale);
3155 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003156 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003157 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003158}
3159
pbos8fc7fa72015-07-15 08:02:58 -07003160TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003161 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003162 const std::string kSyncLabel = "AvSyncLabel";
3163
solenbergff976312016-03-30 23:28:51 -07003164 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003165 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3166 sp.sync_label = kSyncLabel;
3167 // Creating two channels to make sure that sync label is set properly for both
3168 // the default voice channel and following ones.
3169 EXPECT_TRUE(channel_->AddRecvStream(sp));
3170 sp.ssrcs[0] += 1;
3171 EXPECT_TRUE(channel_->AddRecvStream(sp));
3172
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003173 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003174 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003175 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003176 << "SyncGroup should be set based on sync_label";
3177 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003178 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003179 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003180}
3181
solenberg3a941542015-11-16 07:34:50 -08003182// TODO(solenberg): Remove, once recv streams are configured through Call.
3183// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003184TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003185 // Test that setting the header extensions results in the expected state
3186 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003187 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003188 ssrcs.push_back(223);
3189 ssrcs.push_back(224);
3190
solenbergff976312016-03-30 23:28:51 -07003191 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003192 cricket::WebRtcVoiceMediaChannel* media_channel =
3193 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003194 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003195 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003196 EXPECT_TRUE(media_channel->AddRecvStream(
3197 cricket::StreamParams::CreateLegacy(ssrc)));
3198 }
3199
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003200 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003201 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003202 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003203 EXPECT_NE(nullptr, s);
3204 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3205 }
3206
3207 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003208 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003209 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003210 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003211 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003212 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003213 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003214 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003215 EXPECT_NE(nullptr, s);
3216 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003217 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3218 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003219 for (const auto& s_ext : s_exts) {
3220 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003221 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003222 }
3223 }
3224 }
3225 }
3226
3227 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003228 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003229 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003230 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003231 EXPECT_NE(nullptr, s);
3232 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3233 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003234}
3235
3236TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3237 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003238 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003239 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003240 static const unsigned char kRtcp[] = {
3241 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3242 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3245 };
jbaucheec21bd2016-03-20 06:15:43 -07003246 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003247
solenbergff976312016-03-30 23:28:51 -07003248 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003249 cricket::WebRtcVoiceMediaChannel* media_channel =
3250 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003251 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003252 EXPECT_TRUE(media_channel->AddRecvStream(
3253 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3254
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003255 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003256 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003257 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003258 EXPECT_EQ(0, s->received_packets());
3259 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3260 EXPECT_EQ(1, s->received_packets());
3261 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3262 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003263}
Minyue2013aec2015-05-13 14:14:42 +02003264
solenberg0a617e22015-10-20 15:49:38 -07003265// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003266// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003267TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003268 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003269 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003270 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003271 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3272 int recv_ch = voe_.GetLastChannel();
3273 EXPECT_NE(recv_ch, default_channel);
3274 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3275 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3276 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003277 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3278 recv_ch = voe_.GetLastChannel();
3279 EXPECT_NE(recv_ch, default_channel);
3280 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003281}
3282
3283TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003284 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003285 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003286
3287 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3288 int recv_ch = voe_.GetLastChannel();
3289
3290 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3291 int send_ch = voe_.GetLastChannel();
3292
3293 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3294 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3295 // channel of |recv_ch|.This is not a common case, since, normally, only the
3296 // default channel can be associated. However, the default is not deletable.
3297 // So we force the |recv_ch| to associate with a non-default channel.
3298 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3299 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3300
3301 EXPECT_TRUE(channel_->RemoveSendStream(2));
3302 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3303}
stefan658910c2015-09-03 05:48:32 -07003304
deadbeef884f5852016-01-15 09:20:04 -08003305TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003306 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003307 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3308 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003309
3310 // Setting the sink before a recv stream exists should do nothing.
3311 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3312 EXPECT_TRUE(
3313 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3314 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3315
3316 // Now try actually setting the sink.
3317 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3318 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3319
3320 // Now try resetting it.
3321 channel_->SetRawAudioSink(kSsrc1, nullptr);
3322 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3323}
3324
3325TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003326 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003327 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3328 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003329
3330 // Should be able to set a default sink even when no stream exists.
3331 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3332
3333 // Create default channel and ensure it's assigned the default sink.
3334 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3335 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3336
3337 // Try resetting the default sink.
3338 channel_->SetRawAudioSink(0, nullptr);
3339 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3340
3341 // Try setting the default sink while the default stream exists.
3342 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3343 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3344
3345 // If we remove and add a default stream, it should get the same sink.
3346 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3347 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3348 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3349}
3350
skvlad7a43d252016-03-22 15:32:27 -07003351// Test that, just like the video channel, the voice channel communicates the
3352// network state to the call.
3353TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003354 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003355
3356 EXPECT_EQ(webrtc::kNetworkUp,
3357 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3358 EXPECT_EQ(webrtc::kNetworkUp,
3359 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3360
3361 channel_->OnReadyToSend(false);
3362 EXPECT_EQ(webrtc::kNetworkDown,
3363 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3364 EXPECT_EQ(webrtc::kNetworkUp,
3365 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3366
3367 channel_->OnReadyToSend(true);
3368 EXPECT_EQ(webrtc::kNetworkUp,
3369 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3370 EXPECT_EQ(webrtc::kNetworkUp,
3371 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3372}
3373
stefan658910c2015-09-03 05:48:32 -07003374// Tests that the library initializes and shuts down properly.
3375TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003376 using testing::_;
3377 using testing::AnyNumber;
3378
3379 // If the VoiceEngine wants to gather available codecs early, that's fine but
3380 // we never want it to create a decoder at this stage.
3381 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
3382 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
3383 ON_CALL(*factory.get(), GetSupportedFormats())
3384 .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
3385 EXPECT_CALL(*factory.get(), GetSupportedFormats())
3386 .Times(AnyNumber());
3387 EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
3388
3389 cricket::WebRtcVoiceEngine engine(nullptr, factory);
kwiberg686a8ef2016-02-26 03:00:35 -08003390 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003391 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003392 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3393 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003394 EXPECT_TRUE(channel != nullptr);
3395 delete channel;
solenbergff976312016-03-30 23:28:51 -07003396}
stefan658910c2015-09-03 05:48:32 -07003397
solenbergff976312016-03-30 23:28:51 -07003398// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003399TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3400 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3401 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3402 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003403 {
ossu29b1a8d2016-06-13 07:34:51 -07003404 cricket::WebRtcVoiceEngine engine(&adm, nullptr);
solenbergff976312016-03-30 23:28:51 -07003405 std::unique_ptr<webrtc::Call> call(
3406 webrtc::Call::Create(webrtc::Call::Config()));
3407 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3408 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3409 EXPECT_TRUE(channel != nullptr);
3410 delete channel;
3411 }
stefan658910c2015-09-03 05:48:32 -07003412}
3413
3414// Tests that the library is configured with the codecs we want.
ossudedfd282016-06-14 07:12:39 -07003415// TODO(ossu): This test should move into the builtin audio codecs module
3416// eventually.
stefan658910c2015-09-03 05:48:32 -07003417TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003418 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3419 // module.
3420
stefan658910c2015-09-03 05:48:32 -07003421 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003422 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003423 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003424 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003425 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003426 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003427 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003428 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003429 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003430 cricket::AudioCodec(96, "ILBC", 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, "iLBC", 8000, 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, "PCMU", 8000, 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, "PCMA", 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, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003439 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003440 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003441 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003442 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003443 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003444 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003445 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003446 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003447 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003448 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003449 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003450 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003451 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003452 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003453 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003454 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003455 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003456 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003457 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003458 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003459 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003460 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003461 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003462 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003463 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003464 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003465 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003466 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003467 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003468 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003469 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003470
stefan658910c2015-09-03 05:48:32 -07003471 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossu29b1a8d2016-06-13 07:34:51 -07003472 cricket::WebRtcVoiceEngine engine(nullptr,
3473 webrtc::CreateBuiltinAudioDecoderFactory());
stefan658910c2015-09-03 05:48:32 -07003474 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossudedfd282016-06-14 07:12:39 -07003475 engine.send_codecs().begin(); it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003476 if (it->name == "CN" && it->clockrate == 16000) {
3477 EXPECT_EQ(105, it->id);
3478 } else if (it->name == "CN" && it->clockrate == 32000) {
3479 EXPECT_EQ(106, it->id);
3480 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3481 EXPECT_EQ(103, it->id);
3482 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3483 EXPECT_EQ(104, it->id);
3484 } else if (it->name == "G722" && it->clockrate == 8000) {
3485 EXPECT_EQ(9, it->id);
3486 } else if (it->name == "telephone-event") {
3487 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003488 } else if (it->name == "opus") {
3489 EXPECT_EQ(111, it->id);
3490 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3491 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003492 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3493 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3494 }
3495 }
stefan658910c2015-09-03 05:48:32 -07003496}
3497
3498// Tests that VoE supports at least 32 channels
3499TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossu29b1a8d2016-06-13 07:34:51 -07003500 cricket::WebRtcVoiceEngine engine(nullptr, nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003501 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003502 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003503
3504 cricket::VoiceMediaChannel* channels[32];
3505 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003506 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003507 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3508 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003509 if (!channel)
3510 break;
stefan658910c2015-09-03 05:48:32 -07003511 channels[num_channels++] = channel;
3512 }
3513
tfarina5237aaf2015-11-10 23:44:30 -08003514 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003515 EXPECT_EQ(expected, num_channels);
3516
3517 while (num_channels > 0) {
3518 delete channels[--num_channels];
3519 }
stefan658910c2015-09-03 05:48:32 -07003520}
3521
3522// Test that we set our preferred codecs properly.
3523TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003524 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3525 // - Check that our builtin codecs are usable by Channel.
3526 // - The codecs provided by the engine is usable by Channel.
3527 // It does not check that the codecs in the RecvParameters are actually
3528 // what we sent in - though it's probably reasonable to expect so, if
3529 // SetRecvParameters returns true.
3530 // I think it will become clear once audio decoder injection is completed.
3531 cricket::WebRtcVoiceEngine engine(
3532 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003533 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003534 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003535 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3536 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003537 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003538 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003539 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003540}