blob: c6cac1bd8dd944e1f6accd03ba0400340b46a32b [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).
ossudedfd282016-06-14 07:12:39 -0700528// TODO(ossu): This test should move into a separate builtin audio codecs
529// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700530TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700531 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 ASSERT_FALSE(codecs.empty());
533 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
534 EXPECT_EQ(48000, codecs[0].clockrate);
535 EXPECT_EQ(2, codecs[0].channels);
536 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537}
538
stefanba4c0e42016-02-04 04:12:24 -0800539TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700540 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800541 bool opus_found = false;
542 for (cricket::AudioCodec codec : codecs) {
543 if (codec.name == "opus") {
544 EXPECT_TRUE(HasTransportCc(codec));
545 opus_found = true;
546 }
547 }
548 EXPECT_TRUE(opus_found);
549}
550
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000551// Tests that we can find codecs by name or id, and that we interpret the
552// clockrate and bitrate fields properly.
553TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
554 cricket::AudioCodec codec;
555 webrtc::CodecInst codec_inst;
556 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800557 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800559 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800561 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
562 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 // Find ISAC with a different payload id.
564 codec = kIsacCodec;
565 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800566 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 EXPECT_EQ(codec.id, codec_inst.pltype);
568 // Find PCMU with a 0 clockrate.
569 codec = kPcmuCodec;
570 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800571 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 EXPECT_EQ(codec.id, codec_inst.pltype);
573 EXPECT_EQ(8000, codec_inst.plfreq);
574 // Find PCMU with a 0 bitrate.
575 codec = kPcmuCodec;
576 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800577 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578 EXPECT_EQ(codec.id, codec_inst.pltype);
579 EXPECT_EQ(64000, codec_inst.rate);
580 // Find ISAC with an explicit bitrate.
581 codec = kIsacCodec;
582 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800583 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 EXPECT_EQ(codec.id, codec_inst.pltype);
585 EXPECT_EQ(32000, codec_inst.rate);
586}
587
588// Test that we set our inbound codecs properly, including changing PT.
589TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700590 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200591 cricket::AudioRecvParameters parameters;
592 parameters.codecs.push_back(kIsacCodec);
593 parameters.codecs.push_back(kPcmuCodec);
594 parameters.codecs.push_back(kTelephoneEventCodec);
595 parameters.codecs[0].id = 106; // collide with existing telephone-event
596 parameters.codecs[2].id = 126;
597 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700598 EXPECT_TRUE(channel_->AddRecvStream(
599 cricket::StreamParams::CreateLegacy(kSsrc1)));
600 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800602 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 gcodec.plfreq = 16000;
604 gcodec.channels = 1;
605 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
606 EXPECT_EQ(106, gcodec.pltype);
607 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800608 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 gcodec.plfreq = 8000;
610 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
611 EXPECT_EQ(126, gcodec.pltype);
612 EXPECT_STREQ("telephone-event", gcodec.plname);
613}
614
615// Test that we fail to set an unknown inbound codec.
616TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700617 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200618 cricket::AudioRecvParameters parameters;
619 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700620 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200621 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622}
623
624// Test that we fail if we have duplicate types in the inbound list.
625TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700626 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200627 cricket::AudioRecvParameters parameters;
628 parameters.codecs.push_back(kIsacCodec);
629 parameters.codecs.push_back(kCn16000Codec);
630 parameters.codecs[1].id = kIsacCodec.id;
631 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632}
633
634// Test that we can decode OPUS without stereo parameters.
635TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700636 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200637 cricket::AudioRecvParameters parameters;
638 parameters.codecs.push_back(kIsacCodec);
639 parameters.codecs.push_back(kPcmuCodec);
640 parameters.codecs.push_back(kOpusCodec);
641 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000642 EXPECT_TRUE(channel_->AddRecvStream(
643 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700644 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800646 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 // Even without stereo parameters, recv codecs still specify channels = 2.
648 EXPECT_EQ(2, opus.channels);
649 EXPECT_EQ(111, opus.pltype);
650 EXPECT_STREQ("opus", opus.plname);
651 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700652 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 EXPECT_EQ(111, opus.pltype);
654}
655
656// Test that we can decode OPUS with stereo = 0.
657TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700658 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200659 cricket::AudioRecvParameters parameters;
660 parameters.codecs.push_back(kIsacCodec);
661 parameters.codecs.push_back(kPcmuCodec);
662 parameters.codecs.push_back(kOpusCodec);
663 parameters.codecs[2].params["stereo"] = "0";
664 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 EXPECT_TRUE(channel_->AddRecvStream(
666 cricket::StreamParams::CreateLegacy(kSsrc1)));
667 int channel_num2 = voe_.GetLastChannel();
668 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800669 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670 // Even when stereo is off, recv codecs still specify channels = 2.
671 EXPECT_EQ(2, opus.channels);
672 EXPECT_EQ(111, opus.pltype);
673 EXPECT_STREQ("opus", opus.plname);
674 opus.pltype = 0;
675 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
676 EXPECT_EQ(111, opus.pltype);
677}
678
679// Test that we can decode OPUS with stereo = 1.
680TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700681 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200682 cricket::AudioRecvParameters parameters;
683 parameters.codecs.push_back(kIsacCodec);
684 parameters.codecs.push_back(kPcmuCodec);
685 parameters.codecs.push_back(kOpusCodec);
686 parameters.codecs[2].params["stereo"] = "1";
687 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_TRUE(channel_->AddRecvStream(
689 cricket::StreamParams::CreateLegacy(kSsrc1)));
690 int channel_num2 = voe_.GetLastChannel();
691 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800692 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693 EXPECT_EQ(2, opus.channels);
694 EXPECT_EQ(111, opus.pltype);
695 EXPECT_STREQ("opus", opus.plname);
696 opus.pltype = 0;
697 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
698 EXPECT_EQ(111, opus.pltype);
699}
700
701// Test that changes to recv codecs are applied to all streams.
702TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700703 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200704 cricket::AudioRecvParameters parameters;
705 parameters.codecs.push_back(kIsacCodec);
706 parameters.codecs.push_back(kPcmuCodec);
707 parameters.codecs.push_back(kTelephoneEventCodec);
708 parameters.codecs[0].id = 106; // collide with existing telephone-event
709 parameters.codecs[2].id = 126;
710 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711 EXPECT_TRUE(channel_->AddRecvStream(
712 cricket::StreamParams::CreateLegacy(kSsrc1)));
713 int channel_num2 = voe_.GetLastChannel();
714 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800715 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716 gcodec.plfreq = 16000;
717 gcodec.channels = 1;
718 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
719 EXPECT_EQ(106, gcodec.pltype);
720 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800721 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 gcodec.plfreq = 8000;
723 gcodec.channels = 1;
724 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
725 EXPECT_EQ(126, gcodec.pltype);
726 EXPECT_STREQ("telephone-event", gcodec.plname);
727}
728
729TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700730 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200731 cricket::AudioRecvParameters parameters;
732 parameters.codecs.push_back(kIsacCodec);
733 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200734 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735
736 int channel_num2 = voe_.GetLastChannel();
737 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800738 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 gcodec.plfreq = 16000;
740 gcodec.channels = 1;
741 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
742 EXPECT_EQ(106, gcodec.pltype);
743 EXPECT_STREQ("ISAC", gcodec.plname);
744}
745
746// Test that we can apply the same set of codecs again while playing.
747TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700748 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200749 cricket::AudioRecvParameters parameters;
750 parameters.codecs.push_back(kIsacCodec);
751 parameters.codecs.push_back(kCn16000Codec);
752 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755
756 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757 parameters.codecs[0].id = 127;
758 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
759 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760 EXPECT_TRUE(voe_.GetPlayout(channel_num));
761}
762
763// Test that we can add a codec while playing.
764TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700765 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200766 cricket::AudioRecvParameters parameters;
767 parameters.codecs.push_back(kIsacCodec);
768 parameters.codecs.push_back(kCn16000Codec);
769 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770 EXPECT_TRUE(channel_->SetPlayout(true));
771
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200772 parameters.codecs.push_back(kOpusCodec);
773 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
774 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 EXPECT_TRUE(voe_.GetPlayout(channel_num));
776 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800777 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
779}
780
781TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700782 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000784 // Test that when autobw is enabled, bitrate is kept as the default
785 // value. autobw is enabled for the following tests because the target
786 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787
788 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700789 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790
791 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700792 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700795 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796}
797
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000798TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700799 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000801 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802
803 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700804 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
805 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
806 // Rates above the max (56000) should be capped.
807 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000808
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700810 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
811 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
812 // Rates above the max (510000) should be capped.
813 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814}
815
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000816TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700817 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000818
819 // Test that we can only set a maximum bitrate for a fixed-rate codec
820 // if it's bigger than the fixed rate.
821
822 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700823 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
824 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
825 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
826 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
827 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
828 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
829 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000830}
831
832TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700833 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200834 const int kDesiredBitrate = 128000;
835 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700836 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200837 parameters.max_bandwidth_bps = kDesiredBitrate;
838 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000839
840 EXPECT_TRUE(channel_->AddSendStream(
841 cricket::StreamParams::CreateLegacy(kSsrc1)));
842
843 int channel_num = voe_.GetLastChannel();
844 webrtc::CodecInst codec;
845 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200846 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000847}
848
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849// Test that bitrate cannot be set for CBR codecs.
850// Bitrate is ignored if it is higher than the fixed bitrate.
851// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000852TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700853 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000854
855 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200856 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
857 int channel_num = voe_.GetLastChannel();
858 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
860 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200861
862 send_parameters_.max_bandwidth_bps = 128000;
863 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
865 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200866
867 send_parameters_.max_bandwidth_bps = 128;
868 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
870 EXPECT_EQ(64000, codec.rate);
871}
872
skvlade0d46372016-04-07 22:59:22 -0700873// Test that the per-stream bitrate limit and the global
874// bitrate limit both apply.
875TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
876 EXPECT_TRUE(SetupSendStream());
877
878 // opus, default bitrate == 64000.
879 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
880 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
881 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
882 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
883
884 // CBR codecs allow both maximums to exceed the bitrate.
885 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
886 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
887 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
888 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
889
890 // CBR codecs don't allow per stream maximums to be too low.
891 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
892 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
893}
894
895// Test that an attempt to set RtpParameters for a stream that does not exist
896// fails.
897TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
898 EXPECT_TRUE(SetupChannel());
899 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700900 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700901 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
902
903 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700904 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700905}
906
907TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700908 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700909 // This test verifies that setting RtpParameters succeeds only if
910 // the structure contains exactly one encoding.
911 // TODO(skvlad): Update this test when we start supporting setting parameters
912 // for each encoding individually.
913
914 EXPECT_TRUE(SetupSendStream());
915 // Setting RtpParameters with no encoding is expected to fail.
916 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700917 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700918 // Setting RtpParameters with exactly one encoding should succeed.
919 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700920 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700921 // Two or more encodings should result in failure.
922 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700923 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700924}
925
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700926// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700927// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700928TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
929 EXPECT_TRUE(SetupSendStream());
930 SetSend(channel_, true);
931 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
932 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700933 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700934 ASSERT_EQ(1u, parameters.encodings.size());
935 ASSERT_TRUE(parameters.encodings[0].active);
936 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700937 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700938 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
939
940 // Now change it back to active and verify we resume sending.
941 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700942 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700943 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
944}
945
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700946// Test that SetRtpSendParameters configures the correct encoding channel for
947// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700948TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
949 SetupForMultiSendStream();
950 // Create send streams.
951 for (uint32_t ssrc : kSsrcs4) {
952 EXPECT_TRUE(
953 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
954 }
955 // Configure one stream to be limited by the stream config, another to be
956 // limited by the global max, and the third one with no per-stream limit
957 // (still subject to the global limit).
958 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
959 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
960 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
961 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
962
963 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
964 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
965 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
966
967 // Remove the global cap; the streams should switch to their respective
968 // maximums (or remain unchanged if there was no other limit on them.)
969 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
970 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
971 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
972 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
973}
974
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700975// Test that GetRtpSendParameters returns the currently configured codecs.
976TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700977 EXPECT_TRUE(SetupSendStream());
978 cricket::AudioSendParameters parameters;
979 parameters.codecs.push_back(kIsacCodec);
980 parameters.codecs.push_back(kPcmuCodec);
981 EXPECT_TRUE(channel_->SetSendParameters(parameters));
982
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700983 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700984 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700985 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
986 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700987}
988
989// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700990TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700991 EXPECT_TRUE(SetupSendStream());
992 cricket::AudioSendParameters parameters;
993 parameters.codecs.push_back(kIsacCodec);
994 parameters.codecs.push_back(kPcmuCodec);
995 EXPECT_TRUE(channel_->SetSendParameters(parameters));
996
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700997 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700998
999 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001000 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001001
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001002 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1003 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1004 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1005}
1006
1007// Test that GetRtpReceiveParameters returns the currently configured codecs.
1008TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1009 EXPECT_TRUE(SetupRecvStream());
1010 cricket::AudioRecvParameters parameters;
1011 parameters.codecs.push_back(kIsacCodec);
1012 parameters.codecs.push_back(kPcmuCodec);
1013 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1014
1015 webrtc::RtpParameters rtp_parameters =
1016 channel_->GetRtpReceiveParameters(kSsrc1);
1017 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1018 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1019 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1020}
1021
1022// Test that if we set/get parameters multiple times, we get the same results.
1023TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1024 EXPECT_TRUE(SetupRecvStream());
1025 cricket::AudioRecvParameters parameters;
1026 parameters.codecs.push_back(kIsacCodec);
1027 parameters.codecs.push_back(kPcmuCodec);
1028 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1029
1030 webrtc::RtpParameters initial_params =
1031 channel_->GetRtpReceiveParameters(kSsrc1);
1032
1033 // We should be able to set the params we just got.
1034 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1035
1036 // ... And this shouldn't change the params returned by
1037 // GetRtpReceiveParameters.
1038 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1039 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001040}
1041
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042// Test that we apply codecs properly.
1043TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001044 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001045 cricket::AudioSendParameters parameters;
1046 parameters.codecs.push_back(kIsacCodec);
1047 parameters.codecs.push_back(kPcmuCodec);
1048 parameters.codecs.push_back(kRedCodec);
1049 parameters.codecs[0].id = 96;
1050 parameters.codecs[0].bitrate = 48000;
1051 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001052 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001053 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054 webrtc::CodecInst gcodec;
1055 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1056 EXPECT_EQ(96, gcodec.pltype);
1057 EXPECT_EQ(48000, gcodec.rate);
1058 EXPECT_STREQ("ISAC", gcodec.plname);
1059 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001060 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001061 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1062 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001063 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001064}
1065
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001066// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1067// to apply.
1068TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001069 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 cricket::AudioSendParameters parameters;
1071 parameters.codecs.push_back(kIsacCodec);
1072 parameters.codecs.push_back(kPcmuCodec);
1073 parameters.codecs.push_back(kRedCodec);
1074 parameters.codecs[0].id = 96;
1075 parameters.codecs[0].bitrate = 48000;
1076 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001077 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1078 // Calling SetSendCodec again with same codec which is already set.
1079 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001081 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1082}
1083
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001084// Verify that G722 is set with 16000 samples per second to WebRTC.
1085TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001086 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001087 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001088 cricket::AudioSendParameters parameters;
1089 parameters.codecs.push_back(kG722CodecSdp);
1090 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001091 webrtc::CodecInst gcodec;
1092 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1093 EXPECT_STREQ("G722", gcodec.plname);
1094 EXPECT_EQ(1, gcodec.channels);
1095 EXPECT_EQ(16000, gcodec.plfreq);
1096}
1097
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001098// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001100 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001101 cricket::AudioSendParameters parameters;
1102 parameters.codecs.push_back(kOpusCodec);
1103 parameters.codecs[0].bitrate = 0;
1104 parameters.codecs[0].clockrate = 50000;
1105 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001106}
1107
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001108// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001110 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001111 cricket::AudioSendParameters parameters;
1112 parameters.codecs.push_back(kOpusCodec);
1113 parameters.codecs[0].bitrate = 0;
1114 parameters.codecs[0].channels = 0;
1115 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116}
1117
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001118// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001120 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001121 cricket::AudioSendParameters parameters;
1122 parameters.codecs.push_back(kOpusCodec);
1123 parameters.codecs[0].bitrate = 0;
1124 parameters.codecs[0].channels = 0;
1125 parameters.codecs[0].params["stereo"] = "1";
1126 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001127}
1128
1129// Test that if channel is 1 for opus and there's no stereo, we fail.
1130TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001131 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001132 cricket::AudioSendParameters parameters;
1133 parameters.codecs.push_back(kOpusCodec);
1134 parameters.codecs[0].bitrate = 0;
1135 parameters.codecs[0].channels = 1;
1136 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137}
1138
1139// Test that if channel is 1 for opus and stereo=0, we fail.
1140TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001141 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001142 cricket::AudioSendParameters parameters;
1143 parameters.codecs.push_back(kOpusCodec);
1144 parameters.codecs[0].bitrate = 0;
1145 parameters.codecs[0].channels = 1;
1146 parameters.codecs[0].params["stereo"] = "0";
1147 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148}
1149
1150// Test that if channel is 1 for opus and stereo=1, we fail.
1151TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001152 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001153 cricket::AudioSendParameters parameters;
1154 parameters.codecs.push_back(kOpusCodec);
1155 parameters.codecs[0].bitrate = 0;
1156 parameters.codecs[0].channels = 1;
1157 parameters.codecs[0].params["stereo"] = "1";
1158 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159}
1160
1161// Test that with bitrate=0 and no stereo,
1162// channels and bitrate are 1 and 32000.
1163TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001164 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001166 cricket::AudioSendParameters parameters;
1167 parameters.codecs.push_back(kOpusCodec);
1168 parameters.codecs[0].bitrate = 0;
1169 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 webrtc::CodecInst gcodec;
1171 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1172 EXPECT_STREQ("opus", gcodec.plname);
1173 EXPECT_EQ(1, gcodec.channels);
1174 EXPECT_EQ(32000, gcodec.rate);
1175}
1176
1177// Test that with bitrate=0 and stereo=0,
1178// channels and bitrate are 1 and 32000.
1179TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001180 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001181 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001182 cricket::AudioSendParameters parameters;
1183 parameters.codecs.push_back(kOpusCodec);
1184 parameters.codecs[0].bitrate = 0;
1185 parameters.codecs[0].params["stereo"] = "0";
1186 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187 webrtc::CodecInst gcodec;
1188 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1189 EXPECT_STREQ("opus", gcodec.plname);
1190 EXPECT_EQ(1, gcodec.channels);
1191 EXPECT_EQ(32000, gcodec.rate);
1192}
1193
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001194// Test that with bitrate=invalid and stereo=0,
1195// channels and bitrate are 1 and 32000.
1196TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001197 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001198 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001199 cricket::AudioSendParameters parameters;
1200 parameters.codecs.push_back(kOpusCodec);
1201 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001202 webrtc::CodecInst gcodec;
1203
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001204 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001205 parameters.codecs[0].bitrate = 5999;
1206 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001207 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1208 EXPECT_STREQ("opus", gcodec.plname);
1209 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001210 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001211
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001212 parameters.codecs[0].bitrate = 510001;
1213 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001214 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1215 EXPECT_STREQ("opus", gcodec.plname);
1216 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001217 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001218}
1219
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220// Test that with bitrate=0 and stereo=1,
1221// channels and bitrate are 2 and 64000.
1222TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001223 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 cricket::AudioSendParameters parameters;
1226 parameters.codecs.push_back(kOpusCodec);
1227 parameters.codecs[0].bitrate = 0;
1228 parameters.codecs[0].params["stereo"] = "1";
1229 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230 webrtc::CodecInst gcodec;
1231 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1232 EXPECT_STREQ("opus", gcodec.plname);
1233 EXPECT_EQ(2, gcodec.channels);
1234 EXPECT_EQ(64000, gcodec.rate);
1235}
1236
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001237// Test that with bitrate=invalid and stereo=1,
1238// channels and bitrate are 2 and 64000.
1239TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001240 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001241 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001242 cricket::AudioSendParameters parameters;
1243 parameters.codecs.push_back(kOpusCodec);
1244 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001245 webrtc::CodecInst gcodec;
1246
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001247 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001248 parameters.codecs[0].bitrate = 5999;
1249 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001250 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1251 EXPECT_STREQ("opus", gcodec.plname);
1252 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001253 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001254
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001255 parameters.codecs[0].bitrate = 510001;
1256 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001257 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1258 EXPECT_STREQ("opus", gcodec.plname);
1259 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001260 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001261}
1262
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263// Test that with bitrate=N and stereo unset,
1264// channels and bitrate are 1 and N.
1265TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001266 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001267 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001268 cricket::AudioSendParameters parameters;
1269 parameters.codecs.push_back(kOpusCodec);
1270 parameters.codecs[0].bitrate = 96000;
1271 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272 webrtc::CodecInst gcodec;
1273 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1274 EXPECT_EQ(111, gcodec.pltype);
1275 EXPECT_EQ(96000, gcodec.rate);
1276 EXPECT_STREQ("opus", gcodec.plname);
1277 EXPECT_EQ(1, gcodec.channels);
1278 EXPECT_EQ(48000, gcodec.plfreq);
1279}
1280
1281// Test that with bitrate=N and stereo=0,
1282// channels and bitrate are 1 and N.
1283TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001284 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001285 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001286 cricket::AudioSendParameters parameters;
1287 parameters.codecs.push_back(kOpusCodec);
1288 parameters.codecs[0].bitrate = 30000;
1289 parameters.codecs[0].params["stereo"] = "0";
1290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001291 webrtc::CodecInst gcodec;
1292 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1293 EXPECT_EQ(1, gcodec.channels);
1294 EXPECT_EQ(30000, gcodec.rate);
1295 EXPECT_STREQ("opus", gcodec.plname);
1296}
1297
1298// Test that with bitrate=N and without any parameters,
1299// channels and bitrate are 1 and N.
1300TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001301 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001302 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001303 cricket::AudioSendParameters parameters;
1304 parameters.codecs.push_back(kOpusCodec);
1305 parameters.codecs[0].bitrate = 30000;
1306 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307 webrtc::CodecInst gcodec;
1308 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1309 EXPECT_EQ(1, gcodec.channels);
1310 EXPECT_EQ(30000, gcodec.rate);
1311 EXPECT_STREQ("opus", gcodec.plname);
1312}
1313
1314// Test that with bitrate=N and stereo=1,
1315// channels and bitrate are 2 and N.
1316TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001317 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001318 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 cricket::AudioSendParameters parameters;
1320 parameters.codecs.push_back(kOpusCodec);
1321 parameters.codecs[0].bitrate = 30000;
1322 parameters.codecs[0].params["stereo"] = "1";
1323 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324 webrtc::CodecInst gcodec;
1325 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1326 EXPECT_EQ(2, gcodec.channels);
1327 EXPECT_EQ(30000, gcodec.rate);
1328 EXPECT_STREQ("opus", gcodec.plname);
1329}
1330
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001331// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1332// Also test that the "maxaveragebitrate" can't be set to values outside the
1333// range of 6000 and 510000
1334TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001335 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001336 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001337 cricket::AudioSendParameters parameters;
1338 parameters.codecs.push_back(kOpusCodec);
1339 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001340 webrtc::CodecInst gcodec;
1341
1342 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1344 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001346 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001347
1348 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001349 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1350 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001351 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001352 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001353
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001354 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1355 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001356 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1357 EXPECT_EQ(200000, gcodec.rate);
1358}
1359
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001360// Test that we can enable NACK with opus as caller.
1361TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001362 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001363 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001364 cricket::AudioSendParameters parameters;
1365 parameters.codecs.push_back(kOpusCodec);
1366 parameters.codecs[0].AddFeedbackParam(
1367 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1368 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001370 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371 EXPECT_TRUE(voe_.GetNACK(channel_num));
1372}
1373
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001374// Test that we can enable NACK with opus as callee.
1375TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001376 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001377 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001378 cricket::AudioSendParameters parameters;
1379 parameters.codecs.push_back(kOpusCodec);
1380 parameters.codecs[0].AddFeedbackParam(
1381 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1382 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001383 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001385 // NACK should be enabled even with no send stream.
1386 EXPECT_TRUE(voe_.GetNACK(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001387
1388 EXPECT_TRUE(channel_->AddSendStream(
1389 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001390 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001391}
1392
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001393// Test that we can enable NACK on receive streams.
1394TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001395 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001396 int channel_num1 = voe_.GetLastChannel();
1397 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1398 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001399 cricket::AudioSendParameters parameters;
1400 parameters.codecs.push_back(kOpusCodec);
1401 parameters.codecs[0].AddFeedbackParam(
1402 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1403 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001404 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1405 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001406 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001407 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1408 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1409}
1410
1411// Test that we can disable NACK.
1412TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001413 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kOpusCodec);
1417 parameters.codecs[0].AddFeedbackParam(
1418 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1419 cricket::kParamValueEmpty));
1420 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001421 EXPECT_TRUE(voe_.GetNACK(channel_num));
1422
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001423 parameters.codecs.clear();
1424 parameters.codecs.push_back(kOpusCodec);
1425 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001426 EXPECT_FALSE(voe_.GetNACK(channel_num));
1427}
1428
1429// Test that we can disable NACK on receive streams.
1430TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001431 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001432 int channel_num1 = voe_.GetLastChannel();
1433 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1434 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001435 cricket::AudioSendParameters parameters;
1436 parameters.codecs.push_back(kOpusCodec);
1437 parameters.codecs[0].AddFeedbackParam(
1438 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1439 cricket::kParamValueEmpty));
1440 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1442 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1443
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001444 parameters.codecs.clear();
1445 parameters.codecs.push_back(kOpusCodec);
1446 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1448 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1449}
1450
1451// Test that NACK is enabled on a new receive stream.
1452TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001453 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001454 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001455 cricket::AudioSendParameters parameters;
1456 parameters.codecs.push_back(kIsacCodec);
1457 parameters.codecs.push_back(kCn16000Codec);
1458 parameters.codecs[0].AddFeedbackParam(
1459 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1460 cricket::kParamValueEmpty));
1461 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462 EXPECT_TRUE(voe_.GetNACK(channel_num));
1463
1464 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1465 channel_num = voe_.GetLastChannel();
1466 EXPECT_TRUE(voe_.GetNACK(channel_num));
1467 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1468 channel_num = voe_.GetLastChannel();
1469 EXPECT_TRUE(voe_.GetNACK(channel_num));
1470}
1471
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001472// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001473TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001474 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001475 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001476 cricket::AudioSendParameters parameters;
1477 parameters.codecs.push_back(kOpusCodec);
1478 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001479 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1480}
1481
1482// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001483TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001484 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001485 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001486 cricket::AudioSendParameters parameters;
1487 parameters.codecs.push_back(kOpusCodec);
1488 parameters.codecs[0].bitrate = 0;
1489 parameters.codecs[0].params["useinbandfec"] = "0";
1490 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001491 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1492 webrtc::CodecInst gcodec;
1493 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1494 EXPECT_STREQ("opus", gcodec.plname);
1495 EXPECT_EQ(1, gcodec.channels);
1496 EXPECT_EQ(32000, gcodec.rate);
1497}
1498
1499// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001500TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001501 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001502 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001503 cricket::AudioSendParameters parameters;
1504 parameters.codecs.push_back(kOpusCodec);
1505 parameters.codecs[0].bitrate = 0;
1506 parameters.codecs[0].params["useinbandfec"] = "1";
1507 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001508 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1509 webrtc::CodecInst gcodec;
1510 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1511 EXPECT_STREQ("opus", gcodec.plname);
1512 EXPECT_EQ(1, gcodec.channels);
1513 EXPECT_EQ(32000, gcodec.rate);
1514}
1515
1516// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001517TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001518 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001519 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001520 cricket::AudioSendParameters parameters;
1521 parameters.codecs.push_back(kOpusCodec);
1522 parameters.codecs[0].bitrate = 0;
1523 parameters.codecs[0].params["stereo"] = "1";
1524 parameters.codecs[0].params["useinbandfec"] = "1";
1525 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001526 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1527 webrtc::CodecInst gcodec;
1528 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1529 EXPECT_STREQ("opus", gcodec.plname);
1530 EXPECT_EQ(2, gcodec.channels);
1531 EXPECT_EQ(64000, gcodec.rate);
1532}
1533
1534// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001535TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001536 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001537 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 cricket::AudioSendParameters parameters;
1539 parameters.codecs.push_back(kIsacCodec);
1540 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001541 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1542}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001543
1544// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1545TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001546 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001547 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001548 cricket::AudioSendParameters parameters;
1549 parameters.codecs.push_back(kIsacCodec);
1550 parameters.codecs[0].params["useinbandfec"] = "1";
1551 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001552 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1553}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001554
1555// Test that Opus FEC status can be changed.
1556TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001557 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001558 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 cricket::AudioSendParameters parameters;
1560 parameters.codecs.push_back(kOpusCodec);
1561 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001562 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001563 parameters.codecs[0].params["useinbandfec"] = "1";
1564 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001565 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1566}
1567
stefanba4c0e42016-02-04 04:12:24 -08001568TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001569 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001570 cricket::AudioSendParameters send_parameters;
1571 send_parameters.codecs.push_back(kOpusCodec);
1572 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1573 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1574
1575 cricket::AudioRecvParameters recv_parameters;
1576 recv_parameters.codecs.push_back(kIsacCodec);
1577 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1578 EXPECT_TRUE(
1579 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1580 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1581 EXPECT_FALSE(
1582 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1583
ossudedfd282016-06-14 07:12:39 -07001584 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001585 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1586 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1587 EXPECT_TRUE(
1588 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1589}
1590
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001591// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1592TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001593 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001594 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001595 cricket::AudioSendParameters parameters;
1596 parameters.codecs.push_back(kOpusCodec);
1597 parameters.codecs[0].bitrate = 0;
1598 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1599 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001600 EXPECT_EQ(cricket::kOpusBandwidthNb,
1601 voe_.GetMaxEncodingBandwidth(channel_num));
1602 webrtc::CodecInst gcodec;
1603 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1604 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001605
1606 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001607 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1608 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001609 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1610 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001611}
1612
1613// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1614TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001615 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001616 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001617 cricket::AudioSendParameters parameters;
1618 parameters.codecs.push_back(kOpusCodec);
1619 parameters.codecs[0].bitrate = 0;
1620 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001622 EXPECT_EQ(cricket::kOpusBandwidthMb,
1623 voe_.GetMaxEncodingBandwidth(channel_num));
1624 webrtc::CodecInst gcodec;
1625 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1626 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001627
1628 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001629 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1630 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001631 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1632 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001633}
1634
1635// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1636TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001637 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001638 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001639 cricket::AudioSendParameters parameters;
1640 parameters.codecs.push_back(kOpusCodec);
1641 parameters.codecs[0].bitrate = 0;
1642 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1643 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001644 EXPECT_EQ(cricket::kOpusBandwidthWb,
1645 voe_.GetMaxEncodingBandwidth(channel_num));
1646 webrtc::CodecInst gcodec;
1647 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1648 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001649
1650 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001651 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1652 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001653 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1654 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001655}
1656
1657// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1658TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001659 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001660 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001661 cricket::AudioSendParameters parameters;
1662 parameters.codecs.push_back(kOpusCodec);
1663 parameters.codecs[0].bitrate = 0;
1664 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1665 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001666 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1667 voe_.GetMaxEncodingBandwidth(channel_num));
1668 webrtc::CodecInst gcodec;
1669 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1670 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001671
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001672 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001673 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1674 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001675 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1676 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001677}
1678
1679// Test 24000 < maxplaybackrate triggers Opus full band mode.
1680TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001681 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001682 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001683 cricket::AudioSendParameters parameters;
1684 parameters.codecs.push_back(kOpusCodec);
1685 parameters.codecs[0].bitrate = 0;
1686 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1687 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001688 EXPECT_EQ(cricket::kOpusBandwidthFb,
1689 voe_.GetMaxEncodingBandwidth(channel_num));
1690 webrtc::CodecInst gcodec;
1691 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1692 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001693
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001694 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001695 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1696 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001697 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1698 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001699}
1700
1701// Test Opus that without maxplaybackrate, default playback rate is used.
1702TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001703 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001704 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001705 cricket::AudioSendParameters parameters;
1706 parameters.codecs.push_back(kOpusCodec);
1707 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001708 EXPECT_EQ(cricket::kOpusBandwidthFb,
1709 voe_.GetMaxEncodingBandwidth(channel_num));
1710}
1711
1712// Test the with non-Opus, maxplaybackrate has no effect.
1713TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001714 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001715 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001716 cricket::AudioSendParameters parameters;
1717 parameters.codecs.push_back(kIsacCodec);
1718 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001720 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1721}
1722
1723// Test maxplaybackrate can be set on two streams.
1724TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001725 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001726 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001727 cricket::AudioSendParameters parameters;
1728 parameters.codecs.push_back(kOpusCodec);
1729 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001730 // Default bandwidth is 24000.
1731 EXPECT_EQ(cricket::kOpusBandwidthFb,
1732 voe_.GetMaxEncodingBandwidth(channel_num));
1733
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001734 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001735
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001736 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001737 EXPECT_EQ(cricket::kOpusBandwidthNb,
1738 voe_.GetMaxEncodingBandwidth(channel_num));
1739
1740 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1741 channel_num = voe_.GetLastChannel();
1742 EXPECT_EQ(cricket::kOpusBandwidthNb,
1743 voe_.GetMaxEncodingBandwidth(channel_num));
1744}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001745
Minyue Li7100dcd2015-03-27 05:05:59 +01001746// Test that with usedtx=0, Opus DTX is off.
1747TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001748 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001749 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001750 cricket::AudioSendParameters parameters;
1751 parameters.codecs.push_back(kOpusCodec);
1752 parameters.codecs[0].params["usedtx"] = "0";
1753 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001754 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1755}
1756
1757// Test that with usedtx=1, Opus DTX is on.
1758TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001759 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001760 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001761 cricket::AudioSendParameters parameters;
1762 parameters.codecs.push_back(kOpusCodec);
1763 parameters.codecs[0].params["usedtx"] = "1";
1764 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001765 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1766 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1767}
1768
1769// Test that usedtx=1 works with stereo Opus.
1770TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001771 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001772 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001773 cricket::AudioSendParameters parameters;
1774 parameters.codecs.push_back(kOpusCodec);
1775 parameters.codecs[0].params["usedtx"] = "1";
1776 parameters.codecs[0].params["stereo"] = "1";
1777 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001778 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1779 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1780}
1781
1782// Test that usedtx=1 does not work with non Opus.
1783TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001784 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001785 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001786 cricket::AudioSendParameters parameters;
1787 parameters.codecs.push_back(kIsacCodec);
1788 parameters.codecs[0].params["usedtx"] = "1";
1789 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001790 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1791}
1792
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001793// Test that we can switch back and forth between Opus and ISAC with CN.
1794TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001795 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001797 cricket::AudioSendParameters opus_parameters;
1798 opus_parameters.codecs.push_back(kOpusCodec);
1799 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800 webrtc::CodecInst gcodec;
1801 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001802 EXPECT_EQ(111, gcodec.pltype);
1803 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001805 cricket::AudioSendParameters isac_parameters;
1806 isac_parameters.codecs.push_back(kIsacCodec);
1807 isac_parameters.codecs.push_back(kCn16000Codec);
1808 isac_parameters.codecs.push_back(kOpusCodec);
1809 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1811 EXPECT_EQ(103, gcodec.pltype);
1812 EXPECT_STREQ("ISAC", gcodec.plname);
1813
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001814 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001816 EXPECT_EQ(111, gcodec.pltype);
1817 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818}
1819
1820// Test that we handle various ways of specifying bitrate.
1821TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001822 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001823 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001824 cricket::AudioSendParameters parameters;
1825 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1826 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827 webrtc::CodecInst gcodec;
1828 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1829 EXPECT_EQ(103, gcodec.pltype);
1830 EXPECT_STREQ("ISAC", gcodec.plname);
1831 EXPECT_EQ(32000, gcodec.rate);
1832
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001833 parameters.codecs[0].bitrate = 0; // bitrate == default
1834 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001835 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1836 EXPECT_EQ(103, gcodec.pltype);
1837 EXPECT_STREQ("ISAC", gcodec.plname);
1838 EXPECT_EQ(-1, gcodec.rate);
1839
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001840 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1841 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1843 EXPECT_EQ(103, gcodec.pltype);
1844 EXPECT_STREQ("ISAC", gcodec.plname);
1845 EXPECT_EQ(28000, gcodec.rate);
1846
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001847 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1848 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001849 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1850 EXPECT_EQ(0, gcodec.pltype);
1851 EXPECT_STREQ("PCMU", gcodec.plname);
1852 EXPECT_EQ(64000, gcodec.rate);
1853
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001854 parameters.codecs[0].bitrate = 0; // bitrate == default
1855 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001856 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1857 EXPECT_EQ(0, gcodec.pltype);
1858 EXPECT_STREQ("PCMU", gcodec.plname);
1859 EXPECT_EQ(64000, gcodec.rate);
1860
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001861 parameters.codecs[0] = kOpusCodec;
1862 parameters.codecs[0].bitrate = 0; // bitrate == default
1863 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001864 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1865 EXPECT_EQ(111, gcodec.pltype);
1866 EXPECT_STREQ("opus", gcodec.plname);
1867 EXPECT_EQ(32000, gcodec.rate);
1868}
1869
Brave Yao5225dd82015-03-26 07:39:19 +08001870// Test that we could set packet size specified in kCodecParamPTime.
1871TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001872 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001873 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001874 cricket::AudioSendParameters parameters;
1875 parameters.codecs.push_back(kOpusCodec);
1876 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1877 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001878 webrtc::CodecInst gcodec;
1879 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1880 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1881
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001882 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1883 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001884 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1885 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1886
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001887 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1888 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001889 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1890 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1891
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001892 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1893 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1894 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001895 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1896 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1897
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001898 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1899 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1900 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001901 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1902 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1903}
1904
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001905// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001906TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001907 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001908 cricket::AudioSendParameters parameters;
1909 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001910}
1911
1912// Test that we can set send codecs even with telephone-event codec as the first
1913// one on the list.
1914TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001915 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001917 cricket::AudioSendParameters parameters;
1918 parameters.codecs.push_back(kTelephoneEventCodec);
1919 parameters.codecs.push_back(kIsacCodec);
1920 parameters.codecs.push_back(kPcmuCodec);
1921 parameters.codecs[0].id = 98; // DTMF
1922 parameters.codecs[1].id = 96;
1923 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924 webrtc::CodecInst gcodec;
1925 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001926 EXPECT_EQ(96, gcodec.pltype);
1927 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001928 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001929}
1930
solenberg31642aa2016-03-14 08:00:37 -07001931// Test that payload type range is limited for telephone-event codec.
1932TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001933 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001934 cricket::AudioSendParameters parameters;
1935 parameters.codecs.push_back(kTelephoneEventCodec);
1936 parameters.codecs.push_back(kIsacCodec);
1937 parameters.codecs[0].id = 0; // DTMF
1938 parameters.codecs[1].id = 96;
1939 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1940 EXPECT_TRUE(channel_->CanInsertDtmf());
1941 parameters.codecs[0].id = 128; // DTMF
1942 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1943 EXPECT_FALSE(channel_->CanInsertDtmf());
1944 parameters.codecs[0].id = 127;
1945 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1946 EXPECT_TRUE(channel_->CanInsertDtmf());
1947 parameters.codecs[0].id = -1; // DTMF
1948 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1949 EXPECT_FALSE(channel_->CanInsertDtmf());
1950}
1951
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001952// Test that we can set send codecs even with CN codec as the first
1953// one on the list.
1954TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001955 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001956 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001957 cricket::AudioSendParameters parameters;
1958 parameters.codecs.push_back(kCn16000Codec);
1959 parameters.codecs.push_back(kIsacCodec);
1960 parameters.codecs.push_back(kPcmuCodec);
1961 parameters.codecs[0].id = 98; // wideband CN
1962 parameters.codecs[1].id = 96;
1963 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001964 webrtc::CodecInst gcodec;
1965 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1966 EXPECT_EQ(96, gcodec.pltype);
1967 EXPECT_STREQ("ISAC", gcodec.plname);
1968 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001969}
1970
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001971// Test that we set VAD and DTMF types correctly as caller.
1972TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001973 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001975 cricket::AudioSendParameters parameters;
1976 parameters.codecs.push_back(kIsacCodec);
1977 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001979 parameters.codecs.push_back(kCn16000Codec);
1980 parameters.codecs.push_back(kCn8000Codec);
1981 parameters.codecs.push_back(kTelephoneEventCodec);
1982 parameters.codecs.push_back(kRedCodec);
1983 parameters.codecs[0].id = 96;
1984 parameters.codecs[2].id = 97; // wideband CN
1985 parameters.codecs[4].id = 98; // DTMF
1986 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001987 webrtc::CodecInst gcodec;
1988 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1989 EXPECT_EQ(96, gcodec.pltype);
1990 EXPECT_STREQ("ISAC", gcodec.plname);
1991 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001992 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001993 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1994 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001995 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001996}
1997
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001998// Test that we set VAD and DTMF types correctly as callee.
1999TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002000 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002001 cricket::AudioSendParameters parameters;
2002 parameters.codecs.push_back(kIsacCodec);
2003 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002004 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002005 parameters.codecs.push_back(kCn16000Codec);
2006 parameters.codecs.push_back(kCn8000Codec);
2007 parameters.codecs.push_back(kTelephoneEventCodec);
2008 parameters.codecs.push_back(kRedCodec);
2009 parameters.codecs[0].id = 96;
2010 parameters.codecs[2].id = 97; // wideband CN
2011 parameters.codecs[4].id = 98; // DTMF
2012 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002013 EXPECT_TRUE(channel_->AddSendStream(
2014 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002015 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002016
2017 webrtc::CodecInst gcodec;
2018 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2019 EXPECT_EQ(96, gcodec.pltype);
2020 EXPECT_STREQ("ISAC", gcodec.plname);
2021 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002022 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002023 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2024 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002025 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002026}
2027
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002028// Test that we only apply VAD if we have a CN codec that matches the
2029// send codec clockrate.
2030TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002031 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002032 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002033 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002034 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002035 parameters.codecs.push_back(kIsacCodec);
2036 parameters.codecs.push_back(kCn16000Codec);
2037 parameters.codecs[1].id = 97;
2038 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002039 webrtc::CodecInst gcodec;
2040 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2041 EXPECT_STREQ("ISAC", gcodec.plname);
2042 EXPECT_TRUE(voe_.GetVAD(channel_num));
2043 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2044 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002045 parameters.codecs[0] = kPcmuCodec;
2046 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002047 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2048 EXPECT_STREQ("PCMU", gcodec.plname);
2049 EXPECT_FALSE(voe_.GetVAD(channel_num));
2050 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002051 parameters.codecs[1] = kCn8000Codec;
2052 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002053 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2054 EXPECT_STREQ("PCMU", gcodec.plname);
2055 EXPECT_TRUE(voe_.GetVAD(channel_num));
2056 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002057 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002058 parameters.codecs[0] = kIsacCodec;
2059 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002060 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2061 EXPECT_STREQ("ISAC", gcodec.plname);
2062 EXPECT_FALSE(voe_.GetVAD(channel_num));
2063}
2064
2065// Test that we perform case-insensitive matching of codec names.
2066TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002067 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002068 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002069 cricket::AudioSendParameters parameters;
2070 parameters.codecs.push_back(kIsacCodec);
2071 parameters.codecs.push_back(kPcmuCodec);
2072 parameters.codecs.push_back(kCn16000Codec);
2073 parameters.codecs.push_back(kCn8000Codec);
2074 parameters.codecs.push_back(kTelephoneEventCodec);
2075 parameters.codecs.push_back(kRedCodec);
2076 parameters.codecs[0].name = "iSaC";
2077 parameters.codecs[0].id = 96;
2078 parameters.codecs[2].id = 97; // wideband CN
2079 parameters.codecs[4].id = 98; // DTMF
2080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002081 webrtc::CodecInst gcodec;
2082 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2083 EXPECT_EQ(96, gcodec.pltype);
2084 EXPECT_STREQ("ISAC", gcodec.plname);
2085 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002086 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002087 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2088 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002089 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090}
2091
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002092// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002093TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002094 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002095 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002096 cricket::AudioSendParameters parameters;
2097 parameters.codecs.push_back(kRedCodec);
2098 parameters.codecs.push_back(kIsacCodec);
2099 parameters.codecs.push_back(kPcmuCodec);
2100 parameters.codecs[0].id = 127;
2101 parameters.codecs[0].params[""] = "96/96";
2102 parameters.codecs[1].id = 96;
2103 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104 webrtc::CodecInst gcodec;
2105 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2106 EXPECT_EQ(96, gcodec.pltype);
2107 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002108 EXPECT_TRUE(voe_.GetRED(channel_num));
2109 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110}
2111
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002112// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002113TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002114 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002115 cricket::AudioSendParameters parameters;
2116 parameters.codecs.push_back(kRedCodec);
2117 parameters.codecs.push_back(kIsacCodec);
2118 parameters.codecs.push_back(kPcmuCodec);
2119 parameters.codecs[0].id = 127;
2120 parameters.codecs[0].params[""] = "96/96";
2121 parameters.codecs[1].id = 96;
2122 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002123 EXPECT_TRUE(channel_->AddSendStream(
2124 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002125 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002126 webrtc::CodecInst gcodec;
2127 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2128 EXPECT_EQ(96, gcodec.pltype);
2129 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002130 EXPECT_TRUE(voe_.GetRED(channel_num));
2131 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002132}
2133
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002134// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002136 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002138 cricket::AudioSendParameters parameters;
2139 parameters.codecs.push_back(kRedCodec);
2140 parameters.codecs.push_back(kIsacCodec);
2141 parameters.codecs.push_back(kPcmuCodec);
2142 parameters.codecs[0].id = 127;
2143 parameters.codecs[1].id = 96;
2144 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002145 webrtc::CodecInst gcodec;
2146 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2147 EXPECT_EQ(96, gcodec.pltype);
2148 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002149 EXPECT_TRUE(voe_.GetRED(channel_num));
2150 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002151}
2152
2153// Test that we ignore RED if the parameters aren't named the way we expect.
2154TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002155 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002156 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002157 cricket::AudioSendParameters parameters;
2158 parameters.codecs.push_back(kRedCodec);
2159 parameters.codecs.push_back(kIsacCodec);
2160 parameters.codecs.push_back(kPcmuCodec);
2161 parameters.codecs[0].id = 127;
2162 parameters.codecs[0].params["ABC"] = "96/96";
2163 parameters.codecs[1].id = 96;
2164 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165 webrtc::CodecInst gcodec;
2166 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2167 EXPECT_EQ(96, gcodec.pltype);
2168 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002169 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002170}
2171
2172// Test that we ignore RED if it uses different primary/secondary encoding.
2173TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002174 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002175 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002176 cricket::AudioSendParameters parameters;
2177 parameters.codecs.push_back(kRedCodec);
2178 parameters.codecs.push_back(kIsacCodec);
2179 parameters.codecs.push_back(kPcmuCodec);
2180 parameters.codecs[0].id = 127;
2181 parameters.codecs[0].params[""] = "96/0";
2182 parameters.codecs[1].id = 96;
2183 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002184 webrtc::CodecInst gcodec;
2185 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2186 EXPECT_EQ(96, gcodec.pltype);
2187 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002188 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002189}
2190
2191// Test that we ignore RED if it uses more than 2 encodings.
2192TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002193 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002194 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002195 cricket::AudioSendParameters parameters;
2196 parameters.codecs.push_back(kRedCodec);
2197 parameters.codecs.push_back(kIsacCodec);
2198 parameters.codecs.push_back(kPcmuCodec);
2199 parameters.codecs[0].id = 127;
2200 parameters.codecs[0].params[""] = "96/96/96";
2201 parameters.codecs[1].id = 96;
2202 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002203 webrtc::CodecInst gcodec;
2204 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2205 EXPECT_EQ(96, gcodec.pltype);
2206 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002207 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208}
2209
2210// Test that we ignore RED if it has bogus codec ids.
2211TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002212 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002214 cricket::AudioSendParameters parameters;
2215 parameters.codecs.push_back(kRedCodec);
2216 parameters.codecs.push_back(kIsacCodec);
2217 parameters.codecs.push_back(kPcmuCodec);
2218 parameters.codecs[0].id = 127;
2219 parameters.codecs[0].params[""] = "ABC/ABC";
2220 parameters.codecs[1].id = 96;
2221 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222 webrtc::CodecInst gcodec;
2223 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2224 EXPECT_EQ(96, gcodec.pltype);
2225 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002226 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002227}
2228
2229// Test that we ignore RED if it refers to a codec that is not present.
2230TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002231 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002232 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002233 cricket::AudioSendParameters parameters;
2234 parameters.codecs.push_back(kRedCodec);
2235 parameters.codecs.push_back(kIsacCodec);
2236 parameters.codecs.push_back(kPcmuCodec);
2237 parameters.codecs[0].id = 127;
2238 parameters.codecs[0].params[""] = "97/97";
2239 parameters.codecs[1].id = 96;
2240 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241 webrtc::CodecInst gcodec;
2242 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2243 EXPECT_EQ(96, gcodec.pltype);
2244 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002245 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246}
2247
stefanba4c0e42016-02-04 04:12:24 -08002248class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2249 public:
2250 WebRtcVoiceEngineWithSendSideBweTest()
2251 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2252};
2253
2254TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2255 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002256 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002257 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002258 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2259 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2260 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002261 extension.id);
2262 return;
2263 }
2264 }
2265 FAIL() << "Transport sequence number extension not in header-extension list.";
2266}
2267
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002268// Test support for audio level header extension.
2269TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002270 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002271}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002272TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002273 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002274}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002275
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002276// Test support for absolute send time header extension.
2277TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002278 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002279}
2280TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002281 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282}
2283
solenberg1ac56142015-10-13 03:58:19 -07002284// Test that we can create a channel and start sending on it.
2285TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002286 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002287 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002288 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002289 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002290 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002291 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2292}
2293
2294// Test that a channel will send if and only if it has a source and is enabled
2295// for sending.
2296TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002297 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002298 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2299 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002300 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002301 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2302 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2303 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2304 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2305 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002306}
2307
solenberg6d6e7c52016-04-13 09:07:30 -07002308// Test that SetSendParameters() does not alter a stream's send state.
2309TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2310 EXPECT_TRUE(SetupSendStream());
2311 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2312
2313 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002314 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002315 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2316
2317 // Changing RTP header extensions will recreate the AudioSendStream.
2318 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002319 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002320 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2321 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2322
2323 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002324 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002325 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2326
2327 // Changing RTP header extensions will recreate the AudioSendStream.
2328 send_parameters_.extensions.clear();
2329 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2330 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2331}
2332
solenberg1ac56142015-10-13 03:58:19 -07002333// Test that we can create a channel and start playing out on it.
2334TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002335 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002336 int channel_num = voe_.GetLastChannel();
2337 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2338 EXPECT_TRUE(channel_->SetPlayout(true));
2339 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002340 EXPECT_TRUE(channel_->SetPlayout(false));
2341 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2342}
2343
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002344// Test that we can add and remove send streams.
2345TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2346 SetupForMultiSendStream();
2347
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002348 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002349 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002350
solenbergc96df772015-10-21 13:01:53 -07002351 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002352 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002353 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002354 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002355 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002356 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002357 }
tfarina5237aaf2015-11-10 23:44:30 -08002358 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002359
solenbergc96df772015-10-21 13:01:53 -07002360 // Delete the send streams.
2361 for (uint32_t ssrc : kSsrcs4) {
2362 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002363 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002364 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002365 }
solenbergc96df772015-10-21 13:01:53 -07002366 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002367}
2368
2369// Test SetSendCodecs correctly configure the codecs in all send streams.
2370TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2371 SetupForMultiSendStream();
2372
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002373 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002374 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002375 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002376 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002377 }
2378
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002379 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002380 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002381 parameters.codecs.push_back(kIsacCodec);
2382 parameters.codecs.push_back(kCn16000Codec);
2383 parameters.codecs[1].id = 97;
2384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002385
2386 // Verify ISAC and VAD are corrected configured on all send channels.
2387 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002388 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002389 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002390 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2391 EXPECT_STREQ("ISAC", gcodec.plname);
2392 EXPECT_TRUE(voe_.GetVAD(channel_num));
2393 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2394 }
2395
2396 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002397 parameters.codecs[0] = kPcmuCodec;
2398 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002399 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002400 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002401 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2402 EXPECT_STREQ("PCMU", gcodec.plname);
2403 EXPECT_FALSE(voe_.GetVAD(channel_num));
2404 }
2405}
2406
2407// Test we can SetSend on all send streams correctly.
2408TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2409 SetupForMultiSendStream();
2410
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002411 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002412 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002413 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002414 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002415 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2416 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002417 }
2418
2419 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002420 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002421 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002422 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002423 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002424 }
2425
2426 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002427 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002428 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002429 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002430 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002431 }
2432}
2433
2434// Test we can set the correct statistics on all send streams.
2435TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2436 SetupForMultiSendStream();
2437
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002438 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002439 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002440 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002441 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002442 }
solenberg85a04962015-10-27 03:35:21 -07002443 SetAudioSendStreamStats();
2444
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002445 // Create a receive stream to check that none of the send streams end up in
2446 // the receive stream stats.
2447 EXPECT_TRUE(channel_->AddRecvStream(
2448 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002449 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002450 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2451 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002452
solenberg85a04962015-10-27 03:35:21 -07002453 // Check stats for the added streams.
2454 {
2455 cricket::VoiceMediaInfo info;
2456 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002457
solenberg85a04962015-10-27 03:35:21 -07002458 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002459 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002460 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002461 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002462 }
2463
2464 // We have added one receive stream. We should see empty stats.
2465 EXPECT_EQ(info.receivers.size(), 1u);
2466 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002467 }
solenberg1ac56142015-10-13 03:58:19 -07002468
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002469 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002470 {
2471 cricket::VoiceMediaInfo info;
2472 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2473 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002474 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002475 EXPECT_EQ(0u, info.receivers.size());
2476 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002477
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002478 // Deliver a new packet - a default receive stream should be created and we
2479 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002480 {
2481 cricket::VoiceMediaInfo info;
2482 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2483 SetAudioReceiveStreamStats();
2484 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002485 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002486 EXPECT_EQ(1u, info.receivers.size());
2487 VerifyVoiceReceiverInfo(info.receivers[0]);
2488 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002489}
2490
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002491// Test that we can add and remove receive streams, and do proper send/playout.
2492// We can receive on multiple streams while sending one stream.
2493TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002494 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495 int channel_num1 = voe_.GetLastChannel();
2496
solenberg1ac56142015-10-13 03:58:19 -07002497 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002498 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002500 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501
solenberg1ac56142015-10-13 03:58:19 -07002502 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002503 EXPECT_TRUE(
2504 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002505 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002506 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002507 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508
solenberg1ac56142015-10-13 03:58:19 -07002509 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2511 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2512
2513 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002514 EXPECT_TRUE(
2515 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516 int channel_num3 = voe_.GetLastChannel();
2517 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2518 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2519 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520
2521 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002522 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002523 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524
2525 // Stop playout.
2526 EXPECT_TRUE(channel_->SetPlayout(false));
2527 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2528 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2529 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2530
solenberg1ac56142015-10-13 03:58:19 -07002531 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532 EXPECT_TRUE(channel_->SetPlayout(true));
2533 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2534 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2535 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2536
solenberg1ac56142015-10-13 03:58:19 -07002537 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002538 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2539 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002540 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541}
2542
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002543// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002544// and start sending on it.
2545TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002546 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002547 cricket::AudioOptions options_adjust_agc;
2548 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002549 webrtc::AgcConfig agc_config;
2550 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2551 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002552 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002553 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002554 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002555 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2557 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002558 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002559 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561}
2562
wu@webrtc.org97077a32013-10-25 21:18:33 +00002563TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002564 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002565 EXPECT_CALL(adm_,
2566 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002567 webrtc::AgcConfig agc_config;
2568 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2569 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002570 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2571 send_parameters_.options.tx_agc_digital_compression_gain =
2572 rtc::Optional<uint16_t>(9);
2573 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2574 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2575 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002576 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2577 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2578 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2579 EXPECT_TRUE(agc_config.limiterEnable);
2580
2581 // Check interaction with adjust_agc_delta. Both should be respected, for
2582 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002583 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2584 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002585 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2586 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2587}
2588
wu@webrtc.org97077a32013-10-25 21:18:33 +00002589TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002590 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002591 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2592 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002593 send_parameters_.options.recording_sample_rate =
2594 rtc::Optional<uint32_t>(48000);
2595 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2596 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002597}
2598
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002599// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002600// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002601TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002602 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002603 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002604}
2605
2606TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2607 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002608 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002609 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002610 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002611 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002612 EXPECT_TRUE(channel_->AddRecvStream(
2613 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002614 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2615 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002616
solenberg85a04962015-10-27 03:35:21 -07002617 // Check stats for the added streams.
2618 {
2619 cricket::VoiceMediaInfo info;
2620 EXPECT_EQ(true, channel_->GetStats(&info));
2621
2622 // We have added one send stream. We should see the stats we've set.
2623 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002624 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002625 // We have added one receive stream. We should see empty stats.
2626 EXPECT_EQ(info.receivers.size(), 1u);
2627 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2628 }
solenberg1ac56142015-10-13 03:58:19 -07002629
solenberg566ef242015-11-06 15:34:49 -08002630 // Start sending - this affects some reported stats.
2631 {
2632 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002633 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002634 EXPECT_EQ(true, channel_->GetStats(&info));
2635 VerifyVoiceSenderInfo(info.senders[0], true);
2636 }
2637
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002638 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002639 {
2640 cricket::VoiceMediaInfo info;
2641 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2642 EXPECT_EQ(true, channel_->GetStats(&info));
2643 EXPECT_EQ(1u, info.senders.size());
2644 EXPECT_EQ(0u, info.receivers.size());
2645 }
solenberg1ac56142015-10-13 03:58:19 -07002646
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002647 // Deliver a new packet - a default receive stream should be created and we
2648 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002649 {
2650 cricket::VoiceMediaInfo info;
2651 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2652 SetAudioReceiveStreamStats();
2653 EXPECT_EQ(true, channel_->GetStats(&info));
2654 EXPECT_EQ(1u, info.senders.size());
2655 EXPECT_EQ(1u, info.receivers.size());
2656 VerifyVoiceReceiverInfo(info.receivers[0]);
2657 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658}
2659
2660// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002661// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002662TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002663 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002664 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002665 EXPECT_TRUE(channel_->AddRecvStream(
2666 cricket::StreamParams::CreateLegacy(kSsrc2)));
2667 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002668}
2669
2670// Test that the local SSRC is the same on sending and receiving channels if the
2671// receive channel is created before the send channel.
2672TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002673 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2675 int receive_channel_num = voe_.GetLastChannel();
2676 EXPECT_TRUE(channel_->AddSendStream(
2677 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678
solenberg3a941542015-11-16 07:34:50 -08002679 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002680 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681}
2682
2683// Test that we can properly receive packets.
2684TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002685 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002686 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002688
2689 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2690 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002691}
2692
2693// Test that we can properly receive packets on multiple streams.
2694TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002695 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002696 const uint32_t ssrc1 = 1;
2697 const uint32_t ssrc2 = 2;
2698 const uint32_t ssrc3 = 3;
2699 EXPECT_TRUE(channel_->AddRecvStream(
2700 cricket::StreamParams::CreateLegacy(ssrc1)));
2701 EXPECT_TRUE(channel_->AddRecvStream(
2702 cricket::StreamParams::CreateLegacy(ssrc2)));
2703 EXPECT_TRUE(channel_->AddRecvStream(
2704 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002705 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002706 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002707 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002708 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002709 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002710 }
mflodman3d7db262016-04-29 00:57:13 -07002711
2712 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2713 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2714 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2715
2716 EXPECT_EQ(s1.received_packets(), 0);
2717 EXPECT_EQ(s2.received_packets(), 0);
2718 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002719
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002720 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002721 EXPECT_EQ(s1.received_packets(), 0);
2722 EXPECT_EQ(s2.received_packets(), 0);
2723 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002724
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002725 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002726 EXPECT_EQ(s1.received_packets(), 1);
2727 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2728 EXPECT_EQ(s2.received_packets(), 0);
2729 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002730
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002732 EXPECT_EQ(s1.received_packets(), 1);
2733 EXPECT_EQ(s2.received_packets(), 1);
2734 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2735 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002736
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002737 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002738 EXPECT_EQ(s1.received_packets(), 1);
2739 EXPECT_EQ(s2.received_packets(), 1);
2740 EXPECT_EQ(s3.received_packets(), 1);
2741 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002742
mflodman3d7db262016-04-29 00:57:13 -07002743 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2744 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2745 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746}
2747
solenberg7e63ef02015-11-20 00:19:43 -08002748// Test that receiving on an unsignalled stream works (default channel will be
2749// created).
2750TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002751 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002752 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2753
solenberg7e63ef02015-11-20 00:19:43 -08002754 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002755
2756 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2757 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2758 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002759}
2760
2761// Test that receiving on an unsignalled stream works (default channel will be
2762// created), and that packets will be forwarded to the default channel
2763// regardless of their SSRCs.
2764TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002765 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002766 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002767 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2768
mflodman3d7db262016-04-29 00:57:13 -07002769 // Note that ssrc = 0 is not supported.
2770 uint32_t ssrc = 1;
2771 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002772 rtc::SetBE32(&packet[8], ssrc);
2773 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002774
2775 // Verify we only have one default stream.
2776 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2777 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2778 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002779 }
mflodman3d7db262016-04-29 00:57:13 -07002780
2781 // Sending the same ssrc again should not create a new stream.
2782 --ssrc;
2783 DeliverPacket(packet, sizeof(packet));
2784 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2785 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2786 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002787}
2788
2789// Test that a default channel is created even after a signalled stream has been
2790// added, and that this stream will get any packets for unknown SSRCs.
2791TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002792 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002793 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002794 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2795
2796 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002797 const uint32_t signaled_ssrc = 1;
2798 rtc::SetBE32(&packet[8], signaled_ssrc);
2799 EXPECT_TRUE(channel_->AddRecvStream(
2800 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002801 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002802 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2803 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002804
2805 // Note that the first unknown SSRC cannot be 0, because we only support
2806 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002807 const uint32_t unsignaled_ssrc = 7011;
2808 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002809 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002810 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2811 packet, sizeof(packet)));
2812 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2813
2814 DeliverPacket(packet, sizeof(packet));
2815 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2816
2817 rtc::SetBE32(&packet[8], signaled_ssrc);
2818 DeliverPacket(packet, sizeof(packet));
2819 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2820 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002821}
2822
solenberg0a617e22015-10-20 15:49:38 -07002823// Test that we properly handle failures to add a receive stream.
2824TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002825 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002826 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002828}
2829
solenberg0a617e22015-10-20 15:49:38 -07002830// Test that we properly handle failures to add a send stream.
2831TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002832 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002833 voe_.set_fail_create_channel(true);
2834 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2835}
2836
solenberg1ac56142015-10-13 03:58:19 -07002837// Test that AddRecvStream creates new stream.
2838TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002839 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002840 int channel_num = voe_.GetLastChannel();
2841 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002842 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843}
2844
2845// Test that after adding a recv stream, we do not decode more codecs than
2846// those previously passed into SetRecvCodecs.
2847TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002848 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002849 cricket::AudioRecvParameters parameters;
2850 parameters.codecs.push_back(kIsacCodec);
2851 parameters.codecs.push_back(kPcmuCodec);
2852 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002853 EXPECT_TRUE(channel_->AddRecvStream(
2854 cricket::StreamParams::CreateLegacy(kSsrc1)));
2855 int channel_num2 = voe_.GetLastChannel();
2856 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002857 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002858 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002859 gcodec.channels = 2;
2860 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2861}
2862
2863// Test that we properly clean up any streams that were added, even if
2864// not explicitly removed.
2865TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002866 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002867 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002868 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2869 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2870 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2871 delete channel_;
2872 channel_ = NULL;
2873 EXPECT_EQ(0, voe_.GetNumChannels());
2874}
2875
wu@webrtc.org78187522013-10-07 23:32:02 +00002876TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002877 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002878 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2879}
2880
2881TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002882 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002883 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002884 // Manually delete channel to simulate a failure.
2885 int channel = voe_.GetLastChannel();
2886 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2887 // Add recv stream 2 should work.
2888 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002889 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002890 EXPECT_NE(channel, new_channel);
2891 // The last created channel is deleted too.
2892 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002893}
2894
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002895// Test the InsertDtmf on default send stream as caller.
2896TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2897 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898}
2899
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002900// Test the InsertDtmf on default send stream as callee
2901TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2902 TestInsertDtmf(0, false);
2903}
2904
2905// Test the InsertDtmf on specified send stream as caller.
2906TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2907 TestInsertDtmf(kSsrc1, true);
2908}
2909
2910// Test the InsertDtmf on specified send stream as callee.
2911TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2912 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002913}
2914
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002916 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002917 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002918 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2920 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2921 EXPECT_TRUE(channel_->SetPlayout(true));
2922 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2923 EXPECT_TRUE(channel_->SetPlayout(false));
2924 EXPECT_FALSE(channel_->SetPlayout(true));
2925}
2926
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002928 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002929 EXPECT_CALL(adm_,
2930 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2931 EXPECT_CALL(adm_,
2932 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2933 EXPECT_CALL(adm_,
2934 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935 bool ec_enabled;
2936 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937 webrtc::AecmModes aecm_mode;
2938 bool cng_enabled;
2939 bool agc_enabled;
2940 webrtc::AgcModes agc_mode;
2941 webrtc::AgcConfig agc_config;
2942 bool ns_enabled;
2943 webrtc::NsModes ns_mode;
2944 bool highpass_filter_enabled;
2945 bool stereo_swapping_enabled;
2946 bool typing_detection_enabled;
2947 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002948 voe_.GetAecmMode(aecm_mode, cng_enabled);
2949 voe_.GetAgcStatus(agc_enabled, agc_mode);
2950 voe_.GetAgcConfig(agc_config);
2951 voe_.GetNsStatus(ns_enabled, ns_mode);
2952 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2953 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2954 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2955 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002956 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002957 EXPECT_FALSE(cng_enabled);
2958 EXPECT_TRUE(agc_enabled);
2959 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2960 EXPECT_TRUE(ns_enabled);
2961 EXPECT_TRUE(highpass_filter_enabled);
2962 EXPECT_FALSE(stereo_swapping_enabled);
2963 EXPECT_TRUE(typing_detection_enabled);
2964 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2965 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002966 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2967 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002968
solenberg246b8172015-12-08 09:50:23 -08002969 // Nothing set in AudioOptions, so everything should be as default.
2970 send_parameters_.options = cricket::AudioOptions();
2971 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002972 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002973 voe_.GetAecmMode(aecm_mode, cng_enabled);
2974 voe_.GetAgcStatus(agc_enabled, agc_mode);
2975 voe_.GetAgcConfig(agc_config);
2976 voe_.GetNsStatus(ns_enabled, ns_mode);
2977 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2978 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2979 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2980 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002981 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982 EXPECT_FALSE(cng_enabled);
2983 EXPECT_TRUE(agc_enabled);
2984 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2985 EXPECT_TRUE(ns_enabled);
2986 EXPECT_TRUE(highpass_filter_enabled);
2987 EXPECT_FALSE(stereo_swapping_enabled);
2988 EXPECT_TRUE(typing_detection_enabled);
2989 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2990 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002991 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2992 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002993
2994 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002995 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2996 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002997 voe_.GetEcStatus(ec_enabled, ec_mode);
2998 EXPECT_FALSE(ec_enabled);
2999
3000 // Turn echo cancellation back on, with settings, and make sure
3001 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08003002 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
3003 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003004 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003005 voe_.GetAecmMode(aecm_mode, cng_enabled);
3006 voe_.GetAgcStatus(agc_enabled, agc_mode);
3007 voe_.GetAgcConfig(agc_config);
3008 voe_.GetNsStatus(ns_enabled, ns_mode);
3009 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3010 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3011 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3012 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003013 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003014 EXPECT_TRUE(agc_enabled);
3015 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3016 EXPECT_TRUE(ns_enabled);
3017 EXPECT_TRUE(highpass_filter_enabled);
3018 EXPECT_FALSE(stereo_swapping_enabled);
3019 EXPECT_TRUE(typing_detection_enabled);
3020 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3021 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
3022
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003023 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
3024 // control.
solenberg246b8172015-12-08 09:50:23 -08003025 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3026 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003027 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003028 voe_.GetAecmMode(aecm_mode, cng_enabled);
3029 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003030 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003031 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3032
3033 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08003034 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
3035 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
3036 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
3037 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003038 voe_.GetEcStatus(ec_enabled, ec_mode);
3039 EXPECT_FALSE(ec_enabled);
3040 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08003041 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
3042 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003043 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003044 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003045 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003046 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3047
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003048 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08003049 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
3050 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003051 voe_.GetAgcStatus(agc_enabled, agc_mode);
3052 EXPECT_FALSE(agc_enabled);
3053
3054 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08003055 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
3056 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
3057 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003058 voe_.GetAgcStatus(agc_enabled, agc_mode);
3059 EXPECT_TRUE(agc_enabled);
3060 voe_.GetAgcConfig(agc_config);
3061 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3062
3063 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08003064 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
3065 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
3066 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
3067 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
3068 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003069 voe_.GetNsStatus(ns_enabled, ns_mode);
3070 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3071 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3072 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3073 EXPECT_FALSE(ns_enabled);
3074 EXPECT_FALSE(highpass_filter_enabled);
3075 EXPECT_FALSE(typing_detection_enabled);
3076 EXPECT_TRUE(stereo_swapping_enabled);
3077
solenberg1ac56142015-10-13 03:58:19 -07003078 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08003079 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003080 voe_.GetEcStatus(ec_enabled, ec_mode);
3081 voe_.GetNsStatus(ns_enabled, ns_mode);
3082 EXPECT_TRUE(ec_enabled);
3083 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3084 EXPECT_FALSE(ns_enabled);
3085 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3086}
3087
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003088TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003089 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003090
3091 bool ec_enabled;
3092 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003093 bool agc_enabled;
3094 webrtc::AgcModes agc_mode;
3095 bool ns_enabled;
3096 webrtc::NsModes ns_mode;
3097 bool highpass_filter_enabled;
3098 bool stereo_swapping_enabled;
3099 bool typing_detection_enabled;
3100
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003101 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003102 voe_.GetAgcStatus(agc_enabled, agc_mode);
3103 voe_.GetNsStatus(ns_enabled, ns_mode);
3104 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
3105 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3106 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3107 EXPECT_TRUE(ec_enabled);
3108 EXPECT_TRUE(agc_enabled);
3109 EXPECT_TRUE(ns_enabled);
3110 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003111 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003112 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003113}
3114
3115TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3116 webrtc::AgcConfig set_config = {0};
3117 set_config.targetLeveldBOv = 3;
3118 set_config.digitalCompressionGaindB = 9;
3119 set_config.limiterEnable = true;
3120 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003121
3122 webrtc::AgcConfig config = {0};
3123 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3124 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3125 EXPECT_EQ(set_config.digitalCompressionGaindB,
3126 config.digitalCompressionGaindB);
3127 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3128}
3129
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003130TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003131 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003132 EXPECT_CALL(adm_,
3133 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3134 EXPECT_CALL(adm_,
3135 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3136 EXPECT_CALL(adm_,
3137 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
3138
kwiberg686a8ef2016-02-26 03:00:35 -08003139 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003140 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003141 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003142 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003143 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003144 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003145
3146 // Have to add a stream to make SetSend work.
3147 cricket::StreamParams stream1;
3148 stream1.ssrcs.push_back(1);
3149 channel1->AddSendStream(stream1);
3150 cricket::StreamParams stream2;
3151 stream2.ssrcs.push_back(2);
3152 channel2->AddSendStream(stream2);
3153
3154 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003155 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003156 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3157 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3158 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003159 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
3160 EXPECT_EQ(parameters_options_all.options, channel1->options());
3161 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
3162 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003163
3164 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003165 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003166 parameters_options_no_ns.options.noise_suppression =
3167 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003168 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3169 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003170 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3171 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3172 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003173 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003174
3175 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003176 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003177 parameters_options_no_agc.options.auto_gain_control =
3178 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003179 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003180 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3181 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3182 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003183 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003184
solenberg246b8172015-12-08 09:50:23 -08003185 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003186 bool ec_enabled;
3187 webrtc::EcModes ec_mode;
3188 bool agc_enabled;
3189 webrtc::AgcModes agc_mode;
3190 bool ns_enabled;
3191 webrtc::NsModes ns_mode;
3192 voe_.GetEcStatus(ec_enabled, ec_mode);
3193 voe_.GetAgcStatus(agc_enabled, agc_mode);
3194 voe_.GetNsStatus(ns_enabled, ns_mode);
3195 EXPECT_TRUE(ec_enabled);
3196 EXPECT_TRUE(agc_enabled);
3197 EXPECT_TRUE(ns_enabled);
3198
solenbergd53a3f92016-04-14 13:56:37 -07003199 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003200 voe_.GetEcStatus(ec_enabled, ec_mode);
3201 voe_.GetAgcStatus(agc_enabled, agc_mode);
3202 voe_.GetNsStatus(ns_enabled, ns_mode);
3203 EXPECT_TRUE(ec_enabled);
3204 EXPECT_TRUE(agc_enabled);
3205 EXPECT_FALSE(ns_enabled);
3206
solenbergd53a3f92016-04-14 13:56:37 -07003207 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003208 voe_.GetEcStatus(ec_enabled, ec_mode);
3209 voe_.GetAgcStatus(agc_enabled, agc_mode);
3210 voe_.GetNsStatus(ns_enabled, ns_mode);
3211 EXPECT_TRUE(ec_enabled);
3212 EXPECT_FALSE(agc_enabled);
3213 EXPECT_TRUE(ns_enabled);
3214
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003215 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003216 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003217 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3218 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003219 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003220 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003221 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003222 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003223 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003224 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003225 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3226 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3227 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003228 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003229 voe_.GetEcStatus(ec_enabled, ec_mode);
3230 voe_.GetAgcStatus(agc_enabled, agc_mode);
3231 voe_.GetNsStatus(ns_enabled, ns_mode);
3232 EXPECT_TRUE(ec_enabled);
3233 EXPECT_FALSE(agc_enabled);
3234 EXPECT_FALSE(ns_enabled);
3235}
3236
wu@webrtc.orgde305012013-10-31 15:40:38 +00003237// This test verifies DSCP settings are properly applied on voice media channel.
3238TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003239 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003240 cricket::FakeNetworkInterface network_interface;
3241 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003242 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003243
solenbergbc37fc82016-04-04 09:54:44 -07003244 channel.reset(
3245 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003246 channel->SetInterface(&network_interface);
3247 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3248 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3249
3250 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003251 channel.reset(
3252 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003253 channel->SetInterface(&network_interface);
3254 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3255
3256 // Verify that setting the option to false resets the
3257 // DiffServCodePoint.
3258 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003259 channel.reset(
3260 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003261 channel->SetInterface(&network_interface);
3262 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3263 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3264
3265 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003266}
3267
solenberg1ac56142015-10-13 03:58:19 -07003268TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003269 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003270 cricket::WebRtcVoiceMediaChannel* media_channel =
3271 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003272 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3273 EXPECT_TRUE(channel_->AddRecvStream(
3274 cricket::StreamParams::CreateLegacy(kSsrc1)));
3275 int channel_id = voe_.GetLastChannel();
3276 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3277 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3278 EXPECT_TRUE(channel_->AddRecvStream(
3279 cricket::StreamParams::CreateLegacy(kSsrc2)));
3280 int channel_id2 = voe_.GetLastChannel();
3281 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003282}
3283
solenberg1ac56142015-10-13 03:58:19 -07003284TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003285 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003286 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003287 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3288 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3289 EXPECT_TRUE(channel_->AddSendStream(
3290 cricket::StreamParams::CreateLegacy(kSsrc1)));
3291 int channel_id = voe_.GetLastChannel();
3292 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3293 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3294 EXPECT_TRUE(channel_->AddSendStream(
3295 cricket::StreamParams::CreateLegacy(kSsrc2)));
3296 int channel_id2 = voe_.GetLastChannel();
3297 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003298}
3299
solenberg4bac9c52015-10-09 02:32:53 -07003300TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003301 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003302 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003303 cricket::StreamParams stream;
3304 stream.ssrcs.push_back(kSsrc2);
3305 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003306 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003307 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003308 float scale = 0;
3309 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3310 EXPECT_DOUBLE_EQ(3, scale);
3311}
3312
3313TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003314 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003315 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3316 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3317 int channel_id = voe_.GetLastChannel();
3318 float scale = 0;
3319 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3320 EXPECT_DOUBLE_EQ(2, scale);
3321 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003322 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003323 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003324}
3325
pbos8fc7fa72015-07-15 08:02:58 -07003326TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003327 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003328 const std::string kSyncLabel = "AvSyncLabel";
3329
solenbergff976312016-03-30 23:28:51 -07003330 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003331 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3332 sp.sync_label = kSyncLabel;
3333 // Creating two channels to make sure that sync label is set properly for both
3334 // the default voice channel and following ones.
3335 EXPECT_TRUE(channel_->AddRecvStream(sp));
3336 sp.ssrcs[0] += 1;
3337 EXPECT_TRUE(channel_->AddRecvStream(sp));
3338
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003339 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003340 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003341 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003342 << "SyncGroup should be set based on sync_label";
3343 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003344 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003345 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003346}
3347
solenberg3a941542015-11-16 07:34:50 -08003348// TODO(solenberg): Remove, once recv streams are configured through Call.
3349// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003350TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003351 // Test that setting the header extensions results in the expected state
3352 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003353 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003354 ssrcs.push_back(223);
3355 ssrcs.push_back(224);
3356
solenbergff976312016-03-30 23:28:51 -07003357 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003358 cricket::WebRtcVoiceMediaChannel* media_channel =
3359 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003360 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003361 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003362 EXPECT_TRUE(media_channel->AddRecvStream(
3363 cricket::StreamParams::CreateLegacy(ssrc)));
3364 }
3365
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003366 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003367 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003368 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003369 EXPECT_NE(nullptr, s);
3370 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3371 }
3372
3373 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003374 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003375 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003376 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003377 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003378 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003379 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003380 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003381 EXPECT_NE(nullptr, s);
3382 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003383 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3384 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003385 for (const auto& s_ext : s_exts) {
3386 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003387 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003388 }
3389 }
3390 }
3391 }
3392
3393 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003394 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003395 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003396 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003397 EXPECT_NE(nullptr, s);
3398 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3399 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003400}
3401
3402TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3403 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003404 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003405 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003406 static const unsigned char kRtcp[] = {
3407 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3408 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3411 };
jbaucheec21bd2016-03-20 06:15:43 -07003412 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003413
solenbergff976312016-03-30 23:28:51 -07003414 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003415 cricket::WebRtcVoiceMediaChannel* media_channel =
3416 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003417 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003418 EXPECT_TRUE(media_channel->AddRecvStream(
3419 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3420
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003421 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003422 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003423 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003424 EXPECT_EQ(0, s->received_packets());
3425 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3426 EXPECT_EQ(1, s->received_packets());
3427 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3428 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003429}
Minyue2013aec2015-05-13 14:14:42 +02003430
solenberg0a617e22015-10-20 15:49:38 -07003431// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003432// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003433TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003434 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003435 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003436 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003437 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3438 int recv_ch = voe_.GetLastChannel();
3439 EXPECT_NE(recv_ch, default_channel);
3440 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3441 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3442 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003443 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3444 recv_ch = voe_.GetLastChannel();
3445 EXPECT_NE(recv_ch, default_channel);
3446 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003447}
3448
3449TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003450 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003451 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003452
3453 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3454 int recv_ch = voe_.GetLastChannel();
3455
3456 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3457 int send_ch = voe_.GetLastChannel();
3458
3459 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3460 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3461 // channel of |recv_ch|.This is not a common case, since, normally, only the
3462 // default channel can be associated. However, the default is not deletable.
3463 // So we force the |recv_ch| to associate with a non-default channel.
3464 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3465 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3466
3467 EXPECT_TRUE(channel_->RemoveSendStream(2));
3468 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3469}
stefan658910c2015-09-03 05:48:32 -07003470
deadbeef884f5852016-01-15 09:20:04 -08003471TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003472 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003473 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3474 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003475
3476 // Setting the sink before a recv stream exists should do nothing.
3477 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3478 EXPECT_TRUE(
3479 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3480 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3481
3482 // Now try actually setting the sink.
3483 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3484 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3485
3486 // Now try resetting it.
3487 channel_->SetRawAudioSink(kSsrc1, nullptr);
3488 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3489}
3490
3491TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003492 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003493 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3494 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003495
3496 // Should be able to set a default sink even when no stream exists.
3497 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3498
3499 // Create default channel and ensure it's assigned the default sink.
3500 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3501 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3502
3503 // Try resetting the default sink.
3504 channel_->SetRawAudioSink(0, nullptr);
3505 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3506
3507 // Try setting the default sink while the default stream exists.
3508 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3509 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3510
3511 // If we remove and add a default stream, it should get the same sink.
3512 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3513 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3514 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3515}
3516
skvlad7a43d252016-03-22 15:32:27 -07003517// Test that, just like the video channel, the voice channel communicates the
3518// network state to the call.
3519TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003520 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003521
3522 EXPECT_EQ(webrtc::kNetworkUp,
3523 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3524 EXPECT_EQ(webrtc::kNetworkUp,
3525 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3526
3527 channel_->OnReadyToSend(false);
3528 EXPECT_EQ(webrtc::kNetworkDown,
3529 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3530 EXPECT_EQ(webrtc::kNetworkUp,
3531 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3532
3533 channel_->OnReadyToSend(true);
3534 EXPECT_EQ(webrtc::kNetworkUp,
3535 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3536 EXPECT_EQ(webrtc::kNetworkUp,
3537 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3538}
3539
stefan658910c2015-09-03 05:48:32 -07003540// Tests that the library initializes and shuts down properly.
3541TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003542 using testing::_;
3543 using testing::AnyNumber;
3544
3545 // If the VoiceEngine wants to gather available codecs early, that's fine but
3546 // we never want it to create a decoder at this stage.
3547 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
3548 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
3549 ON_CALL(*factory.get(), GetSupportedFormats())
3550 .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
3551 EXPECT_CALL(*factory.get(), GetSupportedFormats())
3552 .Times(AnyNumber());
3553 EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
3554
3555 cricket::WebRtcVoiceEngine engine(nullptr, factory);
kwiberg686a8ef2016-02-26 03:00:35 -08003556 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003557 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003558 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3559 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003560 EXPECT_TRUE(channel != nullptr);
3561 delete channel;
solenbergff976312016-03-30 23:28:51 -07003562}
stefan658910c2015-09-03 05:48:32 -07003563
solenbergff976312016-03-30 23:28:51 -07003564// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003565TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3566 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3567 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3568 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003569 {
ossu29b1a8d2016-06-13 07:34:51 -07003570 cricket::WebRtcVoiceEngine engine(&adm, nullptr);
solenbergff976312016-03-30 23:28:51 -07003571 std::unique_ptr<webrtc::Call> call(
3572 webrtc::Call::Create(webrtc::Call::Config()));
3573 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3574 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3575 EXPECT_TRUE(channel != nullptr);
3576 delete channel;
3577 }
stefan658910c2015-09-03 05:48:32 -07003578}
3579
3580// Tests that the library is configured with the codecs we want.
ossudedfd282016-06-14 07:12:39 -07003581// TODO(ossu): This test should move into the builtin audio codecs module
3582// eventually.
stefan658910c2015-09-03 05:48:32 -07003583TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003584 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3585 // module.
3586
stefan658910c2015-09-03 05:48:32 -07003587 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003588 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003589 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003590 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003591 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003592 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003593 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003594 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003595 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003596 cricket::AudioCodec(96, "ILBC", 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, "iLBC", 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, "PCMU", 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, "PCMA", 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, "G722", 8000, 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, "red", 8000, 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", 32000, 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, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003611 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003612 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003613 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003614 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003615 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003616 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003617 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003618 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003619 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003620 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003621 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003622 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003623 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003624 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003625 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003626 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003627 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003628 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003629 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003630 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003631 cricket::AudioCodec(88, "", 0, 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, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003634 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003635 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003636 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003637 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003638
stefan658910c2015-09-03 05:48:32 -07003639 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossu29b1a8d2016-06-13 07:34:51 -07003640 cricket::WebRtcVoiceEngine engine(nullptr,
3641 webrtc::CreateBuiltinAudioDecoderFactory());
stefan658910c2015-09-03 05:48:32 -07003642 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossudedfd282016-06-14 07:12:39 -07003643 engine.send_codecs().begin(); it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003644 if (it->name == "CN" && it->clockrate == 16000) {
3645 EXPECT_EQ(105, it->id);
3646 } else if (it->name == "CN" && it->clockrate == 32000) {
3647 EXPECT_EQ(106, it->id);
3648 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3649 EXPECT_EQ(103, it->id);
3650 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3651 EXPECT_EQ(104, it->id);
3652 } else if (it->name == "G722" && it->clockrate == 8000) {
3653 EXPECT_EQ(9, it->id);
3654 } else if (it->name == "telephone-event") {
3655 EXPECT_EQ(126, it->id);
3656 } else if (it->name == "red") {
3657 EXPECT_EQ(127, it->id);
3658 } else if (it->name == "opus") {
3659 EXPECT_EQ(111, it->id);
3660 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3661 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003662 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3663 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3664 }
3665 }
stefan658910c2015-09-03 05:48:32 -07003666}
3667
3668// Tests that VoE supports at least 32 channels
3669TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossu29b1a8d2016-06-13 07:34:51 -07003670 cricket::WebRtcVoiceEngine engine(nullptr, nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003671 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003672 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003673
3674 cricket::VoiceMediaChannel* channels[32];
3675 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003676 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003677 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3678 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003679 if (!channel)
3680 break;
stefan658910c2015-09-03 05:48:32 -07003681 channels[num_channels++] = channel;
3682 }
3683
tfarina5237aaf2015-11-10 23:44:30 -08003684 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003685 EXPECT_EQ(expected, num_channels);
3686
3687 while (num_channels > 0) {
3688 delete channels[--num_channels];
3689 }
stefan658910c2015-09-03 05:48:32 -07003690}
3691
3692// Test that we set our preferred codecs properly.
3693TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003694 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3695 // - Check that our builtin codecs are usable by Channel.
3696 // - The codecs provided by the engine is usable by Channel.
3697 // It does not check that the codecs in the RecvParameters are actually
3698 // what we sent in - though it's probably reasonable to expect so, if
3699 // SetRecvParameters returns true.
3700 // I think it will become clear once audio decoder injection is completed.
3701 cricket::WebRtcVoiceEngine engine(
3702 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003703 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003704 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003705 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3706 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003707 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003708 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003709 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003710}