blob: 331e6250ce0a5d6e3c86c3817e37fccfe88442df [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);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
44const cricket::AudioCodec kTelephoneEventCodec(106,
45 "telephone-event",
46 8000,
47 0,
48 1);
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080050const uint32_t kSsrc2 = 2;
51const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070052const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053
54class FakeVoEWrapper : public cricket::VoEWrapper {
55 public:
56 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
57 : cricket::VoEWrapper(engine, // processing
58 engine, // base
59 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 engine) { // volume
63 }
64};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
solenbergff976312016-03-30 23:28:51 -070067// Tests that our stub library "works".
68TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070069 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
70 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
71 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070072 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
73 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070075 cricket::FakeWebRtcVoiceEngine voe;
76 EXPECT_FALSE(voe.IsInited());
77 {
ossu29b1a8d2016-06-13 07:34:51 -070078 cricket::WebRtcVoiceEngine engine(&adm, nullptr, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070079 EXPECT_TRUE(voe.IsInited());
80 }
81 EXPECT_FALSE(voe.IsInited());
82}
83
deadbeef884f5852016-01-15 09:20:04 -080084class FakeAudioSink : public webrtc::AudioSinkInterface {
85 public:
86 void OnData(const Data& audio) override {}
87};
88
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080089class FakeAudioSource : public cricket::AudioSource {
90 void SetSink(Sink* sink) override {}
91};
92
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093class WebRtcVoiceEngineTestFake : public testing::Test {
94 public:
stefanba4c0e42016-02-04 04:12:24 -080095 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
96
97 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070098 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
99 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
100 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700101 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
102 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
103 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
ossu29b1a8d2016-06-13 07:34:51 -0700104 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, nullptr,
solenbergbc37fc82016-04-04 09:54:44 -0700105 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200106 send_parameters_.codecs.push_back(kPcmuCodec);
107 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 }
solenbergff976312016-03-30 23:28:51 -0700109 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700110 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
111 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200112 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000113 }
solenbergff976312016-03-30 23:28:51 -0700114 bool SetupRecvStream() {
115 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700116 return false;
117 }
118 return channel_->AddRecvStream(
119 cricket::StreamParams::CreateLegacy(kSsrc1));
120 }
solenbergff976312016-03-30 23:28:51 -0700121 bool SetupSendStream() {
122 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000123 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000124 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800125 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
126 return false;
127 }
128 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000130 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700131 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700132 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800133 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700134 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700135 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800136 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000137 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700139 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000140 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200142 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 }
145
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100146 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
147 const auto* send_stream = call_.GetAudioSendStream(ssrc);
148 EXPECT_TRUE(send_stream);
149 return *send_stream;
150 }
151
deadbeef884f5852016-01-15 09:20:04 -0800152 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
153 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
154 EXPECT_TRUE(recv_stream);
155 return *recv_stream;
156 }
157
solenberg3a941542015-11-16 07:34:50 -0800158 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800159 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800160 }
161
solenberg7add0582015-11-20 09:59:34 -0800162 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800163 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800164 }
165
solenbergd53a3f92016-04-14 13:56:37 -0700166 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
167 ASSERT_TRUE(channel);
168 if (enable) {
169 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
170 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
171 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
172 }
173 channel->SetSend(enable);
174 }
175
Peter Boström0c4e06b2015-10-07 12:23:21 +0200176 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700177 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000178 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700179 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000180 // send stream.
181 EXPECT_TRUE(channel_->AddSendStream(
182 cricket::StreamParams::CreateLegacy(kSsrc1)));
183 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000184
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200186 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700187 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000188 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800189 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200190 send_parameters_.codecs.push_back(kTelephoneEventCodec);
191 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000192 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000193
194 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700195 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800196 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000197 EXPECT_TRUE(channel_->AddSendStream(
198 cricket::StreamParams::CreateLegacy(kSsrc1)));
199 }
200
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800202 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000203
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100204 // Test send.
205 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
206 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
207 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800208 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100209 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
210 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
211 EXPECT_EQ(2, telephone_event.event_code);
212 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 }
214
215 // Test that send bandwidth is set correctly.
216 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000217 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
218 // |expected_result| is the expected result from SetMaxSendBandwidth().
219 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700220 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
221 int max_bitrate,
222 bool expected_result,
223 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 cricket::AudioSendParameters parameters;
225 parameters.codecs.push_back(codec);
226 parameters.max_bandwidth_bps = max_bitrate;
227 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
228
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000230 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000232 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 }
234
skvlade0d46372016-04-07 22:59:22 -0700235 // Sets the per-stream maximum bitrate limit for the specified SSRC.
236 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700237 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700238 EXPECT_EQ(1UL, parameters.encodings.size());
239
240 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700241 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700242 }
243
244 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
245 cricket::AudioSendParameters send_parameters;
246 send_parameters.codecs.push_back(codec);
247 send_parameters.max_bandwidth_bps = bitrate;
248 return channel_->SetSendParameters(send_parameters);
249 }
250
251 int GetCodecBitrate(int32_t ssrc) {
252 cricket::WebRtcVoiceMediaChannel* media_channel =
253 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
254 int channel = media_channel->GetSendChannelId(ssrc);
255 EXPECT_NE(-1, channel);
256 webrtc::CodecInst codec;
257 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
258 return codec.rate;
259 }
260
261 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
262 int global_max,
263 int stream_max,
264 bool expected_result,
265 int expected_codec_bitrate) {
266 // Clear the bitrate limit from the previous test case.
267 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
268
269 // Attempt to set the requested bitrate limits.
270 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
271 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
272
273 // Verify that reading back the parameters gives results
274 // consistent with the Set() result.
275 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700276 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700277 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
278 EXPECT_EQ(expected_result ? stream_max : -1,
279 resulting_parameters.encodings[0].max_bitrate_bps);
280
281 // Verify that the codec settings have the expected bitrate.
282 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
283 }
284
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000285 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700286 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000287
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000288 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800289 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000290
291 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700292 send_parameters_.extensions.push_back(
293 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200294 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800295 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000296
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000297 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200298 send_parameters_.extensions.clear();
299 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800300 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000301
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000302 // Ensure extension is set properly.
303 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700304 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200305 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800306 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700307 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800308 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000309
solenberg7add0582015-11-20 09:59:34 -0800310 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000311 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700312 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800313 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
314 call_.GetAudioSendStream(kSsrc2));
315 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700316 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800317 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000318
319 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200320 send_parameters_.codecs.push_back(kPcmuCodec);
321 send_parameters_.extensions.clear();
322 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800323 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
324 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000325 }
326
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000327 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700328 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000329
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000330 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800331 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000332
333 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700334 recv_parameters_.extensions.push_back(
335 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800336 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
337 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000338
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000339 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800340 recv_parameters_.extensions.clear();
341 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
342 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000343
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000344 // Ensure extension is set properly.
345 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700346 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800347 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
348 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700349 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800350 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000351
solenberg7add0582015-11-20 09:59:34 -0800352 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000353 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700354 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800355 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
356 call_.GetAudioReceiveStream(kSsrc2));
357 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700358 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800359 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000360
361 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800362 recv_parameters_.extensions.clear();
363 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
364 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
365 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000366 }
367
solenberg85a04962015-10-27 03:35:21 -0700368 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
369 webrtc::AudioSendStream::Stats stats;
370 stats.local_ssrc = 12;
371 stats.bytes_sent = 345;
372 stats.packets_sent = 678;
373 stats.packets_lost = 9012;
374 stats.fraction_lost = 34.56f;
375 stats.codec_name = "codec_name_send";
376 stats.ext_seqnum = 789;
377 stats.jitter_ms = 12;
378 stats.rtt_ms = 345;
379 stats.audio_level = 678;
380 stats.aec_quality_min = 9.01f;
381 stats.echo_delay_median_ms = 234;
382 stats.echo_delay_std_ms = 567;
383 stats.echo_return_loss = 890;
384 stats.echo_return_loss_enhancement = 1234;
385 stats.typing_noise_detected = true;
386 return stats;
387 }
388 void SetAudioSendStreamStats() {
389 for (auto* s : call_.GetAudioSendStreams()) {
390 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200391 }
solenberg85a04962015-10-27 03:35:21 -0700392 }
solenberg566ef242015-11-06 15:34:49 -0800393 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
394 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700395 const auto stats = GetAudioSendStreamStats();
396 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
397 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
398 EXPECT_EQ(info.packets_sent, stats.packets_sent);
399 EXPECT_EQ(info.packets_lost, stats.packets_lost);
400 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
401 EXPECT_EQ(info.codec_name, stats.codec_name);
402 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
403 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
404 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
405 EXPECT_EQ(info.audio_level, stats.audio_level);
406 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
407 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
408 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
409 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
410 EXPECT_EQ(info.echo_return_loss_enhancement,
411 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800412 EXPECT_EQ(info.typing_noise_detected,
413 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700414 }
415
416 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
417 webrtc::AudioReceiveStream::Stats stats;
418 stats.remote_ssrc = 123;
419 stats.bytes_rcvd = 456;
420 stats.packets_rcvd = 768;
421 stats.packets_lost = 101;
422 stats.fraction_lost = 23.45f;
423 stats.codec_name = "codec_name_recv";
424 stats.ext_seqnum = 678;
425 stats.jitter_ms = 901;
426 stats.jitter_buffer_ms = 234;
427 stats.jitter_buffer_preferred_ms = 567;
428 stats.delay_estimate_ms = 890;
429 stats.audio_level = 1234;
430 stats.expand_rate = 5.67f;
431 stats.speech_expand_rate = 8.90f;
432 stats.secondary_decoded_rate = 1.23f;
433 stats.accelerate_rate = 4.56f;
434 stats.preemptive_expand_rate = 7.89f;
435 stats.decoding_calls_to_silence_generator = 12;
436 stats.decoding_calls_to_neteq = 345;
437 stats.decoding_normal = 67890;
438 stats.decoding_plc = 1234;
439 stats.decoding_cng = 5678;
440 stats.decoding_plc_cng = 9012;
441 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200442 return stats;
443 }
444 void SetAudioReceiveStreamStats() {
445 for (auto* s : call_.GetAudioReceiveStreams()) {
446 s->SetStats(GetAudioReceiveStreamStats());
447 }
448 }
449 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700450 const auto stats = GetAudioReceiveStreamStats();
451 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
452 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
453 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
454 EXPECT_EQ(info.packets_lost, stats.packets_lost);
455 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
456 EXPECT_EQ(info.codec_name, stats.codec_name);
457 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
458 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
459 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200460 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700461 stats.jitter_buffer_preferred_ms);
462 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
463 EXPECT_EQ(info.audio_level, stats.audio_level);
464 EXPECT_EQ(info.expand_rate, stats.expand_rate);
465 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
466 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
467 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
468 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200469 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700470 stats.decoding_calls_to_silence_generator);
471 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
472 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
473 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
474 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
475 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
476 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200477 }
478
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700480 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200481 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700483 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700484 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200485 cricket::AudioSendParameters send_parameters_;
486 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800487 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800488 private:
489 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490};
491
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000492// Tests that we can create and destroy a channel.
493TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700494 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000495}
496
solenberg31fec402016-05-06 02:13:12 -0700497// Test that we can add a send stream and that it has the correct defaults.
498TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
499 EXPECT_TRUE(SetupChannel());
500 EXPECT_TRUE(
501 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
502 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
503 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
504 EXPECT_EQ("", config.rtp.c_name);
505 EXPECT_EQ(0u, config.rtp.extensions.size());
506 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
507 config.send_transport);
508}
509
510// Test that we can add a receive stream and that it has the correct defaults.
511TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
512 EXPECT_TRUE(SetupChannel());
513 EXPECT_TRUE(
514 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
515 const webrtc::AudioReceiveStream::Config& config =
516 GetRecvStreamConfig(kSsrc1);
517 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
518 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
519 EXPECT_FALSE(config.rtp.transport_cc);
520 EXPECT_EQ(0u, config.rtp.extensions.size());
521 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
522 config.rtcp_send_transport);
523 EXPECT_EQ("", config.sync_group);
524}
525
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700527// correctly (such that opus appears first).
528TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
solenbergbc37fc82016-04-04 09:54:44 -0700529 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 ASSERT_FALSE(codecs.empty());
531 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
532 EXPECT_EQ(48000, codecs[0].clockrate);
533 EXPECT_EQ(2, codecs[0].channels);
534 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535}
536
stefanba4c0e42016-02-04 04:12:24 -0800537TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700538 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800539 bool opus_found = false;
540 for (cricket::AudioCodec codec : codecs) {
541 if (codec.name == "opus") {
542 EXPECT_TRUE(HasTransportCc(codec));
543 opus_found = true;
544 }
545 }
546 EXPECT_TRUE(opus_found);
547}
548
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549// Tests that we can find codecs by name or id, and that we interpret the
550// clockrate and bitrate fields properly.
551TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
552 cricket::AudioCodec codec;
553 webrtc::CodecInst codec_inst;
554 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800555 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800557 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800559 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
560 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561 // Find ISAC with a different payload id.
562 codec = kIsacCodec;
563 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800564 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000565 EXPECT_EQ(codec.id, codec_inst.pltype);
566 // Find PCMU with a 0 clockrate.
567 codec = kPcmuCodec;
568 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800569 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 EXPECT_EQ(codec.id, codec_inst.pltype);
571 EXPECT_EQ(8000, codec_inst.plfreq);
572 // Find PCMU with a 0 bitrate.
573 codec = kPcmuCodec;
574 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800575 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000576 EXPECT_EQ(codec.id, codec_inst.pltype);
577 EXPECT_EQ(64000, codec_inst.rate);
578 // Find ISAC with an explicit bitrate.
579 codec = kIsacCodec;
580 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800581 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 EXPECT_EQ(codec.id, codec_inst.pltype);
583 EXPECT_EQ(32000, codec_inst.rate);
584}
585
586// Test that we set our inbound codecs properly, including changing PT.
587TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700588 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200589 cricket::AudioRecvParameters parameters;
590 parameters.codecs.push_back(kIsacCodec);
591 parameters.codecs.push_back(kPcmuCodec);
592 parameters.codecs.push_back(kTelephoneEventCodec);
593 parameters.codecs[0].id = 106; // collide with existing telephone-event
594 parameters.codecs[2].id = 126;
595 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700596 EXPECT_TRUE(channel_->AddRecvStream(
597 cricket::StreamParams::CreateLegacy(kSsrc1)));
598 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800600 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 gcodec.plfreq = 16000;
602 gcodec.channels = 1;
603 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
604 EXPECT_EQ(106, gcodec.pltype);
605 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800606 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 gcodec.plfreq = 8000;
608 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
609 EXPECT_EQ(126, gcodec.pltype);
610 EXPECT_STREQ("telephone-event", gcodec.plname);
611}
612
613// Test that we fail to set an unknown inbound codec.
614TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700615 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200616 cricket::AudioRecvParameters parameters;
617 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700618 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620}
621
622// Test that we fail if we have duplicate types in the inbound list.
623TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700624 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200625 cricket::AudioRecvParameters parameters;
626 parameters.codecs.push_back(kIsacCodec);
627 parameters.codecs.push_back(kCn16000Codec);
628 parameters.codecs[1].id = kIsacCodec.id;
629 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630}
631
632// Test that we can decode OPUS without stereo parameters.
633TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700634 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200635 cricket::AudioRecvParameters parameters;
636 parameters.codecs.push_back(kIsacCodec);
637 parameters.codecs.push_back(kPcmuCodec);
638 parameters.codecs.push_back(kOpusCodec);
639 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 EXPECT_TRUE(channel_->AddRecvStream(
641 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700642 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800644 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 // Even without stereo parameters, recv codecs still specify channels = 2.
646 EXPECT_EQ(2, opus.channels);
647 EXPECT_EQ(111, opus.pltype);
648 EXPECT_STREQ("opus", opus.plname);
649 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700650 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 EXPECT_EQ(111, opus.pltype);
652}
653
654// Test that we can decode OPUS with stereo = 0.
655TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700656 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200657 cricket::AudioRecvParameters parameters;
658 parameters.codecs.push_back(kIsacCodec);
659 parameters.codecs.push_back(kPcmuCodec);
660 parameters.codecs.push_back(kOpusCodec);
661 parameters.codecs[2].params["stereo"] = "0";
662 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 EXPECT_TRUE(channel_->AddRecvStream(
664 cricket::StreamParams::CreateLegacy(kSsrc1)));
665 int channel_num2 = voe_.GetLastChannel();
666 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800667 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 // Even when stereo is off, recv codecs still specify channels = 2.
669 EXPECT_EQ(2, opus.channels);
670 EXPECT_EQ(111, opus.pltype);
671 EXPECT_STREQ("opus", opus.plname);
672 opus.pltype = 0;
673 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
674 EXPECT_EQ(111, opus.pltype);
675}
676
677// Test that we can decode OPUS with stereo = 1.
678TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700679 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200680 cricket::AudioRecvParameters parameters;
681 parameters.codecs.push_back(kIsacCodec);
682 parameters.codecs.push_back(kPcmuCodec);
683 parameters.codecs.push_back(kOpusCodec);
684 parameters.codecs[2].params["stereo"] = "1";
685 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 EXPECT_TRUE(channel_->AddRecvStream(
687 cricket::StreamParams::CreateLegacy(kSsrc1)));
688 int channel_num2 = voe_.GetLastChannel();
689 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800690 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691 EXPECT_EQ(2, opus.channels);
692 EXPECT_EQ(111, opus.pltype);
693 EXPECT_STREQ("opus", opus.plname);
694 opus.pltype = 0;
695 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
696 EXPECT_EQ(111, opus.pltype);
697}
698
699// Test that changes to recv codecs are applied to all streams.
700TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700701 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200702 cricket::AudioRecvParameters parameters;
703 parameters.codecs.push_back(kIsacCodec);
704 parameters.codecs.push_back(kPcmuCodec);
705 parameters.codecs.push_back(kTelephoneEventCodec);
706 parameters.codecs[0].id = 106; // collide with existing telephone-event
707 parameters.codecs[2].id = 126;
708 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_TRUE(channel_->AddRecvStream(
710 cricket::StreamParams::CreateLegacy(kSsrc1)));
711 int channel_num2 = voe_.GetLastChannel();
712 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800713 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714 gcodec.plfreq = 16000;
715 gcodec.channels = 1;
716 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
717 EXPECT_EQ(106, gcodec.pltype);
718 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800719 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 gcodec.plfreq = 8000;
721 gcodec.channels = 1;
722 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
723 EXPECT_EQ(126, gcodec.pltype);
724 EXPECT_STREQ("telephone-event", gcodec.plname);
725}
726
727TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700728 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200729 cricket::AudioRecvParameters parameters;
730 parameters.codecs.push_back(kIsacCodec);
731 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200732 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733
734 int channel_num2 = voe_.GetLastChannel();
735 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800736 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 gcodec.plfreq = 16000;
738 gcodec.channels = 1;
739 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
740 EXPECT_EQ(106, gcodec.pltype);
741 EXPECT_STREQ("ISAC", gcodec.plname);
742}
743
744// Test that we can apply the same set of codecs again while playing.
745TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700746 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200747 cricket::AudioRecvParameters parameters;
748 parameters.codecs.push_back(kIsacCodec);
749 parameters.codecs.push_back(kCn16000Codec);
750 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200752 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753
754 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755 parameters.codecs[0].id = 127;
756 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
757 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_TRUE(voe_.GetPlayout(channel_num));
759}
760
761// Test that we can add a codec while playing.
762TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700763 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764 cricket::AudioRecvParameters parameters;
765 parameters.codecs.push_back(kIsacCodec);
766 parameters.codecs.push_back(kCn16000Codec);
767 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768 EXPECT_TRUE(channel_->SetPlayout(true));
769
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200770 parameters.codecs.push_back(kOpusCodec);
771 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
772 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 EXPECT_TRUE(voe_.GetPlayout(channel_num));
774 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800775 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
777}
778
779TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700780 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000782 // Test that when autobw is enabled, bitrate is kept as the default
783 // value. autobw is enabled for the following tests because the target
784 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785
786 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700787 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788
789 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700790 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700793 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794}
795
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000796TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700797 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000799 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
801 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700802 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
803 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
804 // Rates above the max (56000) should be capped.
805 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000807 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700808 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
809 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
810 // Rates above the max (510000) should be capped.
811 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812}
813
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000814TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700815 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000816
817 // Test that we can only set a maximum bitrate for a fixed-rate codec
818 // if it's bigger than the fixed rate.
819
820 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700821 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
822 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
823 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
824 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
825 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
826 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
827 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000828}
829
830TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700831 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200832 const int kDesiredBitrate = 128000;
833 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700834 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835 parameters.max_bandwidth_bps = kDesiredBitrate;
836 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000837
838 EXPECT_TRUE(channel_->AddSendStream(
839 cricket::StreamParams::CreateLegacy(kSsrc1)));
840
841 int channel_num = voe_.GetLastChannel();
842 webrtc::CodecInst codec;
843 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000845}
846
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847// Test that bitrate cannot be set for CBR codecs.
848// Bitrate is ignored if it is higher than the fixed bitrate.
849// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000850TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700851 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852
853 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200854 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
855 int channel_num = voe_.GetLastChannel();
856 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
858 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200859
860 send_parameters_.max_bandwidth_bps = 128000;
861 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
863 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200864
865 send_parameters_.max_bandwidth_bps = 128;
866 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
868 EXPECT_EQ(64000, codec.rate);
869}
870
skvlade0d46372016-04-07 22:59:22 -0700871// Test that the per-stream bitrate limit and the global
872// bitrate limit both apply.
873TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
874 EXPECT_TRUE(SetupSendStream());
875
876 // opus, default bitrate == 64000.
877 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
878 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
879 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
880 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
881
882 // CBR codecs allow both maximums to exceed the bitrate.
883 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
884 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
885 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
886 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
887
888 // CBR codecs don't allow per stream maximums to be too low.
889 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
890 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
891}
892
893// Test that an attempt to set RtpParameters for a stream that does not exist
894// fails.
895TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
896 EXPECT_TRUE(SetupChannel());
897 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700898 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700899 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
900
901 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700902 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700903}
904
905TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700906 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700907 // This test verifies that setting RtpParameters succeeds only if
908 // the structure contains exactly one encoding.
909 // TODO(skvlad): Update this test when we start supporting setting parameters
910 // for each encoding individually.
911
912 EXPECT_TRUE(SetupSendStream());
913 // Setting RtpParameters with no encoding is expected to fail.
914 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700915 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700916 // Setting RtpParameters with exactly one encoding should succeed.
917 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700918 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700919 // Two or more encodings should result in failure.
920 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700921 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700922}
923
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700924// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700925// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700926TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
927 EXPECT_TRUE(SetupSendStream());
928 SetSend(channel_, true);
929 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
930 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700931 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700932 ASSERT_EQ(1u, parameters.encodings.size());
933 ASSERT_TRUE(parameters.encodings[0].active);
934 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700935 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700936 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
937
938 // Now change it back to active and verify we resume sending.
939 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700940 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700941 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
942}
943
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700944// Test that SetRtpSendParameters configures the correct encoding channel for
945// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700946TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
947 SetupForMultiSendStream();
948 // Create send streams.
949 for (uint32_t ssrc : kSsrcs4) {
950 EXPECT_TRUE(
951 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
952 }
953 // Configure one stream to be limited by the stream config, another to be
954 // limited by the global max, and the third one with no per-stream limit
955 // (still subject to the global limit).
956 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
957 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
958 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
959 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
960
961 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
962 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
963 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
964
965 // Remove the global cap; the streams should switch to their respective
966 // maximums (or remain unchanged if there was no other limit on them.)
967 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
968 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
969 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
970 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
971}
972
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700973// Test that GetRtpSendParameters returns the currently configured codecs.
974TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700975 EXPECT_TRUE(SetupSendStream());
976 cricket::AudioSendParameters parameters;
977 parameters.codecs.push_back(kIsacCodec);
978 parameters.codecs.push_back(kPcmuCodec);
979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
980
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700981 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700982 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700983 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
984 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700985}
986
987// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700988TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700989 EXPECT_TRUE(SetupSendStream());
990 cricket::AudioSendParameters parameters;
991 parameters.codecs.push_back(kIsacCodec);
992 parameters.codecs.push_back(kPcmuCodec);
993 EXPECT_TRUE(channel_->SetSendParameters(parameters));
994
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700995 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700996
997 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700998 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700999
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001000 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1001 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1002 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1003}
1004
1005// Test that GetRtpReceiveParameters returns the currently configured codecs.
1006TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1007 EXPECT_TRUE(SetupRecvStream());
1008 cricket::AudioRecvParameters parameters;
1009 parameters.codecs.push_back(kIsacCodec);
1010 parameters.codecs.push_back(kPcmuCodec);
1011 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1012
1013 webrtc::RtpParameters rtp_parameters =
1014 channel_->GetRtpReceiveParameters(kSsrc1);
1015 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1016 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1017 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1018}
1019
1020// Test that if we set/get parameters multiple times, we get the same results.
1021TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1022 EXPECT_TRUE(SetupRecvStream());
1023 cricket::AudioRecvParameters parameters;
1024 parameters.codecs.push_back(kIsacCodec);
1025 parameters.codecs.push_back(kPcmuCodec);
1026 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1027
1028 webrtc::RtpParameters initial_params =
1029 channel_->GetRtpReceiveParameters(kSsrc1);
1030
1031 // We should be able to set the params we just got.
1032 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1033
1034 // ... And this shouldn't change the params returned by
1035 // GetRtpReceiveParameters.
1036 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1037 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001038}
1039
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040// Test that we apply codecs properly.
1041TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001042 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001043 cricket::AudioSendParameters parameters;
1044 parameters.codecs.push_back(kIsacCodec);
1045 parameters.codecs.push_back(kPcmuCodec);
1046 parameters.codecs.push_back(kRedCodec);
1047 parameters.codecs[0].id = 96;
1048 parameters.codecs[0].bitrate = 48000;
1049 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001050 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001051 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 webrtc::CodecInst gcodec;
1053 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1054 EXPECT_EQ(96, gcodec.pltype);
1055 EXPECT_EQ(48000, gcodec.rate);
1056 EXPECT_STREQ("ISAC", gcodec.plname);
1057 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001058 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001059 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1060 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001061 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001062}
1063
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001064// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1065// to apply.
1066TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001067 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 cricket::AudioSendParameters parameters;
1069 parameters.codecs.push_back(kIsacCodec);
1070 parameters.codecs.push_back(kPcmuCodec);
1071 parameters.codecs.push_back(kRedCodec);
1072 parameters.codecs[0].id = 96;
1073 parameters.codecs[0].bitrate = 48000;
1074 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001075 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1076 // Calling SetSendCodec again with same codec which is already set.
1077 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001079 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1080}
1081
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001082// Verify that G722 is set with 16000 samples per second to WebRTC.
1083TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001084 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001085 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001086 cricket::AudioSendParameters parameters;
1087 parameters.codecs.push_back(kG722CodecSdp);
1088 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001089 webrtc::CodecInst gcodec;
1090 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1091 EXPECT_STREQ("G722", gcodec.plname);
1092 EXPECT_EQ(1, gcodec.channels);
1093 EXPECT_EQ(16000, gcodec.plfreq);
1094}
1095
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001096// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001098 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001099 cricket::AudioSendParameters parameters;
1100 parameters.codecs.push_back(kOpusCodec);
1101 parameters.codecs[0].bitrate = 0;
1102 parameters.codecs[0].clockrate = 50000;
1103 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104}
1105
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001106// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001108 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001109 cricket::AudioSendParameters parameters;
1110 parameters.codecs.push_back(kOpusCodec);
1111 parameters.codecs[0].bitrate = 0;
1112 parameters.codecs[0].channels = 0;
1113 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114}
1115
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001116// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001118 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001119 cricket::AudioSendParameters parameters;
1120 parameters.codecs.push_back(kOpusCodec);
1121 parameters.codecs[0].bitrate = 0;
1122 parameters.codecs[0].channels = 0;
1123 parameters.codecs[0].params["stereo"] = "1";
1124 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125}
1126
1127// Test that if channel is 1 for opus and there's no stereo, we fail.
1128TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001129 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001130 cricket::AudioSendParameters parameters;
1131 parameters.codecs.push_back(kOpusCodec);
1132 parameters.codecs[0].bitrate = 0;
1133 parameters.codecs[0].channels = 1;
1134 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135}
1136
1137// Test that if channel is 1 for opus and stereo=0, we fail.
1138TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001139 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001140 cricket::AudioSendParameters parameters;
1141 parameters.codecs.push_back(kOpusCodec);
1142 parameters.codecs[0].bitrate = 0;
1143 parameters.codecs[0].channels = 1;
1144 parameters.codecs[0].params["stereo"] = "0";
1145 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146}
1147
1148// Test that if channel is 1 for opus and stereo=1, we fail.
1149TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001150 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001151 cricket::AudioSendParameters parameters;
1152 parameters.codecs.push_back(kOpusCodec);
1153 parameters.codecs[0].bitrate = 0;
1154 parameters.codecs[0].channels = 1;
1155 parameters.codecs[0].params["stereo"] = "1";
1156 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157}
1158
1159// Test that with bitrate=0 and no stereo,
1160// channels and bitrate are 1 and 32000.
1161TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001162 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001164 cricket::AudioSendParameters parameters;
1165 parameters.codecs.push_back(kOpusCodec);
1166 parameters.codecs[0].bitrate = 0;
1167 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 webrtc::CodecInst gcodec;
1169 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1170 EXPECT_STREQ("opus", gcodec.plname);
1171 EXPECT_EQ(1, gcodec.channels);
1172 EXPECT_EQ(32000, gcodec.rate);
1173}
1174
1175// Test that with bitrate=0 and stereo=0,
1176// channels and bitrate are 1 and 32000.
1177TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001178 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001180 cricket::AudioSendParameters parameters;
1181 parameters.codecs.push_back(kOpusCodec);
1182 parameters.codecs[0].bitrate = 0;
1183 parameters.codecs[0].params["stereo"] = "0";
1184 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185 webrtc::CodecInst gcodec;
1186 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1187 EXPECT_STREQ("opus", gcodec.plname);
1188 EXPECT_EQ(1, gcodec.channels);
1189 EXPECT_EQ(32000, gcodec.rate);
1190}
1191
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001192// Test that with bitrate=invalid and stereo=0,
1193// channels and bitrate are 1 and 32000.
1194TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001195 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001196 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001197 cricket::AudioSendParameters parameters;
1198 parameters.codecs.push_back(kOpusCodec);
1199 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001200 webrtc::CodecInst gcodec;
1201
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001202 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001203 parameters.codecs[0].bitrate = 5999;
1204 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001205 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1206 EXPECT_STREQ("opus", gcodec.plname);
1207 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001208 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001209
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001210 parameters.codecs[0].bitrate = 510001;
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001212 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1213 EXPECT_STREQ("opus", gcodec.plname);
1214 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001215 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216}
1217
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218// Test that with bitrate=0 and stereo=1,
1219// channels and bitrate are 2 and 64000.
1220TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001221 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001223 cricket::AudioSendParameters parameters;
1224 parameters.codecs.push_back(kOpusCodec);
1225 parameters.codecs[0].bitrate = 0;
1226 parameters.codecs[0].params["stereo"] = "1";
1227 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 webrtc::CodecInst gcodec;
1229 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1230 EXPECT_STREQ("opus", gcodec.plname);
1231 EXPECT_EQ(2, gcodec.channels);
1232 EXPECT_EQ(64000, gcodec.rate);
1233}
1234
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001235// Test that with bitrate=invalid and stereo=1,
1236// channels and bitrate are 2 and 64000.
1237TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001238 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001239 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001240 cricket::AudioSendParameters parameters;
1241 parameters.codecs.push_back(kOpusCodec);
1242 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001243 webrtc::CodecInst gcodec;
1244
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001245 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001246 parameters.codecs[0].bitrate = 5999;
1247 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001248 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1249 EXPECT_STREQ("opus", gcodec.plname);
1250 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001251 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001252
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 parameters.codecs[0].bitrate = 510001;
1254 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001255 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1256 EXPECT_STREQ("opus", gcodec.plname);
1257 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001258 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001259}
1260
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261// Test that with bitrate=N and stereo unset,
1262// channels and bitrate are 1 and N.
1263TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001264 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001266 cricket::AudioSendParameters parameters;
1267 parameters.codecs.push_back(kOpusCodec);
1268 parameters.codecs[0].bitrate = 96000;
1269 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001270 webrtc::CodecInst gcodec;
1271 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1272 EXPECT_EQ(111, gcodec.pltype);
1273 EXPECT_EQ(96000, gcodec.rate);
1274 EXPECT_STREQ("opus", gcodec.plname);
1275 EXPECT_EQ(1, gcodec.channels);
1276 EXPECT_EQ(48000, gcodec.plfreq);
1277}
1278
1279// Test that with bitrate=N and stereo=0,
1280// channels and bitrate are 1 and N.
1281TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001282 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001283 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 cricket::AudioSendParameters parameters;
1285 parameters.codecs.push_back(kOpusCodec);
1286 parameters.codecs[0].bitrate = 30000;
1287 parameters.codecs[0].params["stereo"] = "0";
1288 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001289 webrtc::CodecInst gcodec;
1290 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1291 EXPECT_EQ(1, gcodec.channels);
1292 EXPECT_EQ(30000, gcodec.rate);
1293 EXPECT_STREQ("opus", gcodec.plname);
1294}
1295
1296// Test that with bitrate=N and without any parameters,
1297// channels and bitrate are 1 and N.
1298TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001299 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001301 cricket::AudioSendParameters parameters;
1302 parameters.codecs.push_back(kOpusCodec);
1303 parameters.codecs[0].bitrate = 30000;
1304 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001305 webrtc::CodecInst gcodec;
1306 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1307 EXPECT_EQ(1, gcodec.channels);
1308 EXPECT_EQ(30000, gcodec.rate);
1309 EXPECT_STREQ("opus", gcodec.plname);
1310}
1311
1312// Test that with bitrate=N and stereo=1,
1313// channels and bitrate are 2 and N.
1314TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001315 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001316 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001317 cricket::AudioSendParameters parameters;
1318 parameters.codecs.push_back(kOpusCodec);
1319 parameters.codecs[0].bitrate = 30000;
1320 parameters.codecs[0].params["stereo"] = "1";
1321 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001322 webrtc::CodecInst gcodec;
1323 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1324 EXPECT_EQ(2, gcodec.channels);
1325 EXPECT_EQ(30000, gcodec.rate);
1326 EXPECT_STREQ("opus", gcodec.plname);
1327}
1328
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001329// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1330// Also test that the "maxaveragebitrate" can't be set to values outside the
1331// range of 6000 and 510000
1332TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001333 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001334 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 cricket::AudioSendParameters parameters;
1336 parameters.codecs.push_back(kOpusCodec);
1337 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001338 webrtc::CodecInst gcodec;
1339
1340 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1342 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001343 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001344 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345
1346 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001347 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1348 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001349 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001350 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001351
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1353 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001354 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1355 EXPECT_EQ(200000, gcodec.rate);
1356}
1357
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001358// Test that we can enable NACK with opus as caller.
1359TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001360 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001362 cricket::AudioSendParameters parameters;
1363 parameters.codecs.push_back(kOpusCodec);
1364 parameters.codecs[0].AddFeedbackParam(
1365 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1366 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369 EXPECT_TRUE(voe_.GetNACK(channel_num));
1370}
1371
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001372// Test that we can enable NACK with opus as callee.
1373TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001374 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001375 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001376 cricket::AudioSendParameters parameters;
1377 parameters.codecs.push_back(kOpusCodec);
1378 parameters.codecs[0].AddFeedbackParam(
1379 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1380 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001381 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001382 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001383 // NACK should be enabled even with no send stream.
1384 EXPECT_TRUE(voe_.GetNACK(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001385
1386 EXPECT_TRUE(channel_->AddSendStream(
1387 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001388 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001389}
1390
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001391// Test that we can enable NACK on receive streams.
1392TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001393 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001394 int channel_num1 = voe_.GetLastChannel();
1395 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1396 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].AddFeedbackParam(
1400 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1401 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001402 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1403 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1406 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1407}
1408
1409// Test that we can disable NACK.
1410TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001411 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001412 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001413 cricket::AudioSendParameters parameters;
1414 parameters.codecs.push_back(kOpusCodec);
1415 parameters.codecs[0].AddFeedbackParam(
1416 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1417 cricket::kParamValueEmpty));
1418 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001419 EXPECT_TRUE(voe_.GetNACK(channel_num));
1420
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001421 parameters.codecs.clear();
1422 parameters.codecs.push_back(kOpusCodec);
1423 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424 EXPECT_FALSE(voe_.GetNACK(channel_num));
1425}
1426
1427// Test that we can disable NACK on receive streams.
1428TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001429 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 int channel_num1 = voe_.GetLastChannel();
1431 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1432 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 cricket::AudioSendParameters parameters;
1434 parameters.codecs.push_back(kOpusCodec);
1435 parameters.codecs[0].AddFeedbackParam(
1436 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1437 cricket::kParamValueEmpty));
1438 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001439 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1440 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1441
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001442 parameters.codecs.clear();
1443 parameters.codecs.push_back(kOpusCodec);
1444 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1446 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1447}
1448
1449// Test that NACK is enabled on a new receive stream.
1450TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001451 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001453 cricket::AudioSendParameters parameters;
1454 parameters.codecs.push_back(kIsacCodec);
1455 parameters.codecs.push_back(kCn16000Codec);
1456 parameters.codecs[0].AddFeedbackParam(
1457 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1458 cricket::kParamValueEmpty));
1459 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460 EXPECT_TRUE(voe_.GetNACK(channel_num));
1461
1462 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1463 channel_num = voe_.GetLastChannel();
1464 EXPECT_TRUE(voe_.GetNACK(channel_num));
1465 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1466 channel_num = voe_.GetLastChannel();
1467 EXPECT_TRUE(voe_.GetNACK(channel_num));
1468}
1469
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001470// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001471TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001472 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001473 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001474 cricket::AudioSendParameters parameters;
1475 parameters.codecs.push_back(kOpusCodec);
1476 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001477 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1478}
1479
1480// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001481TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001482 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001483 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001484 cricket::AudioSendParameters parameters;
1485 parameters.codecs.push_back(kOpusCodec);
1486 parameters.codecs[0].bitrate = 0;
1487 parameters.codecs[0].params["useinbandfec"] = "0";
1488 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001489 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1490 webrtc::CodecInst gcodec;
1491 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1492 EXPECT_STREQ("opus", gcodec.plname);
1493 EXPECT_EQ(1, gcodec.channels);
1494 EXPECT_EQ(32000, gcodec.rate);
1495}
1496
1497// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001498TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001499 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001500 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001501 cricket::AudioSendParameters parameters;
1502 parameters.codecs.push_back(kOpusCodec);
1503 parameters.codecs[0].bitrate = 0;
1504 parameters.codecs[0].params["useinbandfec"] = "1";
1505 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001506 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1507 webrtc::CodecInst gcodec;
1508 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1509 EXPECT_STREQ("opus", gcodec.plname);
1510 EXPECT_EQ(1, gcodec.channels);
1511 EXPECT_EQ(32000, gcodec.rate);
1512}
1513
1514// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001515TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001516 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001517 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001518 cricket::AudioSendParameters parameters;
1519 parameters.codecs.push_back(kOpusCodec);
1520 parameters.codecs[0].bitrate = 0;
1521 parameters.codecs[0].params["stereo"] = "1";
1522 parameters.codecs[0].params["useinbandfec"] = "1";
1523 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001524 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1525 webrtc::CodecInst gcodec;
1526 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1527 EXPECT_STREQ("opus", gcodec.plname);
1528 EXPECT_EQ(2, gcodec.channels);
1529 EXPECT_EQ(64000, gcodec.rate);
1530}
1531
1532// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001533TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001534 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001535 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001536 cricket::AudioSendParameters parameters;
1537 parameters.codecs.push_back(kIsacCodec);
1538 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001539 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1540}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001541
1542// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1543TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001544 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001545 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 cricket::AudioSendParameters parameters;
1547 parameters.codecs.push_back(kIsacCodec);
1548 parameters.codecs[0].params["useinbandfec"] = "1";
1549 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001550 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1551}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001552
1553// Test that Opus FEC status can be changed.
1554TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001555 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001556 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 cricket::AudioSendParameters parameters;
1558 parameters.codecs.push_back(kOpusCodec);
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001561 parameters.codecs[0].params["useinbandfec"] = "1";
1562 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001563 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1564}
1565
stefanba4c0e42016-02-04 04:12:24 -08001566TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001567 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001568 cricket::AudioSendParameters send_parameters;
1569 send_parameters.codecs.push_back(kOpusCodec);
1570 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1571 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1572
1573 cricket::AudioRecvParameters recv_parameters;
1574 recv_parameters.codecs.push_back(kIsacCodec);
1575 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1576 EXPECT_TRUE(
1577 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1578 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1579 EXPECT_FALSE(
1580 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1581
solenbergbc37fc82016-04-04 09:54:44 -07001582 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001583 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1584 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1585 EXPECT_TRUE(
1586 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1587}
1588
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001589// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1590TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001591 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001592 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001593 cricket::AudioSendParameters parameters;
1594 parameters.codecs.push_back(kOpusCodec);
1595 parameters.codecs[0].bitrate = 0;
1596 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1597 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598 EXPECT_EQ(cricket::kOpusBandwidthNb,
1599 voe_.GetMaxEncodingBandwidth(channel_num));
1600 webrtc::CodecInst gcodec;
1601 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1602 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001603
1604 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1606 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001607 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1608 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001609}
1610
1611// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1612TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001613 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001614 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 cricket::AudioSendParameters parameters;
1616 parameters.codecs.push_back(kOpusCodec);
1617 parameters.codecs[0].bitrate = 0;
1618 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1619 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001620 EXPECT_EQ(cricket::kOpusBandwidthMb,
1621 voe_.GetMaxEncodingBandwidth(channel_num));
1622 webrtc::CodecInst gcodec;
1623 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1624 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001625
1626 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001627 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1628 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001629 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1630 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001631}
1632
1633// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1634TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001635 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001636 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001637 cricket::AudioSendParameters parameters;
1638 parameters.codecs.push_back(kOpusCodec);
1639 parameters.codecs[0].bitrate = 0;
1640 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001642 EXPECT_EQ(cricket::kOpusBandwidthWb,
1643 voe_.GetMaxEncodingBandwidth(channel_num));
1644 webrtc::CodecInst gcodec;
1645 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1646 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001647
1648 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1650 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001651 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1652 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001653}
1654
1655// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1656TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001657 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001658 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001659 cricket::AudioSendParameters parameters;
1660 parameters.codecs.push_back(kOpusCodec);
1661 parameters.codecs[0].bitrate = 0;
1662 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001664 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1665 voe_.GetMaxEncodingBandwidth(channel_num));
1666 webrtc::CodecInst gcodec;
1667 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1668 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001669
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001670 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001671 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1672 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001673 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1674 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001675}
1676
1677// Test 24000 < maxplaybackrate triggers Opus full band mode.
1678TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001679 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001680 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kOpusCodec);
1683 parameters.codecs[0].bitrate = 0;
1684 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1685 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001686 EXPECT_EQ(cricket::kOpusBandwidthFb,
1687 voe_.GetMaxEncodingBandwidth(channel_num));
1688 webrtc::CodecInst gcodec;
1689 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1690 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001691
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001692 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001693 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1694 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001695 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1696 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001697}
1698
1699// Test Opus that without maxplaybackrate, default playback rate is used.
1700TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001701 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001702 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 cricket::AudioSendParameters parameters;
1704 parameters.codecs.push_back(kOpusCodec);
1705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001706 EXPECT_EQ(cricket::kOpusBandwidthFb,
1707 voe_.GetMaxEncodingBandwidth(channel_num));
1708}
1709
1710// Test the with non-Opus, maxplaybackrate has no effect.
1711TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001712 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001713 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001714 cricket::AudioSendParameters parameters;
1715 parameters.codecs.push_back(kIsacCodec);
1716 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1717 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001718 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1719}
1720
1721// Test maxplaybackrate can be set on two streams.
1722TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001723 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001724 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 cricket::AudioSendParameters parameters;
1726 parameters.codecs.push_back(kOpusCodec);
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001728 // Default bandwidth is 24000.
1729 EXPECT_EQ(cricket::kOpusBandwidthFb,
1730 voe_.GetMaxEncodingBandwidth(channel_num));
1731
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001733
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001734 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001735 EXPECT_EQ(cricket::kOpusBandwidthNb,
1736 voe_.GetMaxEncodingBandwidth(channel_num));
1737
1738 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1739 channel_num = voe_.GetLastChannel();
1740 EXPECT_EQ(cricket::kOpusBandwidthNb,
1741 voe_.GetMaxEncodingBandwidth(channel_num));
1742}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001743
Minyue Li7100dcd2015-03-27 05:05:59 +01001744// Test that with usedtx=0, Opus DTX is off.
1745TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001746 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001747 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001748 cricket::AudioSendParameters parameters;
1749 parameters.codecs.push_back(kOpusCodec);
1750 parameters.codecs[0].params["usedtx"] = "0";
1751 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001752 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1753}
1754
1755// Test that with usedtx=1, Opus DTX is on.
1756TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001757 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001758 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001759 cricket::AudioSendParameters parameters;
1760 parameters.codecs.push_back(kOpusCodec);
1761 parameters.codecs[0].params["usedtx"] = "1";
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001763 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1764 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1765}
1766
1767// Test that usedtx=1 works with stereo Opus.
1768TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001769 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001770 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001771 cricket::AudioSendParameters parameters;
1772 parameters.codecs.push_back(kOpusCodec);
1773 parameters.codecs[0].params["usedtx"] = "1";
1774 parameters.codecs[0].params["stereo"] = "1";
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001776 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1777 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1778}
1779
1780// Test that usedtx=1 does not work with non Opus.
1781TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001782 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001783 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001784 cricket::AudioSendParameters parameters;
1785 parameters.codecs.push_back(kIsacCodec);
1786 parameters.codecs[0].params["usedtx"] = "1";
1787 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001788 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1789}
1790
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001791// Test that we can switch back and forth between Opus and ISAC with CN.
1792TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001793 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001795 cricket::AudioSendParameters opus_parameters;
1796 opus_parameters.codecs.push_back(kOpusCodec);
1797 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 webrtc::CodecInst gcodec;
1799 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001800 EXPECT_EQ(111, gcodec.pltype);
1801 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001803 cricket::AudioSendParameters isac_parameters;
1804 isac_parameters.codecs.push_back(kIsacCodec);
1805 isac_parameters.codecs.push_back(kCn16000Codec);
1806 isac_parameters.codecs.push_back(kOpusCodec);
1807 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1809 EXPECT_EQ(103, gcodec.pltype);
1810 EXPECT_STREQ("ISAC", gcodec.plname);
1811
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001812 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001814 EXPECT_EQ(111, gcodec.pltype);
1815 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816}
1817
1818// Test that we handle various ways of specifying bitrate.
1819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001820 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 cricket::AudioSendParameters parameters;
1823 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1824 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 webrtc::CodecInst gcodec;
1826 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1827 EXPECT_EQ(103, gcodec.pltype);
1828 EXPECT_STREQ("ISAC", gcodec.plname);
1829 EXPECT_EQ(32000, gcodec.rate);
1830
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001831 parameters.codecs[0].bitrate = 0; // bitrate == default
1832 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1834 EXPECT_EQ(103, gcodec.pltype);
1835 EXPECT_STREQ("ISAC", gcodec.plname);
1836 EXPECT_EQ(-1, gcodec.rate);
1837
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001838 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1841 EXPECT_EQ(103, gcodec.pltype);
1842 EXPECT_STREQ("ISAC", gcodec.plname);
1843 EXPECT_EQ(28000, gcodec.rate);
1844
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001845 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1846 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1848 EXPECT_EQ(0, gcodec.pltype);
1849 EXPECT_STREQ("PCMU", gcodec.plname);
1850 EXPECT_EQ(64000, gcodec.rate);
1851
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 parameters.codecs[0].bitrate = 0; // bitrate == default
1853 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001854 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1855 EXPECT_EQ(0, gcodec.pltype);
1856 EXPECT_STREQ("PCMU", gcodec.plname);
1857 EXPECT_EQ(64000, gcodec.rate);
1858
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001859 parameters.codecs[0] = kOpusCodec;
1860 parameters.codecs[0].bitrate = 0; // bitrate == default
1861 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1863 EXPECT_EQ(111, gcodec.pltype);
1864 EXPECT_STREQ("opus", gcodec.plname);
1865 EXPECT_EQ(32000, gcodec.rate);
1866}
1867
Brave Yao5225dd82015-03-26 07:39:19 +08001868// Test that we could set packet size specified in kCodecParamPTime.
1869TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001870 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001871 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001872 cricket::AudioSendParameters parameters;
1873 parameters.codecs.push_back(kOpusCodec);
1874 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1875 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001876 webrtc::CodecInst gcodec;
1877 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1878 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1879
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001880 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1881 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1883 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1884
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001885 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1886 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001887 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1888 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1889
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001890 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1891 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001893 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1894 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1895
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1897 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1898 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001899 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1900 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1901}
1902
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001903// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001905 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001906 cricket::AudioSendParameters parameters;
1907 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001908}
1909
1910// Test that we can set send codecs even with telephone-event codec as the first
1911// one on the list.
1912TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001913 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001915 cricket::AudioSendParameters parameters;
1916 parameters.codecs.push_back(kTelephoneEventCodec);
1917 parameters.codecs.push_back(kIsacCodec);
1918 parameters.codecs.push_back(kPcmuCodec);
1919 parameters.codecs[0].id = 98; // DTMF
1920 parameters.codecs[1].id = 96;
1921 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 webrtc::CodecInst gcodec;
1923 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001924 EXPECT_EQ(96, gcodec.pltype);
1925 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001926 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001927}
1928
solenberg31642aa2016-03-14 08:00:37 -07001929// Test that payload type range is limited for telephone-event codec.
1930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001931 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001932 cricket::AudioSendParameters parameters;
1933 parameters.codecs.push_back(kTelephoneEventCodec);
1934 parameters.codecs.push_back(kIsacCodec);
1935 parameters.codecs[0].id = 0; // DTMF
1936 parameters.codecs[1].id = 96;
1937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1938 EXPECT_TRUE(channel_->CanInsertDtmf());
1939 parameters.codecs[0].id = 128; // DTMF
1940 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1941 EXPECT_FALSE(channel_->CanInsertDtmf());
1942 parameters.codecs[0].id = 127;
1943 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1944 EXPECT_TRUE(channel_->CanInsertDtmf());
1945 parameters.codecs[0].id = -1; // DTMF
1946 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1947 EXPECT_FALSE(channel_->CanInsertDtmf());
1948}
1949
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001950// Test that we can set send codecs even with CN codec as the first
1951// one on the list.
1952TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001953 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001954 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001955 cricket::AudioSendParameters parameters;
1956 parameters.codecs.push_back(kCn16000Codec);
1957 parameters.codecs.push_back(kIsacCodec);
1958 parameters.codecs.push_back(kPcmuCodec);
1959 parameters.codecs[0].id = 98; // wideband CN
1960 parameters.codecs[1].id = 96;
1961 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001962 webrtc::CodecInst gcodec;
1963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1964 EXPECT_EQ(96, gcodec.pltype);
1965 EXPECT_STREQ("ISAC", gcodec.plname);
1966 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967}
1968
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001969// Test that we set VAD and DTMF types correctly as caller.
1970TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001971 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 cricket::AudioSendParameters parameters;
1974 parameters.codecs.push_back(kIsacCodec);
1975 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001977 parameters.codecs.push_back(kCn16000Codec);
1978 parameters.codecs.push_back(kCn8000Codec);
1979 parameters.codecs.push_back(kTelephoneEventCodec);
1980 parameters.codecs.push_back(kRedCodec);
1981 parameters.codecs[0].id = 96;
1982 parameters.codecs[2].id = 97; // wideband CN
1983 parameters.codecs[4].id = 98; // DTMF
1984 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985 webrtc::CodecInst gcodec;
1986 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1987 EXPECT_EQ(96, gcodec.pltype);
1988 EXPECT_STREQ("ISAC", gcodec.plname);
1989 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001990 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001991 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1992 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001993 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001994}
1995
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001996// Test that we set VAD and DTMF types correctly as callee.
1997TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001998 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001999 cricket::AudioSendParameters parameters;
2000 parameters.codecs.push_back(kIsacCodec);
2001 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002002 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002003 parameters.codecs.push_back(kCn16000Codec);
2004 parameters.codecs.push_back(kCn8000Codec);
2005 parameters.codecs.push_back(kTelephoneEventCodec);
2006 parameters.codecs.push_back(kRedCodec);
2007 parameters.codecs[0].id = 96;
2008 parameters.codecs[2].id = 97; // wideband CN
2009 parameters.codecs[4].id = 98; // DTMF
2010 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002011 EXPECT_TRUE(channel_->AddSendStream(
2012 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002013 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002014
2015 webrtc::CodecInst gcodec;
2016 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2017 EXPECT_EQ(96, gcodec.pltype);
2018 EXPECT_STREQ("ISAC", gcodec.plname);
2019 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002020 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002021 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2022 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002023 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002024}
2025
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026// Test that we only apply VAD if we have a CN codec that matches the
2027// send codec clockrate.
2028TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002029 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002030 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002031 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002032 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002033 parameters.codecs.push_back(kIsacCodec);
2034 parameters.codecs.push_back(kCn16000Codec);
2035 parameters.codecs[1].id = 97;
2036 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002037 webrtc::CodecInst gcodec;
2038 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2039 EXPECT_STREQ("ISAC", gcodec.plname);
2040 EXPECT_TRUE(voe_.GetVAD(channel_num));
2041 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2042 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002043 parameters.codecs[0] = kPcmuCodec;
2044 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002045 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2046 EXPECT_STREQ("PCMU", gcodec.plname);
2047 EXPECT_FALSE(voe_.GetVAD(channel_num));
2048 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002049 parameters.codecs[1] = kCn8000Codec;
2050 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2052 EXPECT_STREQ("PCMU", gcodec.plname);
2053 EXPECT_TRUE(voe_.GetVAD(channel_num));
2054 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002055 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002056 parameters.codecs[0] = kIsacCodec;
2057 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002058 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2059 EXPECT_STREQ("ISAC", gcodec.plname);
2060 EXPECT_FALSE(voe_.GetVAD(channel_num));
2061}
2062
2063// Test that we perform case-insensitive matching of codec names.
2064TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002065 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002066 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002067 cricket::AudioSendParameters parameters;
2068 parameters.codecs.push_back(kIsacCodec);
2069 parameters.codecs.push_back(kPcmuCodec);
2070 parameters.codecs.push_back(kCn16000Codec);
2071 parameters.codecs.push_back(kCn8000Codec);
2072 parameters.codecs.push_back(kTelephoneEventCodec);
2073 parameters.codecs.push_back(kRedCodec);
2074 parameters.codecs[0].name = "iSaC";
2075 parameters.codecs[0].id = 96;
2076 parameters.codecs[2].id = 97; // wideband CN
2077 parameters.codecs[4].id = 98; // DTMF
2078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079 webrtc::CodecInst gcodec;
2080 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2081 EXPECT_EQ(96, gcodec.pltype);
2082 EXPECT_STREQ("ISAC", gcodec.plname);
2083 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002084 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002085 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2086 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002087 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088}
2089
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002090// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002091TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002092 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002093 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002094 cricket::AudioSendParameters parameters;
2095 parameters.codecs.push_back(kRedCodec);
2096 parameters.codecs.push_back(kIsacCodec);
2097 parameters.codecs.push_back(kPcmuCodec);
2098 parameters.codecs[0].id = 127;
2099 parameters.codecs[0].params[""] = "96/96";
2100 parameters.codecs[1].id = 96;
2101 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102 webrtc::CodecInst gcodec;
2103 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2104 EXPECT_EQ(96, gcodec.pltype);
2105 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002106 EXPECT_TRUE(voe_.GetRED(channel_num));
2107 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108}
2109
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002110// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002111TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002112 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002113 cricket::AudioSendParameters parameters;
2114 parameters.codecs.push_back(kRedCodec);
2115 parameters.codecs.push_back(kIsacCodec);
2116 parameters.codecs.push_back(kPcmuCodec);
2117 parameters.codecs[0].id = 127;
2118 parameters.codecs[0].params[""] = "96/96";
2119 parameters.codecs[1].id = 96;
2120 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002121 EXPECT_TRUE(channel_->AddSendStream(
2122 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002123 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002124 webrtc::CodecInst gcodec;
2125 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2126 EXPECT_EQ(96, gcodec.pltype);
2127 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002128 EXPECT_TRUE(voe_.GetRED(channel_num));
2129 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002130}
2131
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002132// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002134 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002136 cricket::AudioSendParameters parameters;
2137 parameters.codecs.push_back(kRedCodec);
2138 parameters.codecs.push_back(kIsacCodec);
2139 parameters.codecs.push_back(kPcmuCodec);
2140 parameters.codecs[0].id = 127;
2141 parameters.codecs[1].id = 96;
2142 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143 webrtc::CodecInst gcodec;
2144 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2145 EXPECT_EQ(96, gcodec.pltype);
2146 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002147 EXPECT_TRUE(voe_.GetRED(channel_num));
2148 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002149}
2150
2151// Test that we ignore RED if the parameters aren't named the way we expect.
2152TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002153 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002154 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002155 cricket::AudioSendParameters parameters;
2156 parameters.codecs.push_back(kRedCodec);
2157 parameters.codecs.push_back(kIsacCodec);
2158 parameters.codecs.push_back(kPcmuCodec);
2159 parameters.codecs[0].id = 127;
2160 parameters.codecs[0].params["ABC"] = "96/96";
2161 parameters.codecs[1].id = 96;
2162 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002163 webrtc::CodecInst gcodec;
2164 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2165 EXPECT_EQ(96, gcodec.pltype);
2166 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002167 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002168}
2169
2170// Test that we ignore RED if it uses different primary/secondary encoding.
2171TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002172 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002174 cricket::AudioSendParameters parameters;
2175 parameters.codecs.push_back(kRedCodec);
2176 parameters.codecs.push_back(kIsacCodec);
2177 parameters.codecs.push_back(kPcmuCodec);
2178 parameters.codecs[0].id = 127;
2179 parameters.codecs[0].params[""] = "96/0";
2180 parameters.codecs[1].id = 96;
2181 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002182 webrtc::CodecInst gcodec;
2183 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2184 EXPECT_EQ(96, gcodec.pltype);
2185 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002186 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002187}
2188
2189// Test that we ignore RED if it uses more than 2 encodings.
2190TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002191 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002192 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002193 cricket::AudioSendParameters parameters;
2194 parameters.codecs.push_back(kRedCodec);
2195 parameters.codecs.push_back(kIsacCodec);
2196 parameters.codecs.push_back(kPcmuCodec);
2197 parameters.codecs[0].id = 127;
2198 parameters.codecs[0].params[""] = "96/96/96";
2199 parameters.codecs[1].id = 96;
2200 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201 webrtc::CodecInst gcodec;
2202 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2203 EXPECT_EQ(96, gcodec.pltype);
2204 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002205 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206}
2207
2208// Test that we ignore RED if it has bogus codec ids.
2209TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002210 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002211 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002212 cricket::AudioSendParameters parameters;
2213 parameters.codecs.push_back(kRedCodec);
2214 parameters.codecs.push_back(kIsacCodec);
2215 parameters.codecs.push_back(kPcmuCodec);
2216 parameters.codecs[0].id = 127;
2217 parameters.codecs[0].params[""] = "ABC/ABC";
2218 parameters.codecs[1].id = 96;
2219 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220 webrtc::CodecInst gcodec;
2221 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2222 EXPECT_EQ(96, gcodec.pltype);
2223 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002224 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002225}
2226
2227// Test that we ignore RED if it refers to a codec that is not present.
2228TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002229 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002231 cricket::AudioSendParameters parameters;
2232 parameters.codecs.push_back(kRedCodec);
2233 parameters.codecs.push_back(kIsacCodec);
2234 parameters.codecs.push_back(kPcmuCodec);
2235 parameters.codecs[0].id = 127;
2236 parameters.codecs[0].params[""] = "97/97";
2237 parameters.codecs[1].id = 96;
2238 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239 webrtc::CodecInst gcodec;
2240 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2241 EXPECT_EQ(96, gcodec.pltype);
2242 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002243 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244}
2245
stefanba4c0e42016-02-04 04:12:24 -08002246class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2247 public:
2248 WebRtcVoiceEngineWithSendSideBweTest()
2249 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2250};
2251
2252TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2253 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002254 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002255 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002256 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2257 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2258 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002259 extension.id);
2260 return;
2261 }
2262 }
2263 FAIL() << "Transport sequence number extension not in header-extension list.";
2264}
2265
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002266// Test support for audio level header extension.
2267TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002268 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002269}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002270TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002271 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002272}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002273
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002274// Test support for absolute send time header extension.
2275TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002276 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002277}
2278TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002279 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002280}
2281
solenberg1ac56142015-10-13 03:58:19 -07002282// Test that we can create a channel and start sending on it.
2283TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002284 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002285 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002286 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002287 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002288 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002289 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2290}
2291
2292// Test that a channel will send if and only if it has a source and is enabled
2293// for sending.
2294TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002295 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002296 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2297 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002298 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002299 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2300 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2301 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2302 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2303 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002304}
2305
solenberg6d6e7c52016-04-13 09:07:30 -07002306// Test that SetSendParameters() does not alter a stream's send state.
2307TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2308 EXPECT_TRUE(SetupSendStream());
2309 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2310
2311 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002312 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002313 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2314
2315 // Changing RTP header extensions will recreate the AudioSendStream.
2316 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002317 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002318 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2319 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2320
2321 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002322 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002323 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2324
2325 // Changing RTP header extensions will recreate the AudioSendStream.
2326 send_parameters_.extensions.clear();
2327 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2328 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2329}
2330
solenberg1ac56142015-10-13 03:58:19 -07002331// Test that we can create a channel and start playing out on it.
2332TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002333 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002334 int channel_num = voe_.GetLastChannel();
2335 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2336 EXPECT_TRUE(channel_->SetPlayout(true));
2337 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338 EXPECT_TRUE(channel_->SetPlayout(false));
2339 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2340}
2341
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002342// Test that we can add and remove send streams.
2343TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2344 SetupForMultiSendStream();
2345
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002346 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002347 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002348
solenbergc96df772015-10-21 13:01:53 -07002349 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002350 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002351 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002352 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002353 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002354 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002355 }
tfarina5237aaf2015-11-10 23:44:30 -08002356 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002357
solenbergc96df772015-10-21 13:01:53 -07002358 // Delete the send streams.
2359 for (uint32_t ssrc : kSsrcs4) {
2360 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002361 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002362 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002363 }
solenbergc96df772015-10-21 13:01:53 -07002364 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002365}
2366
2367// Test SetSendCodecs correctly configure the codecs in all send streams.
2368TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2369 SetupForMultiSendStream();
2370
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002371 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002372 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002373 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002374 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002375 }
2376
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002377 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002378 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002379 parameters.codecs.push_back(kIsacCodec);
2380 parameters.codecs.push_back(kCn16000Codec);
2381 parameters.codecs[1].id = 97;
2382 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002383
2384 // Verify ISAC and VAD are corrected configured on all send channels.
2385 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002386 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002387 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002388 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2389 EXPECT_STREQ("ISAC", gcodec.plname);
2390 EXPECT_TRUE(voe_.GetVAD(channel_num));
2391 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2392 }
2393
2394 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002395 parameters.codecs[0] = kPcmuCodec;
2396 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002397 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002398 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002399 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2400 EXPECT_STREQ("PCMU", gcodec.plname);
2401 EXPECT_FALSE(voe_.GetVAD(channel_num));
2402 }
2403}
2404
2405// Test we can SetSend on all send streams correctly.
2406TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2407 SetupForMultiSendStream();
2408
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002409 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002410 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002411 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002412 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002413 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2414 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002415 }
2416
2417 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002418 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002419 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002420 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002421 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002422 }
2423
2424 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002425 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002426 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002427 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002428 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002429 }
2430}
2431
2432// Test we can set the correct statistics on all send streams.
2433TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2434 SetupForMultiSendStream();
2435
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002436 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002437 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002438 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002439 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002440 }
solenberg85a04962015-10-27 03:35:21 -07002441 SetAudioSendStreamStats();
2442
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002443 // Create a receive stream to check that none of the send streams end up in
2444 // the receive stream stats.
2445 EXPECT_TRUE(channel_->AddRecvStream(
2446 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002447 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002448 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2449 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +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));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002455
solenberg85a04962015-10-27 03:35:21 -07002456 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002457 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002458 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002459 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002460 }
2461
2462 // We have added one receive stream. We should see empty stats.
2463 EXPECT_EQ(info.receivers.size(), 1u);
2464 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002465 }
solenberg1ac56142015-10-13 03:58:19 -07002466
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002467 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002468 {
2469 cricket::VoiceMediaInfo info;
2470 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2471 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002472 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002473 EXPECT_EQ(0u, info.receivers.size());
2474 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002475
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002476 // Deliver a new packet - a default receive stream should be created and we
2477 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002478 {
2479 cricket::VoiceMediaInfo info;
2480 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2481 SetAudioReceiveStreamStats();
2482 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002483 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002484 EXPECT_EQ(1u, info.receivers.size());
2485 VerifyVoiceReceiverInfo(info.receivers[0]);
2486 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002487}
2488
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002489// Test that we can add and remove receive streams, and do proper send/playout.
2490// We can receive on multiple streams while sending one stream.
2491TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002492 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002493 int channel_num1 = voe_.GetLastChannel();
2494
solenberg1ac56142015-10-13 03:58:19 -07002495 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002496 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002498 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499
solenberg1ac56142015-10-13 03:58:19 -07002500 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002501 EXPECT_TRUE(
2502 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002503 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002504 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002505 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002506
solenberg1ac56142015-10-13 03:58:19 -07002507 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2509 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2510
2511 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002512 EXPECT_TRUE(
2513 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514 int channel_num3 = voe_.GetLastChannel();
2515 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2516 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2517 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518
2519 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002520 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002521 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002522
2523 // Stop playout.
2524 EXPECT_TRUE(channel_->SetPlayout(false));
2525 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2526 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2527 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2528
solenberg1ac56142015-10-13 03:58:19 -07002529 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530 EXPECT_TRUE(channel_->SetPlayout(true));
2531 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2532 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2533 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2534
solenberg1ac56142015-10-13 03:58:19 -07002535 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2537 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002538 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539}
2540
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002542// and start sending on it.
2543TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002544 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002545 cricket::AudioOptions options_adjust_agc;
2546 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547 webrtc::AgcConfig agc_config;
2548 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2549 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002550 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002551 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002552 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002553 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002554 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2555 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002556 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002557 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002558 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559}
2560
wu@webrtc.org97077a32013-10-25 21:18:33 +00002561TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002562 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002563 EXPECT_CALL(adm_,
2564 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002565 webrtc::AgcConfig agc_config;
2566 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2567 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002568 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2569 send_parameters_.options.tx_agc_digital_compression_gain =
2570 rtc::Optional<uint16_t>(9);
2571 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2572 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2573 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002574 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2575 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2576 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2577 EXPECT_TRUE(agc_config.limiterEnable);
2578
2579 // Check interaction with adjust_agc_delta. Both should be respected, for
2580 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002581 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2582 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002583 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2584 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2585}
2586
wu@webrtc.org97077a32013-10-25 21:18:33 +00002587TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002588 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002589 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2590 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002591 send_parameters_.options.recording_sample_rate =
2592 rtc::Optional<uint32_t>(48000);
2593 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2594 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002595}
2596
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002598// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002599TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002600 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002601 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002602}
2603
2604TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2605 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002606 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002607 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002608 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002609 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002610 EXPECT_TRUE(channel_->AddRecvStream(
2611 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002612 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2613 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614
solenberg85a04962015-10-27 03:35:21 -07002615 // Check stats for the added streams.
2616 {
2617 cricket::VoiceMediaInfo info;
2618 EXPECT_EQ(true, channel_->GetStats(&info));
2619
2620 // We have added one send stream. We should see the stats we've set.
2621 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002622 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002623 // We have added one receive stream. We should see empty stats.
2624 EXPECT_EQ(info.receivers.size(), 1u);
2625 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2626 }
solenberg1ac56142015-10-13 03:58:19 -07002627
solenberg566ef242015-11-06 15:34:49 -08002628 // Start sending - this affects some reported stats.
2629 {
2630 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002631 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002632 EXPECT_EQ(true, channel_->GetStats(&info));
2633 VerifyVoiceSenderInfo(info.senders[0], true);
2634 }
2635
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002636 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002637 {
2638 cricket::VoiceMediaInfo info;
2639 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2640 EXPECT_EQ(true, channel_->GetStats(&info));
2641 EXPECT_EQ(1u, info.senders.size());
2642 EXPECT_EQ(0u, info.receivers.size());
2643 }
solenberg1ac56142015-10-13 03:58:19 -07002644
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002645 // Deliver a new packet - a default receive stream should be created and we
2646 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002647 {
2648 cricket::VoiceMediaInfo info;
2649 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2650 SetAudioReceiveStreamStats();
2651 EXPECT_EQ(true, channel_->GetStats(&info));
2652 EXPECT_EQ(1u, info.senders.size());
2653 EXPECT_EQ(1u, info.receivers.size());
2654 VerifyVoiceReceiverInfo(info.receivers[0]);
2655 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656}
2657
2658// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002659// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002661 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002662 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002663 EXPECT_TRUE(channel_->AddRecvStream(
2664 cricket::StreamParams::CreateLegacy(kSsrc2)));
2665 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002666}
2667
2668// Test that the local SSRC is the same on sending and receiving channels if the
2669// receive channel is created before the send channel.
2670TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002671 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2673 int receive_channel_num = voe_.GetLastChannel();
2674 EXPECT_TRUE(channel_->AddSendStream(
2675 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676
solenberg3a941542015-11-16 07:34:50 -08002677 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002678 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679}
2680
2681// Test that we can properly receive packets.
2682TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002683 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002684 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002686
2687 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2688 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689}
2690
2691// Test that we can properly receive packets on multiple streams.
2692TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002693 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002694 const uint32_t ssrc1 = 1;
2695 const uint32_t ssrc2 = 2;
2696 const uint32_t ssrc3 = 3;
2697 EXPECT_TRUE(channel_->AddRecvStream(
2698 cricket::StreamParams::CreateLegacy(ssrc1)));
2699 EXPECT_TRUE(channel_->AddRecvStream(
2700 cricket::StreamParams::CreateLegacy(ssrc2)));
2701 EXPECT_TRUE(channel_->AddRecvStream(
2702 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002703 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002704 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002705 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002706 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002707 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002708 }
mflodman3d7db262016-04-29 00:57:13 -07002709
2710 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2711 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2712 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2713
2714 EXPECT_EQ(s1.received_packets(), 0);
2715 EXPECT_EQ(s2.received_packets(), 0);
2716 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002717
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002719 EXPECT_EQ(s1.received_packets(), 0);
2720 EXPECT_EQ(s2.received_packets(), 0);
2721 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002722
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002724 EXPECT_EQ(s1.received_packets(), 1);
2725 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2726 EXPECT_EQ(s2.received_packets(), 0);
2727 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002728
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002729 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002730 EXPECT_EQ(s1.received_packets(), 1);
2731 EXPECT_EQ(s2.received_packets(), 1);
2732 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2733 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002734
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002735 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002736 EXPECT_EQ(s1.received_packets(), 1);
2737 EXPECT_EQ(s2.received_packets(), 1);
2738 EXPECT_EQ(s3.received_packets(), 1);
2739 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002740
mflodman3d7db262016-04-29 00:57:13 -07002741 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2742 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2743 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002744}
2745
solenberg7e63ef02015-11-20 00:19:43 -08002746// Test that receiving on an unsignalled stream works (default channel will be
2747// created).
2748TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002749 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002750 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2751
solenberg7e63ef02015-11-20 00:19:43 -08002752 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002753
2754 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2755 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2756 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002757}
2758
2759// Test that receiving on an unsignalled stream works (default channel will be
2760// created), and that packets will be forwarded to the default channel
2761// regardless of their SSRCs.
2762TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002763 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002764 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002765 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2766
mflodman3d7db262016-04-29 00:57:13 -07002767 // Note that ssrc = 0 is not supported.
2768 uint32_t ssrc = 1;
2769 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002770 rtc::SetBE32(&packet[8], ssrc);
2771 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002772
2773 // Verify we only have one default stream.
2774 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2775 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2776 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002777 }
mflodman3d7db262016-04-29 00:57:13 -07002778
2779 // Sending the same ssrc again should not create a new stream.
2780 --ssrc;
2781 DeliverPacket(packet, sizeof(packet));
2782 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2783 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2784 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002785}
2786
2787// Test that a default channel is created even after a signalled stream has been
2788// added, and that this stream will get any packets for unknown SSRCs.
2789TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002790 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002791 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002792 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2793
2794 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002795 const uint32_t signaled_ssrc = 1;
2796 rtc::SetBE32(&packet[8], signaled_ssrc);
2797 EXPECT_TRUE(channel_->AddRecvStream(
2798 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002799 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002800 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2801 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002802
2803 // Note that the first unknown SSRC cannot be 0, because we only support
2804 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002805 const uint32_t unsignaled_ssrc = 7011;
2806 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002807 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002808 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2809 packet, sizeof(packet)));
2810 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2811
2812 DeliverPacket(packet, sizeof(packet));
2813 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2814
2815 rtc::SetBE32(&packet[8], signaled_ssrc);
2816 DeliverPacket(packet, sizeof(packet));
2817 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2818 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002819}
2820
solenberg0a617e22015-10-20 15:49:38 -07002821// Test that we properly handle failures to add a receive stream.
2822TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002823 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002825 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002826}
2827
solenberg0a617e22015-10-20 15:49:38 -07002828// Test that we properly handle failures to add a send stream.
2829TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002830 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002831 voe_.set_fail_create_channel(true);
2832 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2833}
2834
solenberg1ac56142015-10-13 03:58:19 -07002835// Test that AddRecvStream creates new stream.
2836TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002837 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002838 int channel_num = voe_.GetLastChannel();
2839 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002840 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002841}
2842
2843// Test that after adding a recv stream, we do not decode more codecs than
2844// those previously passed into SetRecvCodecs.
2845TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002846 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002847 cricket::AudioRecvParameters parameters;
2848 parameters.codecs.push_back(kIsacCodec);
2849 parameters.codecs.push_back(kPcmuCodec);
2850 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002851 EXPECT_TRUE(channel_->AddRecvStream(
2852 cricket::StreamParams::CreateLegacy(kSsrc1)));
2853 int channel_num2 = voe_.GetLastChannel();
2854 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002855 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002856 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002857 gcodec.channels = 2;
2858 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2859}
2860
2861// Test that we properly clean up any streams that were added, even if
2862// not explicitly removed.
2863TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002864 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002865 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002866 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2867 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2868 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2869 delete channel_;
2870 channel_ = NULL;
2871 EXPECT_EQ(0, voe_.GetNumChannels());
2872}
2873
wu@webrtc.org78187522013-10-07 23:32:02 +00002874TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002875 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002876 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2877}
2878
2879TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002880 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002881 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002882 // Manually delete channel to simulate a failure.
2883 int channel = voe_.GetLastChannel();
2884 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2885 // Add recv stream 2 should work.
2886 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002887 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002888 EXPECT_NE(channel, new_channel);
2889 // The last created channel is deleted too.
2890 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002891}
2892
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002893// Test the InsertDtmf on default send stream as caller.
2894TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2895 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002896}
2897
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002898// Test the InsertDtmf on default send stream as callee
2899TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2900 TestInsertDtmf(0, false);
2901}
2902
2903// Test the InsertDtmf on specified send stream as caller.
2904TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2905 TestInsertDtmf(kSsrc1, true);
2906}
2907
2908// Test the InsertDtmf on specified send stream as callee.
2909TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2910 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911}
2912
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002913TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002914 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002915 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002916 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2918 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2919 EXPECT_TRUE(channel_->SetPlayout(true));
2920 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2921 EXPECT_TRUE(channel_->SetPlayout(false));
2922 EXPECT_FALSE(channel_->SetPlayout(true));
2923}
2924
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002925TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002926 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002927 EXPECT_CALL(adm_,
2928 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2929 EXPECT_CALL(adm_,
2930 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2931 EXPECT_CALL(adm_,
2932 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933 bool ec_enabled;
2934 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935 webrtc::AecmModes aecm_mode;
2936 bool cng_enabled;
2937 bool agc_enabled;
2938 webrtc::AgcModes agc_mode;
2939 webrtc::AgcConfig agc_config;
2940 bool ns_enabled;
2941 webrtc::NsModes ns_mode;
2942 bool highpass_filter_enabled;
2943 bool stereo_swapping_enabled;
2944 bool typing_detection_enabled;
2945 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 voe_.GetAecmMode(aecm_mode, cng_enabled);
2947 voe_.GetAgcStatus(agc_enabled, agc_mode);
2948 voe_.GetAgcConfig(agc_config);
2949 voe_.GetNsStatus(ns_enabled, ns_mode);
2950 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2951 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2952 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2953 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002954 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002955 EXPECT_FALSE(cng_enabled);
2956 EXPECT_TRUE(agc_enabled);
2957 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2958 EXPECT_TRUE(ns_enabled);
2959 EXPECT_TRUE(highpass_filter_enabled);
2960 EXPECT_FALSE(stereo_swapping_enabled);
2961 EXPECT_TRUE(typing_detection_enabled);
2962 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2963 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002964 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2965 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002966
solenberg246b8172015-12-08 09:50:23 -08002967 // Nothing set in AudioOptions, so everything should be as default.
2968 send_parameters_.options = cricket::AudioOptions();
2969 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002970 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971 voe_.GetAecmMode(aecm_mode, cng_enabled);
2972 voe_.GetAgcStatus(agc_enabled, agc_mode);
2973 voe_.GetAgcConfig(agc_config);
2974 voe_.GetNsStatus(ns_enabled, ns_mode);
2975 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2976 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2977 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2978 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002979 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002980 EXPECT_FALSE(cng_enabled);
2981 EXPECT_TRUE(agc_enabled);
2982 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2983 EXPECT_TRUE(ns_enabled);
2984 EXPECT_TRUE(highpass_filter_enabled);
2985 EXPECT_FALSE(stereo_swapping_enabled);
2986 EXPECT_TRUE(typing_detection_enabled);
2987 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2988 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002989 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2990 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002991
2992 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002993 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2994 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995 voe_.GetEcStatus(ec_enabled, ec_mode);
2996 EXPECT_FALSE(ec_enabled);
2997
2998 // Turn echo cancellation back on, with settings, and make sure
2999 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08003000 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
3001 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003002 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003 voe_.GetAecmMode(aecm_mode, cng_enabled);
3004 voe_.GetAgcStatus(agc_enabled, agc_mode);
3005 voe_.GetAgcConfig(agc_config);
3006 voe_.GetNsStatus(ns_enabled, ns_mode);
3007 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3008 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3009 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3010 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003011 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003012 EXPECT_TRUE(agc_enabled);
3013 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3014 EXPECT_TRUE(ns_enabled);
3015 EXPECT_TRUE(highpass_filter_enabled);
3016 EXPECT_FALSE(stereo_swapping_enabled);
3017 EXPECT_TRUE(typing_detection_enabled);
3018 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3019 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
3020
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003021 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
3022 // control.
solenberg246b8172015-12-08 09:50:23 -08003023 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3024 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003025 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003026 voe_.GetAecmMode(aecm_mode, cng_enabled);
3027 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003028 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003029 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3030
3031 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08003032 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
3033 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
3034 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
3035 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003036 voe_.GetEcStatus(ec_enabled, ec_mode);
3037 EXPECT_FALSE(ec_enabled);
3038 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08003039 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3040 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003041 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003042 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003043 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003044 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3045
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003046 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08003047 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
3048 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003049 voe_.GetAgcStatus(agc_enabled, agc_mode);
3050 EXPECT_FALSE(agc_enabled);
3051
3052 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08003053 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
3054 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
3055 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003056 voe_.GetAgcStatus(agc_enabled, agc_mode);
3057 EXPECT_TRUE(agc_enabled);
3058 voe_.GetAgcConfig(agc_config);
3059 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3060
3061 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08003062 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
3063 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
3064 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
3065 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
3066 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003067 voe_.GetNsStatus(ns_enabled, ns_mode);
3068 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3069 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3070 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3071 EXPECT_FALSE(ns_enabled);
3072 EXPECT_FALSE(highpass_filter_enabled);
3073 EXPECT_FALSE(typing_detection_enabled);
3074 EXPECT_TRUE(stereo_swapping_enabled);
3075
solenberg1ac56142015-10-13 03:58:19 -07003076 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08003077 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003078 voe_.GetEcStatus(ec_enabled, ec_mode);
3079 voe_.GetNsStatus(ns_enabled, ns_mode);
3080 EXPECT_TRUE(ec_enabled);
3081 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3082 EXPECT_FALSE(ns_enabled);
3083 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3084}
3085
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003086TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003087 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003088
3089 bool ec_enabled;
3090 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003091 bool agc_enabled;
3092 webrtc::AgcModes agc_mode;
3093 bool ns_enabled;
3094 webrtc::NsModes ns_mode;
3095 bool highpass_filter_enabled;
3096 bool stereo_swapping_enabled;
3097 bool typing_detection_enabled;
3098
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003099 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003100 voe_.GetAgcStatus(agc_enabled, agc_mode);
3101 voe_.GetNsStatus(ns_enabled, ns_mode);
3102 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3103 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3104 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3105 EXPECT_TRUE(ec_enabled);
3106 EXPECT_TRUE(agc_enabled);
3107 EXPECT_TRUE(ns_enabled);
3108 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003109 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003110 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003111}
3112
3113TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3114 webrtc::AgcConfig set_config = {0};
3115 set_config.targetLeveldBOv = 3;
3116 set_config.digitalCompressionGaindB = 9;
3117 set_config.limiterEnable = true;
3118 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003119
3120 webrtc::AgcConfig config = {0};
3121 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3122 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3123 EXPECT_EQ(set_config.digitalCompressionGaindB,
3124 config.digitalCompressionGaindB);
3125 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3126}
3127
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003129 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003130 EXPECT_CALL(adm_,
3131 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3132 EXPECT_CALL(adm_,
3133 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3134 EXPECT_CALL(adm_,
3135 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3136
kwiberg686a8ef2016-02-26 03:00:35 -08003137 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003138 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003139 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003140 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003141 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003142 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003143
3144 // Have to add a stream to make SetSend work.
3145 cricket::StreamParams stream1;
3146 stream1.ssrcs.push_back(1);
3147 channel1->AddSendStream(stream1);
3148 cricket::StreamParams stream2;
3149 stream2.ssrcs.push_back(2);
3150 channel2->AddSendStream(stream2);
3151
3152 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003153 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003154 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3155 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3156 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003157 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3158 EXPECT_EQ(parameters_options_all.options, channel1->options());
3159 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3160 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003161
3162 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003163 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003164 parameters_options_no_ns.options.noise_suppression =
3165 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003166 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3167 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003168 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3169 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3170 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003171 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003172
3173 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003174 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003175 parameters_options_no_agc.options.auto_gain_control =
3176 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003177 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003178 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3179 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3180 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003181 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003182
solenberg246b8172015-12-08 09:50:23 -08003183 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003184 bool ec_enabled;
3185 webrtc::EcModes ec_mode;
3186 bool agc_enabled;
3187 webrtc::AgcModes agc_mode;
3188 bool ns_enabled;
3189 webrtc::NsModes ns_mode;
3190 voe_.GetEcStatus(ec_enabled, ec_mode);
3191 voe_.GetAgcStatus(agc_enabled, agc_mode);
3192 voe_.GetNsStatus(ns_enabled, ns_mode);
3193 EXPECT_TRUE(ec_enabled);
3194 EXPECT_TRUE(agc_enabled);
3195 EXPECT_TRUE(ns_enabled);
3196
solenbergd53a3f92016-04-14 13:56:37 -07003197 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003198 voe_.GetEcStatus(ec_enabled, ec_mode);
3199 voe_.GetAgcStatus(agc_enabled, agc_mode);
3200 voe_.GetNsStatus(ns_enabled, ns_mode);
3201 EXPECT_TRUE(ec_enabled);
3202 EXPECT_TRUE(agc_enabled);
3203 EXPECT_FALSE(ns_enabled);
3204
solenbergd53a3f92016-04-14 13:56:37 -07003205 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003206 voe_.GetEcStatus(ec_enabled, ec_mode);
3207 voe_.GetAgcStatus(agc_enabled, agc_mode);
3208 voe_.GetNsStatus(ns_enabled, ns_mode);
3209 EXPECT_TRUE(ec_enabled);
3210 EXPECT_FALSE(agc_enabled);
3211 EXPECT_TRUE(ns_enabled);
3212
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003213 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003214 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003215 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3216 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003217 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003218 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003219 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003220 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003221 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003222 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003223 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3224 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3225 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003226 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003227 voe_.GetEcStatus(ec_enabled, ec_mode);
3228 voe_.GetAgcStatus(agc_enabled, agc_mode);
3229 voe_.GetNsStatus(ns_enabled, ns_mode);
3230 EXPECT_TRUE(ec_enabled);
3231 EXPECT_FALSE(agc_enabled);
3232 EXPECT_FALSE(ns_enabled);
3233}
3234
wu@webrtc.orgde305012013-10-31 15:40:38 +00003235// This test verifies DSCP settings are properly applied on voice media channel.
3236TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003237 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003238 cricket::FakeNetworkInterface network_interface;
3239 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003240 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003241
solenbergbc37fc82016-04-04 09:54:44 -07003242 channel.reset(
3243 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003244 channel->SetInterface(&network_interface);
3245 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3246 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3247
3248 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003249 channel.reset(
3250 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003251 channel->SetInterface(&network_interface);
3252 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3253
3254 // Verify that setting the option to false resets the
3255 // DiffServCodePoint.
3256 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003257 channel.reset(
3258 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003259 channel->SetInterface(&network_interface);
3260 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3261 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3262
3263 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003264}
3265
solenberg1ac56142015-10-13 03:58:19 -07003266TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003267 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003268 cricket::WebRtcVoiceMediaChannel* media_channel =
3269 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003270 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3271 EXPECT_TRUE(channel_->AddRecvStream(
3272 cricket::StreamParams::CreateLegacy(kSsrc1)));
3273 int channel_id = voe_.GetLastChannel();
3274 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3275 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3276 EXPECT_TRUE(channel_->AddRecvStream(
3277 cricket::StreamParams::CreateLegacy(kSsrc2)));
3278 int channel_id2 = voe_.GetLastChannel();
3279 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003280}
3281
solenberg1ac56142015-10-13 03:58:19 -07003282TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003283 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003284 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003285 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3286 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3287 EXPECT_TRUE(channel_->AddSendStream(
3288 cricket::StreamParams::CreateLegacy(kSsrc1)));
3289 int channel_id = voe_.GetLastChannel();
3290 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3291 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3292 EXPECT_TRUE(channel_->AddSendStream(
3293 cricket::StreamParams::CreateLegacy(kSsrc2)));
3294 int channel_id2 = voe_.GetLastChannel();
3295 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003296}
3297
solenberg4bac9c52015-10-09 02:32:53 -07003298TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003299 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003300 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003301 cricket::StreamParams stream;
3302 stream.ssrcs.push_back(kSsrc2);
3303 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003304 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003305 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003306 float scale = 0;
3307 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3308 EXPECT_DOUBLE_EQ(3, scale);
3309}
3310
3311TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003312 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003313 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3314 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3315 int channel_id = voe_.GetLastChannel();
3316 float scale = 0;
3317 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3318 EXPECT_DOUBLE_EQ(2, scale);
3319 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003320 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003321 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003322}
3323
pbos8fc7fa72015-07-15 08:02:58 -07003324TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003325 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003326 const std::string kSyncLabel = "AvSyncLabel";
3327
solenbergff976312016-03-30 23:28:51 -07003328 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003329 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3330 sp.sync_label = kSyncLabel;
3331 // Creating two channels to make sure that sync label is set properly for both
3332 // the default voice channel and following ones.
3333 EXPECT_TRUE(channel_->AddRecvStream(sp));
3334 sp.ssrcs[0] += 1;
3335 EXPECT_TRUE(channel_->AddRecvStream(sp));
3336
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003337 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003338 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003339 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003340 << "SyncGroup should be set based on sync_label";
3341 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003342 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003343 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003344}
3345
solenberg3a941542015-11-16 07:34:50 -08003346// TODO(solenberg): Remove, once recv streams are configured through Call.
3347// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003348TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003349 // Test that setting the header extensions results in the expected state
3350 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003351 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003352 ssrcs.push_back(223);
3353 ssrcs.push_back(224);
3354
solenbergff976312016-03-30 23:28:51 -07003355 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003356 cricket::WebRtcVoiceMediaChannel* media_channel =
3357 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003358 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003359 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003360 EXPECT_TRUE(media_channel->AddRecvStream(
3361 cricket::StreamParams::CreateLegacy(ssrc)));
3362 }
3363
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003364 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003365 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003366 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003367 EXPECT_NE(nullptr, s);
3368 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3369 }
3370
3371 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003372 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003373 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003374 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003375 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003376 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003377 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003378 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003379 EXPECT_NE(nullptr, s);
3380 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003381 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3382 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003383 for (const auto& s_ext : s_exts) {
3384 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003385 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003386 }
3387 }
3388 }
3389 }
3390
3391 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003392 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003393 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003394 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003395 EXPECT_NE(nullptr, s);
3396 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3397 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003398}
3399
3400TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3401 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003402 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003403 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003404 static const unsigned char kRtcp[] = {
3405 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3406 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3409 };
jbaucheec21bd2016-03-20 06:15:43 -07003410 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003411
solenbergff976312016-03-30 23:28:51 -07003412 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003413 cricket::WebRtcVoiceMediaChannel* media_channel =
3414 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003415 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003416 EXPECT_TRUE(media_channel->AddRecvStream(
3417 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3418
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003419 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003420 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003421 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003422 EXPECT_EQ(0, s->received_packets());
3423 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3424 EXPECT_EQ(1, s->received_packets());
3425 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3426 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003427}
Minyue2013aec2015-05-13 14:14:42 +02003428
solenberg0a617e22015-10-20 15:49:38 -07003429// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003430// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003431TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003432 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003433 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003434 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003435 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3436 int recv_ch = voe_.GetLastChannel();
3437 EXPECT_NE(recv_ch, default_channel);
3438 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3439 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3440 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003441 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3442 recv_ch = voe_.GetLastChannel();
3443 EXPECT_NE(recv_ch, default_channel);
3444 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003445}
3446
3447TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003448 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003449 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003450
3451 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3452 int recv_ch = voe_.GetLastChannel();
3453
3454 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3455 int send_ch = voe_.GetLastChannel();
3456
3457 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3458 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3459 // channel of |recv_ch|.This is not a common case, since, normally, only the
3460 // default channel can be associated. However, the default is not deletable.
3461 // So we force the |recv_ch| to associate with a non-default channel.
3462 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3463 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3464
3465 EXPECT_TRUE(channel_->RemoveSendStream(2));
3466 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3467}
stefan658910c2015-09-03 05:48:32 -07003468
deadbeef884f5852016-01-15 09:20:04 -08003469TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003470 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003471 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3472 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003473
3474 // Setting the sink before a recv stream exists should do nothing.
3475 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3476 EXPECT_TRUE(
3477 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3478 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3479
3480 // Now try actually setting the sink.
3481 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3482 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3483
3484 // Now try resetting it.
3485 channel_->SetRawAudioSink(kSsrc1, nullptr);
3486 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3487}
3488
3489TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003490 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003491 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3492 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003493
3494 // Should be able to set a default sink even when no stream exists.
3495 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3496
3497 // Create default channel and ensure it's assigned the default sink.
3498 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3499 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3500
3501 // Try resetting the default sink.
3502 channel_->SetRawAudioSink(0, nullptr);
3503 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3504
3505 // Try setting the default sink while the default stream exists.
3506 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3507 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3508
3509 // If we remove and add a default stream, it should get the same sink.
3510 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3511 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3512 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3513}
3514
skvlad7a43d252016-03-22 15:32:27 -07003515// Test that, just like the video channel, the voice channel communicates the
3516// network state to the call.
3517TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003518 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003519
3520 EXPECT_EQ(webrtc::kNetworkUp,
3521 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3522 EXPECT_EQ(webrtc::kNetworkUp,
3523 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3524
3525 channel_->OnReadyToSend(false);
3526 EXPECT_EQ(webrtc::kNetworkDown,
3527 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3528 EXPECT_EQ(webrtc::kNetworkUp,
3529 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3530
3531 channel_->OnReadyToSend(true);
3532 EXPECT_EQ(webrtc::kNetworkUp,
3533 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3534 EXPECT_EQ(webrtc::kNetworkUp,
3535 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3536}
3537
stefan658910c2015-09-03 05:48:32 -07003538// Tests that the library initializes and shuts down properly.
3539TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003540 using testing::_;
3541 using testing::AnyNumber;
3542
3543 // If the VoiceEngine wants to gather available codecs early, that's fine but
3544 // we never want it to create a decoder at this stage.
3545 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
3546 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
3547 ON_CALL(*factory.get(), GetSupportedFormats())
3548 .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
3549 EXPECT_CALL(*factory.get(), GetSupportedFormats())
3550 .Times(AnyNumber());
3551 EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
3552
3553 cricket::WebRtcVoiceEngine engine(nullptr, factory);
kwiberg686a8ef2016-02-26 03:00:35 -08003554 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003555 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003556 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3557 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003558 EXPECT_TRUE(channel != nullptr);
3559 delete channel;
solenbergff976312016-03-30 23:28:51 -07003560}
stefan658910c2015-09-03 05:48:32 -07003561
solenbergff976312016-03-30 23:28:51 -07003562// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003563TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3564 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3565 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3566 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003567 {
ossu29b1a8d2016-06-13 07:34:51 -07003568 cricket::WebRtcVoiceEngine engine(&adm, nullptr);
solenbergff976312016-03-30 23:28:51 -07003569 std::unique_ptr<webrtc::Call> call(
3570 webrtc::Call::Create(webrtc::Call::Config()));
3571 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3572 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3573 EXPECT_TRUE(channel != nullptr);
3574 delete channel;
3575 }
stefan658910c2015-09-03 05:48:32 -07003576}
3577
3578// Tests that the library is configured with the codecs we want.
3579TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003580 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3581 // module.
3582
stefan658910c2015-09-03 05:48:32 -07003583 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003584 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003585 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003586 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003587 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003588 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003589 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003590 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003591 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003592 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003593 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003594 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003595 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003596 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003597 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003598 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003599 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003600 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003601 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003602 cricket::AudioCodec(96, "red", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003603 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003604 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003605 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003606 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003607 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003608 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003609 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003610 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003611 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003612 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003613 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003614 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003615 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003616 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003617 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003618 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003619 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003620 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003621 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003622 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003623 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003624 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003625 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003626 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003627 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003628 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003629 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003630 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003631 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003632 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003633 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003634
stefan658910c2015-09-03 05:48:32 -07003635 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossu29b1a8d2016-06-13 07:34:51 -07003636 cricket::WebRtcVoiceEngine engine(nullptr,
3637 webrtc::CreateBuiltinAudioDecoderFactory());
stefan658910c2015-09-03 05:48:32 -07003638 for (std::vector<cricket::AudioCodec>::const_iterator it =
3639 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3640 if (it->name == "CN" && it->clockrate == 16000) {
3641 EXPECT_EQ(105, it->id);
3642 } else if (it->name == "CN" && it->clockrate == 32000) {
3643 EXPECT_EQ(106, it->id);
3644 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3645 EXPECT_EQ(103, it->id);
3646 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3647 EXPECT_EQ(104, it->id);
3648 } else if (it->name == "G722" && it->clockrate == 8000) {
3649 EXPECT_EQ(9, it->id);
3650 } else if (it->name == "telephone-event") {
3651 EXPECT_EQ(126, it->id);
3652 } else if (it->name == "red") {
3653 EXPECT_EQ(127, it->id);
3654 } else if (it->name == "opus") {
3655 EXPECT_EQ(111, it->id);
3656 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3657 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003658 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3659 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3660 }
3661 }
stefan658910c2015-09-03 05:48:32 -07003662}
3663
3664// Tests that VoE supports at least 32 channels
3665TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossu29b1a8d2016-06-13 07:34:51 -07003666 cricket::WebRtcVoiceEngine engine(nullptr, nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003667 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003668 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003669
3670 cricket::VoiceMediaChannel* channels[32];
3671 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003672 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003673 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3674 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003675 if (!channel)
3676 break;
stefan658910c2015-09-03 05:48:32 -07003677 channels[num_channels++] = channel;
3678 }
3679
tfarina5237aaf2015-11-10 23:44:30 -08003680 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003681 EXPECT_EQ(expected, num_channels);
3682
3683 while (num_channels > 0) {
3684 delete channels[--num_channels];
3685 }
stefan658910c2015-09-03 05:48:32 -07003686}
3687
3688// Test that we set our preferred codecs properly.
3689TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003690 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3691 // - Check that our builtin codecs are usable by Channel.
3692 // - The codecs provided by the engine is usable by Channel.
3693 // It does not check that the codecs in the RecvParameters are actually
3694 // what we sent in - though it's probably reasonable to expect so, if
3695 // SetRecvParameters returns true.
3696 // I think it will become clear once audio decoder injection is completed.
3697 cricket::WebRtcVoiceEngine engine(
3698 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003699 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003700 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003701 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3702 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003703 cricket::AudioRecvParameters parameters;
3704 parameters.codecs = engine.codecs();
3705 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003706}