blob: 8f9b5d4948357bda0fed908d97928316896372ea [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakenetworkinterface.h"
22#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080023#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
ossu29b1a8d2016-06-13 07:34:51 -070027#include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
28#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h"
solenbergbc37fc82016-04-04 09:54:44 -070029#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
deadbeef67cf2c12016-04-13 10:07:16 -070036const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
deadbeef67cf2c12016-04-13 10:07:16 -070041const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
42const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
43const cricket::AudioCodec kTelephoneEventCodec(106,
44 "telephone-event",
45 8000,
46 0,
47 1);
solenberg85a04962015-10-27 03:35:21 -070048const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080049const uint32_t kSsrc2 = 2;
50const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070051const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
53class FakeVoEWrapper : public cricket::VoEWrapper {
54 public:
55 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
56 : cricket::VoEWrapper(engine, // processing
57 engine, // base
58 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine) { // volume
62 }
63};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020064} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065
solenbergff976312016-03-30 23:28:51 -070066// Tests that our stub library "works".
67TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070068 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
69 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
70 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070071 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
72 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
73 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070074 cricket::FakeWebRtcVoiceEngine voe;
75 EXPECT_FALSE(voe.IsInited());
76 {
ossu29b1a8d2016-06-13 07:34:51 -070077 cricket::WebRtcVoiceEngine engine(&adm, nullptr, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070078 EXPECT_TRUE(voe.IsInited());
79 }
80 EXPECT_FALSE(voe.IsInited());
81}
82
deadbeef884f5852016-01-15 09:20:04 -080083class FakeAudioSink : public webrtc::AudioSinkInterface {
84 public:
85 void OnData(const Data& audio) override {}
86};
87
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080088class FakeAudioSource : public cricket::AudioSource {
89 void SetSink(Sink* sink) override {}
90};
91
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092class WebRtcVoiceEngineTestFake : public testing::Test {
93 public:
stefanba4c0e42016-02-04 04:12:24 -080094 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
95
96 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070097 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
98 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
99 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700100 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
101 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
102 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
ossu29b1a8d2016-06-13 07:34:51 -0700103 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, nullptr,
solenbergbc37fc82016-04-04 09:54:44 -0700104 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200105 send_parameters_.codecs.push_back(kPcmuCodec);
106 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000107 }
solenbergff976312016-03-30 23:28:51 -0700108 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700109 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
110 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200111 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000112 }
solenbergff976312016-03-30 23:28:51 -0700113 bool SetupRecvStream() {
114 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700115 return false;
116 }
117 return channel_->AddRecvStream(
118 cricket::StreamParams::CreateLegacy(kSsrc1));
119 }
solenbergff976312016-03-30 23:28:51 -0700120 bool SetupSendStream() {
121 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000122 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800124 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
125 return false;
126 }
127 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000129 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700130 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700131 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800132 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700133 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700134 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800135 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000136 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700138 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000139 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200141 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 }
144
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100145 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
146 const auto* send_stream = call_.GetAudioSendStream(ssrc);
147 EXPECT_TRUE(send_stream);
148 return *send_stream;
149 }
150
deadbeef884f5852016-01-15 09:20:04 -0800151 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
152 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
153 EXPECT_TRUE(recv_stream);
154 return *recv_stream;
155 }
156
solenberg3a941542015-11-16 07:34:50 -0800157 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800158 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800159 }
160
solenberg7add0582015-11-20 09:59:34 -0800161 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800162 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800163 }
164
solenbergd53a3f92016-04-14 13:56:37 -0700165 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
166 ASSERT_TRUE(channel);
167 if (enable) {
168 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
169 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
170 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
171 }
172 channel->SetSend(enable);
173 }
174
Peter Boström0c4e06b2015-10-07 12:23:21 +0200175 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700176 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000177 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700178 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000179 // send stream.
180 EXPECT_TRUE(channel_->AddSendStream(
181 cricket::StreamParams::CreateLegacy(kSsrc1)));
182 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000183
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000184 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200185 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700186 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000187 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800188 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200189 send_parameters_.codecs.push_back(kTelephoneEventCodec);
190 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000191 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000192
193 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700194 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800195 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000196 EXPECT_TRUE(channel_->AddSendStream(
197 cricket::StreamParams::CreateLegacy(kSsrc1)));
198 }
199
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800201 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100203 // Test send.
204 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
205 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
206 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800207 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100208 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
209 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
210 EXPECT_EQ(2, telephone_event.event_code);
211 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000212 }
213
214 // Test that send bandwidth is set correctly.
215 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000216 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
217 // |expected_result| is the expected result from SetMaxSendBandwidth().
218 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700219 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
220 int max_bitrate,
221 bool expected_result,
222 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200223 cricket::AudioSendParameters parameters;
224 parameters.codecs.push_back(codec);
225 parameters.max_bandwidth_bps = max_bitrate;
226 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
227
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000228 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000229 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000231 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 }
233
skvlade0d46372016-04-07 22:59:22 -0700234 // Sets the per-stream maximum bitrate limit for the specified SSRC.
235 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700236 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700237 EXPECT_EQ(1UL, parameters.encodings.size());
238
239 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700240 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700241 }
242
243 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
244 cricket::AudioSendParameters send_parameters;
245 send_parameters.codecs.push_back(codec);
246 send_parameters.max_bandwidth_bps = bitrate;
247 return channel_->SetSendParameters(send_parameters);
248 }
249
250 int GetCodecBitrate(int32_t ssrc) {
251 cricket::WebRtcVoiceMediaChannel* media_channel =
252 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
253 int channel = media_channel->GetSendChannelId(ssrc);
254 EXPECT_NE(-1, channel);
255 webrtc::CodecInst codec;
256 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
257 return codec.rate;
258 }
259
260 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
261 int global_max,
262 int stream_max,
263 bool expected_result,
264 int expected_codec_bitrate) {
265 // Clear the bitrate limit from the previous test case.
266 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
267
268 // Attempt to set the requested bitrate limits.
269 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
270 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
271
272 // Verify that reading back the parameters gives results
273 // consistent with the Set() result.
274 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700275 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700276 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
277 EXPECT_EQ(expected_result ? stream_max : -1,
278 resulting_parameters.encodings[0].max_bitrate_bps);
279
280 // Verify that the codec settings have the expected bitrate.
281 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
282 }
283
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000284 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700285 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000286
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000287 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800288 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000289
290 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700291 send_parameters_.extensions.push_back(
292 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200293 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800294 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000295
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000296 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200297 send_parameters_.extensions.clear();
298 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800299 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000300
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000301 // Ensure extension is set properly.
302 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700303 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200304 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800305 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700306 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800307 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000308
solenberg7add0582015-11-20 09:59:34 -0800309 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000310 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700311 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800312 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
313 call_.GetAudioSendStream(kSsrc2));
314 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700315 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800316 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000317
318 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200319 send_parameters_.codecs.push_back(kPcmuCodec);
320 send_parameters_.extensions.clear();
321 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800322 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
323 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000324 }
325
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000326 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700327 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000328
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000329 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800330 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000331
332 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700333 recv_parameters_.extensions.push_back(
334 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800335 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
336 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000337
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000338 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800339 recv_parameters_.extensions.clear();
340 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
341 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000342
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000343 // Ensure extension is set properly.
344 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700345 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800346 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
347 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700348 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800349 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000350
solenberg7add0582015-11-20 09:59:34 -0800351 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000352 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700353 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800354 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
355 call_.GetAudioReceiveStream(kSsrc2));
356 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700357 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800358 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000359
360 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800361 recv_parameters_.extensions.clear();
362 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
363 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
364 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000365 }
366
solenberg85a04962015-10-27 03:35:21 -0700367 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
368 webrtc::AudioSendStream::Stats stats;
369 stats.local_ssrc = 12;
370 stats.bytes_sent = 345;
371 stats.packets_sent = 678;
372 stats.packets_lost = 9012;
373 stats.fraction_lost = 34.56f;
374 stats.codec_name = "codec_name_send";
375 stats.ext_seqnum = 789;
376 stats.jitter_ms = 12;
377 stats.rtt_ms = 345;
378 stats.audio_level = 678;
379 stats.aec_quality_min = 9.01f;
380 stats.echo_delay_median_ms = 234;
381 stats.echo_delay_std_ms = 567;
382 stats.echo_return_loss = 890;
383 stats.echo_return_loss_enhancement = 1234;
384 stats.typing_noise_detected = true;
385 return stats;
386 }
387 void SetAudioSendStreamStats() {
388 for (auto* s : call_.GetAudioSendStreams()) {
389 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200390 }
solenberg85a04962015-10-27 03:35:21 -0700391 }
solenberg566ef242015-11-06 15:34:49 -0800392 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
393 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700394 const auto stats = GetAudioSendStreamStats();
395 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
396 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
397 EXPECT_EQ(info.packets_sent, stats.packets_sent);
398 EXPECT_EQ(info.packets_lost, stats.packets_lost);
399 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
400 EXPECT_EQ(info.codec_name, stats.codec_name);
401 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
402 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
403 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
404 EXPECT_EQ(info.audio_level, stats.audio_level);
405 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
406 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
407 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
408 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
409 EXPECT_EQ(info.echo_return_loss_enhancement,
410 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800411 EXPECT_EQ(info.typing_noise_detected,
412 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700413 }
414
415 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
416 webrtc::AudioReceiveStream::Stats stats;
417 stats.remote_ssrc = 123;
418 stats.bytes_rcvd = 456;
419 stats.packets_rcvd = 768;
420 stats.packets_lost = 101;
421 stats.fraction_lost = 23.45f;
422 stats.codec_name = "codec_name_recv";
423 stats.ext_seqnum = 678;
424 stats.jitter_ms = 901;
425 stats.jitter_buffer_ms = 234;
426 stats.jitter_buffer_preferred_ms = 567;
427 stats.delay_estimate_ms = 890;
428 stats.audio_level = 1234;
429 stats.expand_rate = 5.67f;
430 stats.speech_expand_rate = 8.90f;
431 stats.secondary_decoded_rate = 1.23f;
432 stats.accelerate_rate = 4.56f;
433 stats.preemptive_expand_rate = 7.89f;
434 stats.decoding_calls_to_silence_generator = 12;
435 stats.decoding_calls_to_neteq = 345;
436 stats.decoding_normal = 67890;
437 stats.decoding_plc = 1234;
438 stats.decoding_cng = 5678;
439 stats.decoding_plc_cng = 9012;
440 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200441 return stats;
442 }
443 void SetAudioReceiveStreamStats() {
444 for (auto* s : call_.GetAudioReceiveStreams()) {
445 s->SetStats(GetAudioReceiveStreamStats());
446 }
447 }
448 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700449 const auto stats = GetAudioReceiveStreamStats();
450 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
451 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
452 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
453 EXPECT_EQ(info.packets_lost, stats.packets_lost);
454 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
455 EXPECT_EQ(info.codec_name, stats.codec_name);
456 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
457 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
458 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200459 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700460 stats.jitter_buffer_preferred_ms);
461 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
462 EXPECT_EQ(info.audio_level, stats.audio_level);
463 EXPECT_EQ(info.expand_rate, stats.expand_rate);
464 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
465 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
466 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
467 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200468 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700469 stats.decoding_calls_to_silence_generator);
470 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
471 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
472 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
473 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
474 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
475 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200476 }
477
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700479 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200480 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700482 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700483 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200484 cricket::AudioSendParameters send_parameters_;
485 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800486 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800487 private:
488 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489};
490
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491// Tests that we can create and destroy a channel.
492TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700493 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000494}
495
solenberg31fec402016-05-06 02:13:12 -0700496// Test that we can add a send stream and that it has the correct defaults.
497TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
498 EXPECT_TRUE(SetupChannel());
499 EXPECT_TRUE(
500 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
501 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
502 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
503 EXPECT_EQ("", config.rtp.c_name);
504 EXPECT_EQ(0u, config.rtp.extensions.size());
505 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
506 config.send_transport);
507}
508
509// Test that we can add a receive stream and that it has the correct defaults.
510TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
511 EXPECT_TRUE(SetupChannel());
512 EXPECT_TRUE(
513 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
514 const webrtc::AudioReceiveStream::Config& config =
515 GetRecvStreamConfig(kSsrc1);
516 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
517 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
518 EXPECT_FALSE(config.rtp.transport_cc);
519 EXPECT_EQ(0u, config.rtp.extensions.size());
520 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
521 config.rtcp_send_transport);
522 EXPECT_EQ("", config.sync_group);
523}
524
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000525// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700526// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700527// TODO(ossu): This test should move into a separate builtin audio codecs
528// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700529TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700530 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000531 ASSERT_FALSE(codecs.empty());
532 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
533 EXPECT_EQ(48000, codecs[0].clockrate);
534 EXPECT_EQ(2, codecs[0].channels);
535 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000536}
537
stefanba4c0e42016-02-04 04:12:24 -0800538TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700539 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800540 bool opus_found = false;
541 for (cricket::AudioCodec codec : codecs) {
542 if (codec.name == "opus") {
543 EXPECT_TRUE(HasTransportCc(codec));
544 opus_found = true;
545 }
546 }
547 EXPECT_TRUE(opus_found);
548}
549
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000550// Tests that we can find codecs by name or id, and that we interpret the
551// clockrate and bitrate fields properly.
552TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
553 cricket::AudioCodec codec;
554 webrtc::CodecInst codec_inst;
555 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800556 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800558 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800560 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
561 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 // Find ISAC with a different payload id.
563 codec = kIsacCodec;
564 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800565 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566 EXPECT_EQ(codec.id, codec_inst.pltype);
567 // Find PCMU with a 0 clockrate.
568 codec = kPcmuCodec;
569 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800570 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 EXPECT_EQ(codec.id, codec_inst.pltype);
572 EXPECT_EQ(8000, codec_inst.plfreq);
573 // Find PCMU with a 0 bitrate.
574 codec = kPcmuCodec;
575 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800576 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 EXPECT_EQ(codec.id, codec_inst.pltype);
578 EXPECT_EQ(64000, codec_inst.rate);
579 // Find ISAC with an explicit bitrate.
580 codec = kIsacCodec;
581 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800582 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 EXPECT_EQ(codec.id, codec_inst.pltype);
584 EXPECT_EQ(32000, codec_inst.rate);
585}
586
587// Test that we set our inbound codecs properly, including changing PT.
588TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700589 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200590 cricket::AudioRecvParameters parameters;
591 parameters.codecs.push_back(kIsacCodec);
592 parameters.codecs.push_back(kPcmuCodec);
593 parameters.codecs.push_back(kTelephoneEventCodec);
594 parameters.codecs[0].id = 106; // collide with existing telephone-event
595 parameters.codecs[2].id = 126;
596 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700597 EXPECT_TRUE(channel_->AddRecvStream(
598 cricket::StreamParams::CreateLegacy(kSsrc1)));
599 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000600 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800601 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 gcodec.plfreq = 16000;
603 gcodec.channels = 1;
604 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
605 EXPECT_EQ(106, gcodec.pltype);
606 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800607 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 gcodec.plfreq = 8000;
609 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
610 EXPECT_EQ(126, gcodec.pltype);
611 EXPECT_STREQ("telephone-event", gcodec.plname);
612}
613
614// Test that we fail to set an unknown inbound codec.
615TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700616 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200617 cricket::AudioRecvParameters parameters;
618 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700619 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200620 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621}
622
623// Test that we fail if we have duplicate types in the inbound list.
624TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700625 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200626 cricket::AudioRecvParameters parameters;
627 parameters.codecs.push_back(kIsacCodec);
628 parameters.codecs.push_back(kCn16000Codec);
629 parameters.codecs[1].id = kIsacCodec.id;
630 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631}
632
633// Test that we can decode OPUS without stereo parameters.
634TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700635 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200636 cricket::AudioRecvParameters parameters;
637 parameters.codecs.push_back(kIsacCodec);
638 parameters.codecs.push_back(kPcmuCodec);
639 parameters.codecs.push_back(kOpusCodec);
640 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 EXPECT_TRUE(channel_->AddRecvStream(
642 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700643 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800645 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 // Even without stereo parameters, recv codecs still specify channels = 2.
647 EXPECT_EQ(2, opus.channels);
648 EXPECT_EQ(111, opus.pltype);
649 EXPECT_STREQ("opus", opus.plname);
650 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700651 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 EXPECT_EQ(111, opus.pltype);
653}
654
655// Test that we can decode OPUS with stereo = 0.
656TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700657 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200658 cricket::AudioRecvParameters parameters;
659 parameters.codecs.push_back(kIsacCodec);
660 parameters.codecs.push_back(kPcmuCodec);
661 parameters.codecs.push_back(kOpusCodec);
662 parameters.codecs[2].params["stereo"] = "0";
663 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 EXPECT_TRUE(channel_->AddRecvStream(
665 cricket::StreamParams::CreateLegacy(kSsrc1)));
666 int channel_num2 = voe_.GetLastChannel();
667 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800668 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 // Even when stereo is off, recv codecs still specify channels = 2.
670 EXPECT_EQ(2, opus.channels);
671 EXPECT_EQ(111, opus.pltype);
672 EXPECT_STREQ("opus", opus.plname);
673 opus.pltype = 0;
674 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
675 EXPECT_EQ(111, opus.pltype);
676}
677
678// Test that we can decode OPUS with stereo = 1.
679TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700680 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200681 cricket::AudioRecvParameters parameters;
682 parameters.codecs.push_back(kIsacCodec);
683 parameters.codecs.push_back(kPcmuCodec);
684 parameters.codecs.push_back(kOpusCodec);
685 parameters.codecs[2].params["stereo"] = "1";
686 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_TRUE(channel_->AddRecvStream(
688 cricket::StreamParams::CreateLegacy(kSsrc1)));
689 int channel_num2 = voe_.GetLastChannel();
690 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800691 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_EQ(2, opus.channels);
693 EXPECT_EQ(111, opus.pltype);
694 EXPECT_STREQ("opus", opus.plname);
695 opus.pltype = 0;
696 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
697 EXPECT_EQ(111, opus.pltype);
698}
699
700// Test that changes to recv codecs are applied to all streams.
701TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700702 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200703 cricket::AudioRecvParameters parameters;
704 parameters.codecs.push_back(kIsacCodec);
705 parameters.codecs.push_back(kPcmuCodec);
706 parameters.codecs.push_back(kTelephoneEventCodec);
707 parameters.codecs[0].id = 106; // collide with existing telephone-event
708 parameters.codecs[2].id = 126;
709 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_TRUE(channel_->AddRecvStream(
711 cricket::StreamParams::CreateLegacy(kSsrc1)));
712 int channel_num2 = voe_.GetLastChannel();
713 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800714 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 gcodec.plfreq = 16000;
716 gcodec.channels = 1;
717 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
718 EXPECT_EQ(106, gcodec.pltype);
719 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800720 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 gcodec.plfreq = 8000;
722 gcodec.channels = 1;
723 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
724 EXPECT_EQ(126, gcodec.pltype);
725 EXPECT_STREQ("telephone-event", gcodec.plname);
726}
727
728TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700729 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200730 cricket::AudioRecvParameters parameters;
731 parameters.codecs.push_back(kIsacCodec);
732 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200733 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734
735 int channel_num2 = voe_.GetLastChannel();
736 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800737 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000738 gcodec.plfreq = 16000;
739 gcodec.channels = 1;
740 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
741 EXPECT_EQ(106, gcodec.pltype);
742 EXPECT_STREQ("ISAC", gcodec.plname);
743}
744
745// Test that we can apply the same set of codecs again while playing.
746TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700747 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200748 cricket::AudioRecvParameters parameters;
749 parameters.codecs.push_back(kIsacCodec);
750 parameters.codecs.push_back(kCn16000Codec);
751 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200753 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754
755 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200756 parameters.codecs[0].id = 127;
757 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
758 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759 EXPECT_TRUE(voe_.GetPlayout(channel_num));
760}
761
762// Test that we can add a codec while playing.
763TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700764 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200765 cricket::AudioRecvParameters parameters;
766 parameters.codecs.push_back(kIsacCodec);
767 parameters.codecs.push_back(kCn16000Codec);
768 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 EXPECT_TRUE(channel_->SetPlayout(true));
770
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200771 parameters.codecs.push_back(kOpusCodec);
772 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
773 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000774 EXPECT_TRUE(voe_.GetPlayout(channel_num));
775 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800776 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
778}
779
780TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700781 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000783 // Test that when autobw is enabled, bitrate is kept as the default
784 // value. autobw is enabled for the following tests because the target
785 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786
787 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700788 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789
790 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700791 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700794 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795}
796
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000797TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700798 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000800 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801
802 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700803 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
804 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
805 // Rates above the max (56000) should be capped.
806 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000807
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000808 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700809 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
810 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
811 // Rates above the max (510000) should be capped.
812 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000813}
814
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000815TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700816 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000817
818 // Test that we can only set a maximum bitrate for a fixed-rate codec
819 // if it's bigger than the fixed rate.
820
821 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700822 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
823 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
824 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
825 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
826 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
827 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
828 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000829}
830
831TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700832 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200833 const int kDesiredBitrate = 128000;
834 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700835 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200836 parameters.max_bandwidth_bps = kDesiredBitrate;
837 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000838
839 EXPECT_TRUE(channel_->AddSendStream(
840 cricket::StreamParams::CreateLegacy(kSsrc1)));
841
842 int channel_num = voe_.GetLastChannel();
843 webrtc::CodecInst codec;
844 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200845 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000846}
847
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848// Test that bitrate cannot be set for CBR codecs.
849// Bitrate is ignored if it is higher than the fixed bitrate.
850// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000851TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700852 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000853
854 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200855 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
856 int channel_num = voe_.GetLastChannel();
857 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
859 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200860
861 send_parameters_.max_bandwidth_bps = 128000;
862 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
864 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200865
866 send_parameters_.max_bandwidth_bps = 128;
867 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000868 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
869 EXPECT_EQ(64000, codec.rate);
870}
871
skvlade0d46372016-04-07 22:59:22 -0700872// Test that the per-stream bitrate limit and the global
873// bitrate limit both apply.
874TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
875 EXPECT_TRUE(SetupSendStream());
876
877 // opus, default bitrate == 64000.
878 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
879 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
880 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
881 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
882
883 // CBR codecs allow both maximums to exceed the bitrate.
884 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
885 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
886 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
887 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
888
889 // CBR codecs don't allow per stream maximums to be too low.
890 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
891 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
892}
893
894// Test that an attempt to set RtpParameters for a stream that does not exist
895// fails.
896TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
897 EXPECT_TRUE(SetupChannel());
898 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700899 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700900 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
901
902 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700903 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700904}
905
906TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700907 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700908 // This test verifies that setting RtpParameters succeeds only if
909 // the structure contains exactly one encoding.
910 // TODO(skvlad): Update this test when we start supporting setting parameters
911 // for each encoding individually.
912
913 EXPECT_TRUE(SetupSendStream());
914 // Setting RtpParameters with no encoding is expected to fail.
915 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700916 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700917 // Setting RtpParameters with exactly one encoding should succeed.
918 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700919 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700920 // Two or more encodings should result in failure.
921 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700922 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700923}
924
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700925// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700926// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700927TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
928 EXPECT_TRUE(SetupSendStream());
929 SetSend(channel_, true);
930 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
931 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700932 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700933 ASSERT_EQ(1u, parameters.encodings.size());
934 ASSERT_TRUE(parameters.encodings[0].active);
935 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700936 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700937 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
938
939 // Now change it back to active and verify we resume sending.
940 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700941 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700942 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
943}
944
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700945// Test that SetRtpSendParameters configures the correct encoding channel for
946// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700947TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
948 SetupForMultiSendStream();
949 // Create send streams.
950 for (uint32_t ssrc : kSsrcs4) {
951 EXPECT_TRUE(
952 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
953 }
954 // Configure one stream to be limited by the stream config, another to be
955 // limited by the global max, and the third one with no per-stream limit
956 // (still subject to the global limit).
957 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
958 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
959 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
960 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
961
962 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
963 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
964 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
965
966 // Remove the global cap; the streams should switch to their respective
967 // maximums (or remain unchanged if there was no other limit on them.)
968 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
969 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
970 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
971 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
972}
973
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700974// Test that GetRtpSendParameters returns the currently configured codecs.
975TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700976 EXPECT_TRUE(SetupSendStream());
977 cricket::AudioSendParameters parameters;
978 parameters.codecs.push_back(kIsacCodec);
979 parameters.codecs.push_back(kPcmuCodec);
980 EXPECT_TRUE(channel_->SetSendParameters(parameters));
981
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700982 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700983 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700984 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
985 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700986}
987
988// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700989TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700990 EXPECT_TRUE(SetupSendStream());
991 cricket::AudioSendParameters parameters;
992 parameters.codecs.push_back(kIsacCodec);
993 parameters.codecs.push_back(kPcmuCodec);
994 EXPECT_TRUE(channel_->SetSendParameters(parameters));
995
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700996 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700997
998 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700999 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001000
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001001 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1002 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1003 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1004}
1005
1006// Test that GetRtpReceiveParameters returns the currently configured codecs.
1007TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1008 EXPECT_TRUE(SetupRecvStream());
1009 cricket::AudioRecvParameters parameters;
1010 parameters.codecs.push_back(kIsacCodec);
1011 parameters.codecs.push_back(kPcmuCodec);
1012 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1013
1014 webrtc::RtpParameters rtp_parameters =
1015 channel_->GetRtpReceiveParameters(kSsrc1);
1016 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1017 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1018 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1019}
1020
1021// Test that if we set/get parameters multiple times, we get the same results.
1022TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1023 EXPECT_TRUE(SetupRecvStream());
1024 cricket::AudioRecvParameters parameters;
1025 parameters.codecs.push_back(kIsacCodec);
1026 parameters.codecs.push_back(kPcmuCodec);
1027 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1028
1029 webrtc::RtpParameters initial_params =
1030 channel_->GetRtpReceiveParameters(kSsrc1);
1031
1032 // We should be able to set the params we just got.
1033 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1034
1035 // ... And this shouldn't change the params returned by
1036 // GetRtpReceiveParameters.
1037 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1038 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001039}
1040
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001041// Test that we apply codecs properly.
1042TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001043 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001044 cricket::AudioSendParameters parameters;
1045 parameters.codecs.push_back(kIsacCodec);
1046 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001047 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001048 parameters.codecs[0].id = 96;
1049 parameters.codecs[0].bitrate = 48000;
1050 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001051 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001052 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001053 webrtc::CodecInst gcodec;
1054 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1055 EXPECT_EQ(96, gcodec.pltype);
1056 EXPECT_EQ(48000, gcodec.rate);
1057 EXPECT_STREQ("ISAC", gcodec.plname);
1058 EXPECT_FALSE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001059 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1060 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001061 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001062}
1063
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001064// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1065// to apply.
1066TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001067 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 cricket::AudioSendParameters parameters;
1069 parameters.codecs.push_back(kIsacCodec);
1070 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001071 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001072 parameters.codecs[0].id = 96;
1073 parameters.codecs[0].bitrate = 48000;
1074 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001075 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1076 // Calling SetSendCodec again with same codec which is already set.
1077 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001079 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1080}
1081
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001082// Verify that G722 is set with 16000 samples per second to WebRTC.
1083TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001084 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001085 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001086 cricket::AudioSendParameters parameters;
1087 parameters.codecs.push_back(kG722CodecSdp);
1088 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001089 webrtc::CodecInst gcodec;
1090 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1091 EXPECT_STREQ("G722", gcodec.plname);
1092 EXPECT_EQ(1, gcodec.channels);
1093 EXPECT_EQ(16000, gcodec.plfreq);
1094}
1095
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001096// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001098 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001099 cricket::AudioSendParameters parameters;
1100 parameters.codecs.push_back(kOpusCodec);
1101 parameters.codecs[0].bitrate = 0;
1102 parameters.codecs[0].clockrate = 50000;
1103 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104}
1105
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001106// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001108 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001109 cricket::AudioSendParameters parameters;
1110 parameters.codecs.push_back(kOpusCodec);
1111 parameters.codecs[0].bitrate = 0;
1112 parameters.codecs[0].channels = 0;
1113 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114}
1115
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001116// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001118 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001119 cricket::AudioSendParameters parameters;
1120 parameters.codecs.push_back(kOpusCodec);
1121 parameters.codecs[0].bitrate = 0;
1122 parameters.codecs[0].channels = 0;
1123 parameters.codecs[0].params["stereo"] = "1";
1124 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125}
1126
1127// Test that if channel is 1 for opus and there's no stereo, we fail.
1128TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001129 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001130 cricket::AudioSendParameters parameters;
1131 parameters.codecs.push_back(kOpusCodec);
1132 parameters.codecs[0].bitrate = 0;
1133 parameters.codecs[0].channels = 1;
1134 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135}
1136
1137// Test that if channel is 1 for opus and stereo=0, we fail.
1138TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001139 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001140 cricket::AudioSendParameters parameters;
1141 parameters.codecs.push_back(kOpusCodec);
1142 parameters.codecs[0].bitrate = 0;
1143 parameters.codecs[0].channels = 1;
1144 parameters.codecs[0].params["stereo"] = "0";
1145 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146}
1147
1148// Test that if channel is 1 for opus and stereo=1, we fail.
1149TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001150 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001151 cricket::AudioSendParameters parameters;
1152 parameters.codecs.push_back(kOpusCodec);
1153 parameters.codecs[0].bitrate = 0;
1154 parameters.codecs[0].channels = 1;
1155 parameters.codecs[0].params["stereo"] = "1";
1156 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157}
1158
1159// Test that with bitrate=0 and no stereo,
1160// channels and bitrate are 1 and 32000.
1161TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001162 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001164 cricket::AudioSendParameters parameters;
1165 parameters.codecs.push_back(kOpusCodec);
1166 parameters.codecs[0].bitrate = 0;
1167 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 webrtc::CodecInst gcodec;
1169 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1170 EXPECT_STREQ("opus", gcodec.plname);
1171 EXPECT_EQ(1, gcodec.channels);
1172 EXPECT_EQ(32000, gcodec.rate);
1173}
1174
1175// Test that with bitrate=0 and stereo=0,
1176// channels and bitrate are 1 and 32000.
1177TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001178 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001180 cricket::AudioSendParameters parameters;
1181 parameters.codecs.push_back(kOpusCodec);
1182 parameters.codecs[0].bitrate = 0;
1183 parameters.codecs[0].params["stereo"] = "0";
1184 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185 webrtc::CodecInst gcodec;
1186 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1187 EXPECT_STREQ("opus", gcodec.plname);
1188 EXPECT_EQ(1, gcodec.channels);
1189 EXPECT_EQ(32000, gcodec.rate);
1190}
1191
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001192// Test that with bitrate=invalid and stereo=0,
1193// channels and bitrate are 1 and 32000.
1194TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001195 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001196 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001197 cricket::AudioSendParameters parameters;
1198 parameters.codecs.push_back(kOpusCodec);
1199 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001200 webrtc::CodecInst gcodec;
1201
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001202 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001203 parameters.codecs[0].bitrate = 5999;
1204 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001205 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1206 EXPECT_STREQ("opus", gcodec.plname);
1207 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001208 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001209
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001210 parameters.codecs[0].bitrate = 510001;
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001212 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1213 EXPECT_STREQ("opus", gcodec.plname);
1214 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001215 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216}
1217
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218// Test that with bitrate=0 and stereo=1,
1219// channels and bitrate are 2 and 64000.
1220TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001221 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001222 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001223 cricket::AudioSendParameters parameters;
1224 parameters.codecs.push_back(kOpusCodec);
1225 parameters.codecs[0].bitrate = 0;
1226 parameters.codecs[0].params["stereo"] = "1";
1227 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 webrtc::CodecInst gcodec;
1229 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1230 EXPECT_STREQ("opus", gcodec.plname);
1231 EXPECT_EQ(2, gcodec.channels);
1232 EXPECT_EQ(64000, gcodec.rate);
1233}
1234
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001235// Test that with bitrate=invalid and stereo=1,
1236// channels and bitrate are 2 and 64000.
1237TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001238 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001239 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001240 cricket::AudioSendParameters parameters;
1241 parameters.codecs.push_back(kOpusCodec);
1242 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001243 webrtc::CodecInst gcodec;
1244
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001245 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001246 parameters.codecs[0].bitrate = 5999;
1247 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001248 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1249 EXPECT_STREQ("opus", gcodec.plname);
1250 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001251 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001252
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 parameters.codecs[0].bitrate = 510001;
1254 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001255 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1256 EXPECT_STREQ("opus", gcodec.plname);
1257 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001258 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001259}
1260
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261// Test that with bitrate=N and stereo unset,
1262// channels and bitrate are 1 and N.
1263TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001264 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001265 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001266 cricket::AudioSendParameters parameters;
1267 parameters.codecs.push_back(kOpusCodec);
1268 parameters.codecs[0].bitrate = 96000;
1269 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001270 webrtc::CodecInst gcodec;
1271 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1272 EXPECT_EQ(111, gcodec.pltype);
1273 EXPECT_EQ(96000, gcodec.rate);
1274 EXPECT_STREQ("opus", gcodec.plname);
1275 EXPECT_EQ(1, gcodec.channels);
1276 EXPECT_EQ(48000, gcodec.plfreq);
1277}
1278
1279// Test that with bitrate=N and stereo=0,
1280// channels and bitrate are 1 and N.
1281TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001282 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001283 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 cricket::AudioSendParameters parameters;
1285 parameters.codecs.push_back(kOpusCodec);
1286 parameters.codecs[0].bitrate = 30000;
1287 parameters.codecs[0].params["stereo"] = "0";
1288 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001289 webrtc::CodecInst gcodec;
1290 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1291 EXPECT_EQ(1, gcodec.channels);
1292 EXPECT_EQ(30000, gcodec.rate);
1293 EXPECT_STREQ("opus", gcodec.plname);
1294}
1295
1296// Test that with bitrate=N and without any parameters,
1297// channels and bitrate are 1 and N.
1298TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001299 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001301 cricket::AudioSendParameters parameters;
1302 parameters.codecs.push_back(kOpusCodec);
1303 parameters.codecs[0].bitrate = 30000;
1304 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001305 webrtc::CodecInst gcodec;
1306 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1307 EXPECT_EQ(1, gcodec.channels);
1308 EXPECT_EQ(30000, gcodec.rate);
1309 EXPECT_STREQ("opus", gcodec.plname);
1310}
1311
1312// Test that with bitrate=N and stereo=1,
1313// channels and bitrate are 2 and N.
1314TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001315 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001316 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001317 cricket::AudioSendParameters parameters;
1318 parameters.codecs.push_back(kOpusCodec);
1319 parameters.codecs[0].bitrate = 30000;
1320 parameters.codecs[0].params["stereo"] = "1";
1321 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001322 webrtc::CodecInst gcodec;
1323 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1324 EXPECT_EQ(2, gcodec.channels);
1325 EXPECT_EQ(30000, gcodec.rate);
1326 EXPECT_STREQ("opus", gcodec.plname);
1327}
1328
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001329// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1330// Also test that the "maxaveragebitrate" can't be set to values outside the
1331// range of 6000 and 510000
1332TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001333 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001334 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 cricket::AudioSendParameters parameters;
1336 parameters.codecs.push_back(kOpusCodec);
1337 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001338 webrtc::CodecInst gcodec;
1339
1340 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1342 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001343 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001344 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345
1346 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001347 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1348 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001349 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001350 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001351
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1353 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001354 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1355 EXPECT_EQ(200000, gcodec.rate);
1356}
1357
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001358// Test that we can enable NACK with opus as caller.
1359TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001360 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001362 cricket::AudioSendParameters parameters;
1363 parameters.codecs.push_back(kOpusCodec);
1364 parameters.codecs[0].AddFeedbackParam(
1365 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1366 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001367 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001369 EXPECT_TRUE(voe_.GetNACK(channel_num));
1370}
1371
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001372// Test that we can enable NACK with opus as callee.
1373TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001374 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001375 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001376 cricket::AudioSendParameters parameters;
1377 parameters.codecs.push_back(kOpusCodec);
1378 parameters.codecs[0].AddFeedbackParam(
1379 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1380 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001381 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001382 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001383 // NACK should be enabled even with no send stream.
1384 EXPECT_TRUE(voe_.GetNACK(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001385
1386 EXPECT_TRUE(channel_->AddSendStream(
1387 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001388 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001389}
1390
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001391// Test that we can enable NACK on receive streams.
1392TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001393 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001394 int channel_num1 = voe_.GetLastChannel();
1395 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1396 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].AddFeedbackParam(
1400 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1401 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001402 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1403 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1406 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1407}
1408
1409// Test that we can disable NACK.
1410TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001411 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001412 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001413 cricket::AudioSendParameters parameters;
1414 parameters.codecs.push_back(kOpusCodec);
1415 parameters.codecs[0].AddFeedbackParam(
1416 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1417 cricket::kParamValueEmpty));
1418 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001419 EXPECT_TRUE(voe_.GetNACK(channel_num));
1420
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001421 parameters.codecs.clear();
1422 parameters.codecs.push_back(kOpusCodec);
1423 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424 EXPECT_FALSE(voe_.GetNACK(channel_num));
1425}
1426
1427// Test that we can disable NACK on receive streams.
1428TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001429 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 int channel_num1 = voe_.GetLastChannel();
1431 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1432 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 cricket::AudioSendParameters parameters;
1434 parameters.codecs.push_back(kOpusCodec);
1435 parameters.codecs[0].AddFeedbackParam(
1436 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1437 cricket::kParamValueEmpty));
1438 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001439 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1440 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1441
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001442 parameters.codecs.clear();
1443 parameters.codecs.push_back(kOpusCodec);
1444 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1446 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1447}
1448
1449// Test that NACK is enabled on a new receive stream.
1450TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001451 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001453 cricket::AudioSendParameters parameters;
1454 parameters.codecs.push_back(kIsacCodec);
1455 parameters.codecs.push_back(kCn16000Codec);
1456 parameters.codecs[0].AddFeedbackParam(
1457 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1458 cricket::kParamValueEmpty));
1459 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460 EXPECT_TRUE(voe_.GetNACK(channel_num));
1461
1462 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1463 channel_num = voe_.GetLastChannel();
1464 EXPECT_TRUE(voe_.GetNACK(channel_num));
1465 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1466 channel_num = voe_.GetLastChannel();
1467 EXPECT_TRUE(voe_.GetNACK(channel_num));
1468}
1469
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001470// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001471TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001472 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001473 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001474 cricket::AudioSendParameters parameters;
1475 parameters.codecs.push_back(kOpusCodec);
1476 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001477 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1478}
1479
1480// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001481TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001482 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001483 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001484 cricket::AudioSendParameters parameters;
1485 parameters.codecs.push_back(kOpusCodec);
1486 parameters.codecs[0].bitrate = 0;
1487 parameters.codecs[0].params["useinbandfec"] = "0";
1488 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001489 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1490 webrtc::CodecInst gcodec;
1491 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1492 EXPECT_STREQ("opus", gcodec.plname);
1493 EXPECT_EQ(1, gcodec.channels);
1494 EXPECT_EQ(32000, gcodec.rate);
1495}
1496
1497// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001498TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001499 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001500 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001501 cricket::AudioSendParameters parameters;
1502 parameters.codecs.push_back(kOpusCodec);
1503 parameters.codecs[0].bitrate = 0;
1504 parameters.codecs[0].params["useinbandfec"] = "1";
1505 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001506 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1507 webrtc::CodecInst gcodec;
1508 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1509 EXPECT_STREQ("opus", gcodec.plname);
1510 EXPECT_EQ(1, gcodec.channels);
1511 EXPECT_EQ(32000, gcodec.rate);
1512}
1513
1514// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001515TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001516 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001517 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001518 cricket::AudioSendParameters parameters;
1519 parameters.codecs.push_back(kOpusCodec);
1520 parameters.codecs[0].bitrate = 0;
1521 parameters.codecs[0].params["stereo"] = "1";
1522 parameters.codecs[0].params["useinbandfec"] = "1";
1523 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001524 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1525 webrtc::CodecInst gcodec;
1526 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1527 EXPECT_STREQ("opus", gcodec.plname);
1528 EXPECT_EQ(2, gcodec.channels);
1529 EXPECT_EQ(64000, gcodec.rate);
1530}
1531
1532// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001533TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001534 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001535 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001536 cricket::AudioSendParameters parameters;
1537 parameters.codecs.push_back(kIsacCodec);
1538 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001539 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1540}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001541
1542// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1543TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001544 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001545 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 cricket::AudioSendParameters parameters;
1547 parameters.codecs.push_back(kIsacCodec);
1548 parameters.codecs[0].params["useinbandfec"] = "1";
1549 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001550 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1551}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001552
1553// Test that Opus FEC status can be changed.
1554TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001555 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001556 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 cricket::AudioSendParameters parameters;
1558 parameters.codecs.push_back(kOpusCodec);
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001561 parameters.codecs[0].params["useinbandfec"] = "1";
1562 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001563 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1564}
1565
stefanba4c0e42016-02-04 04:12:24 -08001566TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001567 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001568 cricket::AudioSendParameters send_parameters;
1569 send_parameters.codecs.push_back(kOpusCodec);
1570 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1571 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1572
1573 cricket::AudioRecvParameters recv_parameters;
1574 recv_parameters.codecs.push_back(kIsacCodec);
1575 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1576 EXPECT_TRUE(
1577 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1578 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1579 EXPECT_FALSE(
1580 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1581
ossudedfd282016-06-14 07:12:39 -07001582 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001583 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1584 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1585 EXPECT_TRUE(
1586 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1587}
1588
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001589// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1590TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001591 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001592 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001593 cricket::AudioSendParameters parameters;
1594 parameters.codecs.push_back(kOpusCodec);
1595 parameters.codecs[0].bitrate = 0;
1596 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1597 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598 EXPECT_EQ(cricket::kOpusBandwidthNb,
1599 voe_.GetMaxEncodingBandwidth(channel_num));
1600 webrtc::CodecInst gcodec;
1601 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1602 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001603
1604 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1606 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001607 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1608 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001609}
1610
1611// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1612TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001613 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001614 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 cricket::AudioSendParameters parameters;
1616 parameters.codecs.push_back(kOpusCodec);
1617 parameters.codecs[0].bitrate = 0;
1618 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1619 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001620 EXPECT_EQ(cricket::kOpusBandwidthMb,
1621 voe_.GetMaxEncodingBandwidth(channel_num));
1622 webrtc::CodecInst gcodec;
1623 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1624 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001625
1626 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001627 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1628 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001629 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1630 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001631}
1632
1633// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1634TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001635 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001636 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001637 cricket::AudioSendParameters parameters;
1638 parameters.codecs.push_back(kOpusCodec);
1639 parameters.codecs[0].bitrate = 0;
1640 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001642 EXPECT_EQ(cricket::kOpusBandwidthWb,
1643 voe_.GetMaxEncodingBandwidth(channel_num));
1644 webrtc::CodecInst gcodec;
1645 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1646 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001647
1648 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1650 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001651 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1652 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001653}
1654
1655// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1656TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001657 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001658 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001659 cricket::AudioSendParameters parameters;
1660 parameters.codecs.push_back(kOpusCodec);
1661 parameters.codecs[0].bitrate = 0;
1662 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001664 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1665 voe_.GetMaxEncodingBandwidth(channel_num));
1666 webrtc::CodecInst gcodec;
1667 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1668 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001669
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001670 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001671 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1672 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001673 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1674 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001675}
1676
1677// Test 24000 < maxplaybackrate triggers Opus full band mode.
1678TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001679 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001680 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kOpusCodec);
1683 parameters.codecs[0].bitrate = 0;
1684 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1685 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001686 EXPECT_EQ(cricket::kOpusBandwidthFb,
1687 voe_.GetMaxEncodingBandwidth(channel_num));
1688 webrtc::CodecInst gcodec;
1689 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1690 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001691
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001692 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001693 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1694 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001695 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1696 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001697}
1698
1699// Test Opus that without maxplaybackrate, default playback rate is used.
1700TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001701 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001702 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 cricket::AudioSendParameters parameters;
1704 parameters.codecs.push_back(kOpusCodec);
1705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001706 EXPECT_EQ(cricket::kOpusBandwidthFb,
1707 voe_.GetMaxEncodingBandwidth(channel_num));
1708}
1709
1710// Test the with non-Opus, maxplaybackrate has no effect.
1711TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001712 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001713 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001714 cricket::AudioSendParameters parameters;
1715 parameters.codecs.push_back(kIsacCodec);
1716 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1717 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001718 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1719}
1720
1721// Test maxplaybackrate can be set on two streams.
1722TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001723 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001724 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 cricket::AudioSendParameters parameters;
1726 parameters.codecs.push_back(kOpusCodec);
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001728 // Default bandwidth is 24000.
1729 EXPECT_EQ(cricket::kOpusBandwidthFb,
1730 voe_.GetMaxEncodingBandwidth(channel_num));
1731
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001733
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001734 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001735 EXPECT_EQ(cricket::kOpusBandwidthNb,
1736 voe_.GetMaxEncodingBandwidth(channel_num));
1737
1738 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1739 channel_num = voe_.GetLastChannel();
1740 EXPECT_EQ(cricket::kOpusBandwidthNb,
1741 voe_.GetMaxEncodingBandwidth(channel_num));
1742}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001743
Minyue Li7100dcd2015-03-27 05:05:59 +01001744// Test that with usedtx=0, Opus DTX is off.
1745TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001746 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001747 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001748 cricket::AudioSendParameters parameters;
1749 parameters.codecs.push_back(kOpusCodec);
1750 parameters.codecs[0].params["usedtx"] = "0";
1751 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001752 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1753}
1754
1755// Test that with usedtx=1, Opus DTX is on.
1756TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001757 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001758 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001759 cricket::AudioSendParameters parameters;
1760 parameters.codecs.push_back(kOpusCodec);
1761 parameters.codecs[0].params["usedtx"] = "1";
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001763 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1764 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1765}
1766
1767// Test that usedtx=1 works with stereo Opus.
1768TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001769 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001770 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001771 cricket::AudioSendParameters parameters;
1772 parameters.codecs.push_back(kOpusCodec);
1773 parameters.codecs[0].params["usedtx"] = "1";
1774 parameters.codecs[0].params["stereo"] = "1";
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001776 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1777 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1778}
1779
1780// Test that usedtx=1 does not work with non Opus.
1781TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001782 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001783 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001784 cricket::AudioSendParameters parameters;
1785 parameters.codecs.push_back(kIsacCodec);
1786 parameters.codecs[0].params["usedtx"] = "1";
1787 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001788 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1789}
1790
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001791// Test that we can switch back and forth between Opus and ISAC with CN.
1792TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001793 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001795 cricket::AudioSendParameters opus_parameters;
1796 opus_parameters.codecs.push_back(kOpusCodec);
1797 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 webrtc::CodecInst gcodec;
1799 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001800 EXPECT_EQ(111, gcodec.pltype);
1801 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001803 cricket::AudioSendParameters isac_parameters;
1804 isac_parameters.codecs.push_back(kIsacCodec);
1805 isac_parameters.codecs.push_back(kCn16000Codec);
1806 isac_parameters.codecs.push_back(kOpusCodec);
1807 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1809 EXPECT_EQ(103, gcodec.pltype);
1810 EXPECT_STREQ("ISAC", gcodec.plname);
1811
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001812 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001814 EXPECT_EQ(111, gcodec.pltype);
1815 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816}
1817
1818// Test that we handle various ways of specifying bitrate.
1819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001820 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 cricket::AudioSendParameters parameters;
1823 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1824 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 webrtc::CodecInst gcodec;
1826 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1827 EXPECT_EQ(103, gcodec.pltype);
1828 EXPECT_STREQ("ISAC", gcodec.plname);
1829 EXPECT_EQ(32000, gcodec.rate);
1830
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001831 parameters.codecs[0].bitrate = 0; // bitrate == default
1832 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1834 EXPECT_EQ(103, gcodec.pltype);
1835 EXPECT_STREQ("ISAC", gcodec.plname);
1836 EXPECT_EQ(-1, gcodec.rate);
1837
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001838 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1841 EXPECT_EQ(103, gcodec.pltype);
1842 EXPECT_STREQ("ISAC", gcodec.plname);
1843 EXPECT_EQ(28000, gcodec.rate);
1844
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001845 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1846 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1848 EXPECT_EQ(0, gcodec.pltype);
1849 EXPECT_STREQ("PCMU", gcodec.plname);
1850 EXPECT_EQ(64000, gcodec.rate);
1851
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 parameters.codecs[0].bitrate = 0; // bitrate == default
1853 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001854 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1855 EXPECT_EQ(0, gcodec.pltype);
1856 EXPECT_STREQ("PCMU", gcodec.plname);
1857 EXPECT_EQ(64000, gcodec.rate);
1858
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001859 parameters.codecs[0] = kOpusCodec;
1860 parameters.codecs[0].bitrate = 0; // bitrate == default
1861 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1863 EXPECT_EQ(111, gcodec.pltype);
1864 EXPECT_STREQ("opus", gcodec.plname);
1865 EXPECT_EQ(32000, gcodec.rate);
1866}
1867
Brave Yao5225dd82015-03-26 07:39:19 +08001868// Test that we could set packet size specified in kCodecParamPTime.
1869TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001870 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001871 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001872 cricket::AudioSendParameters parameters;
1873 parameters.codecs.push_back(kOpusCodec);
1874 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1875 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001876 webrtc::CodecInst gcodec;
1877 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1878 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1879
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001880 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1881 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1883 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1884
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001885 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1886 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001887 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1888 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1889
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001890 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1891 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001893 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1894 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1895
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1897 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1898 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001899 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1900 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1901}
1902
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001903// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001905 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001906 cricket::AudioSendParameters parameters;
1907 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001908}
1909
1910// Test that we can set send codecs even with telephone-event codec as the first
1911// one on the list.
1912TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001913 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001915 cricket::AudioSendParameters parameters;
1916 parameters.codecs.push_back(kTelephoneEventCodec);
1917 parameters.codecs.push_back(kIsacCodec);
1918 parameters.codecs.push_back(kPcmuCodec);
1919 parameters.codecs[0].id = 98; // DTMF
1920 parameters.codecs[1].id = 96;
1921 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 webrtc::CodecInst gcodec;
1923 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001924 EXPECT_EQ(96, gcodec.pltype);
1925 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001926 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001927}
1928
solenberg31642aa2016-03-14 08:00:37 -07001929// Test that payload type range is limited for telephone-event codec.
1930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001931 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001932 cricket::AudioSendParameters parameters;
1933 parameters.codecs.push_back(kTelephoneEventCodec);
1934 parameters.codecs.push_back(kIsacCodec);
1935 parameters.codecs[0].id = 0; // DTMF
1936 parameters.codecs[1].id = 96;
1937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1938 EXPECT_TRUE(channel_->CanInsertDtmf());
1939 parameters.codecs[0].id = 128; // DTMF
1940 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1941 EXPECT_FALSE(channel_->CanInsertDtmf());
1942 parameters.codecs[0].id = 127;
1943 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1944 EXPECT_TRUE(channel_->CanInsertDtmf());
1945 parameters.codecs[0].id = -1; // DTMF
1946 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1947 EXPECT_FALSE(channel_->CanInsertDtmf());
1948}
1949
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001950// Test that we can set send codecs even with CN codec as the first
1951// one on the list.
1952TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001953 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001954 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001955 cricket::AudioSendParameters parameters;
1956 parameters.codecs.push_back(kCn16000Codec);
1957 parameters.codecs.push_back(kIsacCodec);
1958 parameters.codecs.push_back(kPcmuCodec);
1959 parameters.codecs[0].id = 98; // wideband CN
1960 parameters.codecs[1].id = 96;
1961 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001962 webrtc::CodecInst gcodec;
1963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1964 EXPECT_EQ(96, gcodec.pltype);
1965 EXPECT_STREQ("ISAC", gcodec.plname);
1966 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967}
1968
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001969// Test that we set VAD and DTMF types correctly as caller.
1970TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001971 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 cricket::AudioSendParameters parameters;
1974 parameters.codecs.push_back(kIsacCodec);
1975 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001977 parameters.codecs.push_back(kCn16000Codec);
1978 parameters.codecs.push_back(kCn8000Codec);
1979 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001980 parameters.codecs[0].id = 96;
1981 parameters.codecs[2].id = 97; // wideband CN
1982 parameters.codecs[4].id = 98; // DTMF
1983 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001984 webrtc::CodecInst gcodec;
1985 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1986 EXPECT_EQ(96, gcodec.pltype);
1987 EXPECT_STREQ("ISAC", gcodec.plname);
1988 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001989 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1990 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001991 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992}
1993
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001994// Test that we set VAD and DTMF types correctly as callee.
1995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001996 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001997 cricket::AudioSendParameters parameters;
1998 parameters.codecs.push_back(kIsacCodec);
1999 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002000 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002001 parameters.codecs.push_back(kCn16000Codec);
2002 parameters.codecs.push_back(kCn8000Codec);
2003 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002004 parameters.codecs[0].id = 96;
2005 parameters.codecs[2].id = 97; // wideband CN
2006 parameters.codecs[4].id = 98; // DTMF
2007 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002008 EXPECT_TRUE(channel_->AddSendStream(
2009 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002010 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002011
2012 webrtc::CodecInst gcodec;
2013 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2014 EXPECT_EQ(96, gcodec.pltype);
2015 EXPECT_STREQ("ISAC", gcodec.plname);
2016 EXPECT_TRUE(voe_.GetVAD(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002017 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2018 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002019 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002020}
2021
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022// Test that we only apply VAD if we have a CN codec that matches the
2023// send codec clockrate.
2024TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002025 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002027 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002028 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002029 parameters.codecs.push_back(kIsacCodec);
2030 parameters.codecs.push_back(kCn16000Codec);
2031 parameters.codecs[1].id = 97;
2032 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002033 webrtc::CodecInst gcodec;
2034 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2035 EXPECT_STREQ("ISAC", gcodec.plname);
2036 EXPECT_TRUE(voe_.GetVAD(channel_num));
2037 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2038 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002039 parameters.codecs[0] = kPcmuCodec;
2040 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002041 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2042 EXPECT_STREQ("PCMU", gcodec.plname);
2043 EXPECT_FALSE(voe_.GetVAD(channel_num));
2044 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002045 parameters.codecs[1] = kCn8000Codec;
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_TRUE(voe_.GetVAD(channel_num));
2050 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002051 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002052 parameters.codecs[0] = kIsacCodec;
2053 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002054 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2055 EXPECT_STREQ("ISAC", gcodec.plname);
2056 EXPECT_FALSE(voe_.GetVAD(channel_num));
2057}
2058
2059// Test that we perform case-insensitive matching of codec names.
2060TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002061 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002063 cricket::AudioSendParameters parameters;
2064 parameters.codecs.push_back(kIsacCodec);
2065 parameters.codecs.push_back(kPcmuCodec);
2066 parameters.codecs.push_back(kCn16000Codec);
2067 parameters.codecs.push_back(kCn8000Codec);
2068 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002069 parameters.codecs[0].name = "iSaC";
2070 parameters.codecs[0].id = 96;
2071 parameters.codecs[2].id = 97; // wideband CN
2072 parameters.codecs[4].id = 98; // DTMF
2073 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002074 webrtc::CodecInst gcodec;
2075 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2076 EXPECT_EQ(96, gcodec.pltype);
2077 EXPECT_STREQ("ISAC", gcodec.plname);
2078 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2080 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002081 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002082}
2083
stefanba4c0e42016-02-04 04:12:24 -08002084class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2085 public:
2086 WebRtcVoiceEngineWithSendSideBweTest()
2087 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2088};
2089
2090TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2091 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002092 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002093 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002094 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2095 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2096 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002097 extension.id);
2098 return;
2099 }
2100 }
2101 FAIL() << "Transport sequence number extension not in header-extension list.";
2102}
2103
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002104// Test support for audio level header extension.
2105TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002106 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002107}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002108TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002109 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002110}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002111
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002112// Test support for absolute send time header extension.
2113TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002114 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002115}
2116TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002117 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118}
2119
solenberg1ac56142015-10-13 03:58:19 -07002120// Test that we can create a channel and start sending on it.
2121TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002122 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002123 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002124 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002125 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002126 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002127 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2128}
2129
2130// Test that a channel will send if and only if it has a source and is enabled
2131// for sending.
2132TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002133 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002134 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2135 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002136 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002137 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2138 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2139 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2140 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2141 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002142}
2143
solenberg6d6e7c52016-04-13 09:07:30 -07002144// Test that SetSendParameters() does not alter a stream's send state.
2145TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2146 EXPECT_TRUE(SetupSendStream());
2147 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2148
2149 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002150 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002151 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2152
2153 // Changing RTP header extensions will recreate the AudioSendStream.
2154 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002155 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002156 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2157 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2158
2159 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002160 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002161 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2162
2163 // Changing RTP header extensions will recreate the AudioSendStream.
2164 send_parameters_.extensions.clear();
2165 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2166 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2167}
2168
solenberg1ac56142015-10-13 03:58:19 -07002169// Test that we can create a channel and start playing out on it.
2170TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002171 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002172 int channel_num = voe_.GetLastChannel();
2173 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2174 EXPECT_TRUE(channel_->SetPlayout(true));
2175 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002176 EXPECT_TRUE(channel_->SetPlayout(false));
2177 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2178}
2179
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002180// Test that we can add and remove send streams.
2181TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2182 SetupForMultiSendStream();
2183
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002184 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002185 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002186
solenbergc96df772015-10-21 13:01:53 -07002187 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002188 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002189 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002190 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002191 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002192 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002193 }
tfarina5237aaf2015-11-10 23:44:30 -08002194 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002195
solenbergc96df772015-10-21 13:01:53 -07002196 // Delete the send streams.
2197 for (uint32_t ssrc : kSsrcs4) {
2198 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002199 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002200 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002201 }
solenbergc96df772015-10-21 13:01:53 -07002202 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002203}
2204
2205// Test SetSendCodecs correctly configure the codecs in all send streams.
2206TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2207 SetupForMultiSendStream();
2208
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002209 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002210 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002211 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002212 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213 }
2214
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002215 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002216 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002217 parameters.codecs.push_back(kIsacCodec);
2218 parameters.codecs.push_back(kCn16000Codec);
2219 parameters.codecs[1].id = 97;
2220 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002221
2222 // Verify ISAC and VAD are corrected configured on all send channels.
2223 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002224 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002225 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002226 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2227 EXPECT_STREQ("ISAC", gcodec.plname);
2228 EXPECT_TRUE(voe_.GetVAD(channel_num));
2229 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2230 }
2231
2232 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002233 parameters.codecs[0] = kPcmuCodec;
2234 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002235 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002236 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002237 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2238 EXPECT_STREQ("PCMU", gcodec.plname);
2239 EXPECT_FALSE(voe_.GetVAD(channel_num));
2240 }
2241}
2242
2243// Test we can SetSend on all send streams correctly.
2244TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2245 SetupForMultiSendStream();
2246
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002247 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002248 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002249 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002250 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002251 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2252 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002253 }
2254
2255 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002256 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002257 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002258 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002259 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002260 }
2261
2262 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002263 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002264 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002265 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002266 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002267 }
2268}
2269
2270// Test we can set the correct statistics on all send streams.
2271TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2272 SetupForMultiSendStream();
2273
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002274 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002275 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002276 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002277 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002278 }
solenberg85a04962015-10-27 03:35:21 -07002279 SetAudioSendStreamStats();
2280
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002281 // Create a receive stream to check that none of the send streams end up in
2282 // the receive stream stats.
2283 EXPECT_TRUE(channel_->AddRecvStream(
2284 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002285 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002286 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2287 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002288
solenberg85a04962015-10-27 03:35:21 -07002289 // Check stats for the added streams.
2290 {
2291 cricket::VoiceMediaInfo info;
2292 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002293
solenberg85a04962015-10-27 03:35:21 -07002294 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002295 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002296 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002297 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002298 }
2299
2300 // We have added one receive stream. We should see empty stats.
2301 EXPECT_EQ(info.receivers.size(), 1u);
2302 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002303 }
solenberg1ac56142015-10-13 03:58:19 -07002304
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002305 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002306 {
2307 cricket::VoiceMediaInfo info;
2308 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2309 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002310 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002311 EXPECT_EQ(0u, info.receivers.size());
2312 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002313
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002314 // Deliver a new packet - a default receive stream should be created and we
2315 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002316 {
2317 cricket::VoiceMediaInfo info;
2318 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2319 SetAudioReceiveStreamStats();
2320 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002321 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002322 EXPECT_EQ(1u, info.receivers.size());
2323 VerifyVoiceReceiverInfo(info.receivers[0]);
2324 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002325}
2326
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002327// Test that we can add and remove receive streams, and do proper send/playout.
2328// We can receive on multiple streams while sending one stream.
2329TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002330 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002331 int channel_num1 = voe_.GetLastChannel();
2332
solenberg1ac56142015-10-13 03:58:19 -07002333 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002334 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002336 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337
solenberg1ac56142015-10-13 03:58:19 -07002338 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002339 EXPECT_TRUE(
2340 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002342 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002343 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344
solenberg1ac56142015-10-13 03:58:19 -07002345 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002346 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2347 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2348
2349 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002350 EXPECT_TRUE(
2351 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352 int channel_num3 = voe_.GetLastChannel();
2353 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2354 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2355 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356
2357 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002358 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002359 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360
2361 // Stop playout.
2362 EXPECT_TRUE(channel_->SetPlayout(false));
2363 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2364 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2365 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2366
solenberg1ac56142015-10-13 03:58:19 -07002367 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368 EXPECT_TRUE(channel_->SetPlayout(true));
2369 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2370 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2371 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2372
solenberg1ac56142015-10-13 03:58:19 -07002373 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2375 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002376 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377}
2378
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002380// and start sending on it.
2381TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002382 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002383 cricket::AudioOptions options_adjust_agc;
2384 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002385 webrtc::AgcConfig agc_config;
2386 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2387 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002388 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002389 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002390 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002391 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2393 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002394 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002395 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397}
2398
wu@webrtc.org97077a32013-10-25 21:18:33 +00002399TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002400 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002401 EXPECT_CALL(adm_,
2402 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002403 webrtc::AgcConfig agc_config;
2404 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2405 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002406 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2407 send_parameters_.options.tx_agc_digital_compression_gain =
2408 rtc::Optional<uint16_t>(9);
2409 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2410 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2411 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002412 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2413 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2414 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2415 EXPECT_TRUE(agc_config.limiterEnable);
2416
2417 // Check interaction with adjust_agc_delta. Both should be respected, for
2418 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002419 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2420 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002421 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2422 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2423}
2424
wu@webrtc.org97077a32013-10-25 21:18:33 +00002425TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002426 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002427 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2428 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002429 send_parameters_.options.recording_sample_rate =
2430 rtc::Optional<uint32_t>(48000);
2431 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2432 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002433}
2434
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002435// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002436// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002438 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002439 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440}
2441
2442TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2443 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002444 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002445 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002446 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002447 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002448 EXPECT_TRUE(channel_->AddRecvStream(
2449 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002450 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2451 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +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));
2457
2458 // We have added one send stream. We should see the stats we've set.
2459 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002460 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002461 // We have added one receive stream. We should see empty stats.
2462 EXPECT_EQ(info.receivers.size(), 1u);
2463 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2464 }
solenberg1ac56142015-10-13 03:58:19 -07002465
solenberg566ef242015-11-06 15:34:49 -08002466 // Start sending - this affects some reported stats.
2467 {
2468 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002469 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002470 EXPECT_EQ(true, channel_->GetStats(&info));
2471 VerifyVoiceSenderInfo(info.senders[0], true);
2472 }
2473
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002474 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002475 {
2476 cricket::VoiceMediaInfo info;
2477 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2478 EXPECT_EQ(true, channel_->GetStats(&info));
2479 EXPECT_EQ(1u, info.senders.size());
2480 EXPECT_EQ(0u, info.receivers.size());
2481 }
solenberg1ac56142015-10-13 03:58:19 -07002482
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002483 // Deliver a new packet - a default receive stream should be created and we
2484 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002485 {
2486 cricket::VoiceMediaInfo info;
2487 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2488 SetAudioReceiveStreamStats();
2489 EXPECT_EQ(true, channel_->GetStats(&info));
2490 EXPECT_EQ(1u, info.senders.size());
2491 EXPECT_EQ(1u, info.receivers.size());
2492 VerifyVoiceReceiverInfo(info.receivers[0]);
2493 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494}
2495
2496// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002497// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002499 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002500 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002501 EXPECT_TRUE(channel_->AddRecvStream(
2502 cricket::StreamParams::CreateLegacy(kSsrc2)));
2503 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504}
2505
2506// Test that the local SSRC is the same on sending and receiving channels if the
2507// receive channel is created before the send channel.
2508TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002509 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2511 int receive_channel_num = voe_.GetLastChannel();
2512 EXPECT_TRUE(channel_->AddSendStream(
2513 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514
solenberg3a941542015-11-16 07:34:50 -08002515 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002516 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002517}
2518
2519// Test that we can properly receive packets.
2520TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002521 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002522 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002523 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002524
2525 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2526 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002527}
2528
2529// Test that we can properly receive packets on multiple streams.
2530TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002531 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002532 const uint32_t ssrc1 = 1;
2533 const uint32_t ssrc2 = 2;
2534 const uint32_t ssrc3 = 3;
2535 EXPECT_TRUE(channel_->AddRecvStream(
2536 cricket::StreamParams::CreateLegacy(ssrc1)));
2537 EXPECT_TRUE(channel_->AddRecvStream(
2538 cricket::StreamParams::CreateLegacy(ssrc2)));
2539 EXPECT_TRUE(channel_->AddRecvStream(
2540 cricket::StreamParams::CreateLegacy(ssrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002542 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002543 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002545 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546 }
mflodman3d7db262016-04-29 00:57:13 -07002547
2548 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2549 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2550 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2551
2552 EXPECT_EQ(s1.received_packets(), 0);
2553 EXPECT_EQ(s2.received_packets(), 0);
2554 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002555
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002557 EXPECT_EQ(s1.received_packets(), 0);
2558 EXPECT_EQ(s2.received_packets(), 0);
2559 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002560
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002562 EXPECT_EQ(s1.received_packets(), 1);
2563 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2564 EXPECT_EQ(s2.received_packets(), 0);
2565 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002566
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002567 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002568 EXPECT_EQ(s1.received_packets(), 1);
2569 EXPECT_EQ(s2.received_packets(), 1);
2570 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2571 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002572
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002574 EXPECT_EQ(s1.received_packets(), 1);
2575 EXPECT_EQ(s2.received_packets(), 1);
2576 EXPECT_EQ(s3.received_packets(), 1);
2577 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002578
mflodman3d7db262016-04-29 00:57:13 -07002579 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2580 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2581 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002582}
2583
solenberg7e63ef02015-11-20 00:19:43 -08002584// Test that receiving on an unsignalled stream works (default channel will be
2585// created).
2586TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002587 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002588 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2589
solenberg7e63ef02015-11-20 00:19:43 -08002590 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002591
2592 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2593 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2594 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002595}
2596
2597// Test that receiving on an unsignalled stream works (default channel will be
2598// created), and that packets will be forwarded to the default channel
2599// regardless of their SSRCs.
2600TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002601 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002602 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002603 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2604
mflodman3d7db262016-04-29 00:57:13 -07002605 // Note that ssrc = 0 is not supported.
2606 uint32_t ssrc = 1;
2607 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002608 rtc::SetBE32(&packet[8], ssrc);
2609 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002610
2611 // Verify we only have one default stream.
2612 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2613 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2614 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002615 }
mflodman3d7db262016-04-29 00:57:13 -07002616
2617 // Sending the same ssrc again should not create a new stream.
2618 --ssrc;
2619 DeliverPacket(packet, sizeof(packet));
2620 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2621 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2622 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002623}
2624
2625// Test that a default channel is created even after a signalled stream has been
2626// added, and that this stream will get any packets for unknown SSRCs.
2627TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002628 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002629 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002630 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2631
2632 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002633 const uint32_t signaled_ssrc = 1;
2634 rtc::SetBE32(&packet[8], signaled_ssrc);
2635 EXPECT_TRUE(channel_->AddRecvStream(
2636 cricket::StreamParams::CreateLegacy(signaled_ssrc)));
solenberg7e63ef02015-11-20 00:19:43 -08002637 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002638 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2639 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002640
2641 // Note that the first unknown SSRC cannot be 0, because we only support
2642 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002643 const uint32_t unsignaled_ssrc = 7011;
2644 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002645 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002646 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2647 packet, sizeof(packet)));
2648 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2649
2650 DeliverPacket(packet, sizeof(packet));
2651 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2652
2653 rtc::SetBE32(&packet[8], signaled_ssrc);
2654 DeliverPacket(packet, sizeof(packet));
2655 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2656 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002657}
2658
solenberg0a617e22015-10-20 15:49:38 -07002659// Test that we properly handle failures to add a receive stream.
2660TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002661 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002662 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002663 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002664}
2665
solenberg0a617e22015-10-20 15:49:38 -07002666// Test that we properly handle failures to add a send stream.
2667TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002668 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002669 voe_.set_fail_create_channel(true);
2670 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2671}
2672
solenberg1ac56142015-10-13 03:58:19 -07002673// Test that AddRecvStream creates new stream.
2674TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002675 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 int channel_num = voe_.GetLastChannel();
2677 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002678 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679}
2680
2681// Test that after adding a recv stream, we do not decode more codecs than
2682// those previously passed into SetRecvCodecs.
2683TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002684 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002685 cricket::AudioRecvParameters parameters;
2686 parameters.codecs.push_back(kIsacCodec);
2687 parameters.codecs.push_back(kPcmuCodec);
2688 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689 EXPECT_TRUE(channel_->AddRecvStream(
2690 cricket::StreamParams::CreateLegacy(kSsrc1)));
2691 int channel_num2 = voe_.GetLastChannel();
2692 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002693 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002694 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002695 gcodec.channels = 2;
2696 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2697}
2698
2699// Test that we properly clean up any streams that were added, even if
2700// not explicitly removed.
2701TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002702 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002703 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002704 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2705 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2706 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2707 delete channel_;
2708 channel_ = NULL;
2709 EXPECT_EQ(0, voe_.GetNumChannels());
2710}
2711
wu@webrtc.org78187522013-10-07 23:32:02 +00002712TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002713 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002714 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2715}
2716
2717TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002718 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002719 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002720 // Manually delete channel to simulate a failure.
2721 int channel = voe_.GetLastChannel();
2722 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2723 // Add recv stream 2 should work.
2724 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002725 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002726 EXPECT_NE(channel, new_channel);
2727 // The last created channel is deleted too.
2728 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002729}
2730
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002731// Test the InsertDtmf on default send stream as caller.
2732TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2733 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002734}
2735
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002736// Test the InsertDtmf on default send stream as callee
2737TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2738 TestInsertDtmf(0, false);
2739}
2740
2741// Test the InsertDtmf on specified send stream as caller.
2742TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2743 TestInsertDtmf(kSsrc1, true);
2744}
2745
2746// Test the InsertDtmf on specified send stream as callee.
2747TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2748 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002749}
2750
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002751TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002752 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002753 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002754 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2756 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2757 EXPECT_TRUE(channel_->SetPlayout(true));
2758 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2759 EXPECT_TRUE(channel_->SetPlayout(false));
2760 EXPECT_FALSE(channel_->SetPlayout(true));
2761}
2762
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002763TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002764 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002765 EXPECT_CALL(adm_,
2766 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2767 EXPECT_CALL(adm_,
2768 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2769 EXPECT_CALL(adm_,
2770 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002771 bool ec_enabled;
2772 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002773 webrtc::AecmModes aecm_mode;
2774 bool cng_enabled;
2775 bool agc_enabled;
2776 webrtc::AgcModes agc_mode;
2777 webrtc::AgcConfig agc_config;
2778 bool ns_enabled;
2779 webrtc::NsModes ns_mode;
2780 bool highpass_filter_enabled;
2781 bool stereo_swapping_enabled;
2782 bool typing_detection_enabled;
2783 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002784 voe_.GetAecmMode(aecm_mode, cng_enabled);
2785 voe_.GetAgcStatus(agc_enabled, agc_mode);
2786 voe_.GetAgcConfig(agc_config);
2787 voe_.GetNsStatus(ns_enabled, ns_mode);
2788 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2789 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2790 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2791 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002792 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002793 EXPECT_FALSE(cng_enabled);
2794 EXPECT_TRUE(agc_enabled);
2795 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2796 EXPECT_TRUE(ns_enabled);
2797 EXPECT_TRUE(highpass_filter_enabled);
2798 EXPECT_FALSE(stereo_swapping_enabled);
2799 EXPECT_TRUE(typing_detection_enabled);
2800 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2801 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002802 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2803 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804
solenberg246b8172015-12-08 09:50:23 -08002805 // Nothing set in AudioOptions, so everything should be as default.
2806 send_parameters_.options = cricket::AudioOptions();
2807 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002808 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809 voe_.GetAecmMode(aecm_mode, cng_enabled);
2810 voe_.GetAgcStatus(agc_enabled, agc_mode);
2811 voe_.GetAgcConfig(agc_config);
2812 voe_.GetNsStatus(ns_enabled, ns_mode);
2813 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2814 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2815 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2816 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002817 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002818 EXPECT_FALSE(cng_enabled);
2819 EXPECT_TRUE(agc_enabled);
2820 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2821 EXPECT_TRUE(ns_enabled);
2822 EXPECT_TRUE(highpass_filter_enabled);
2823 EXPECT_FALSE(stereo_swapping_enabled);
2824 EXPECT_TRUE(typing_detection_enabled);
2825 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2826 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002827 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2828 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002829
2830 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002831 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2832 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002833 voe_.GetEcStatus(ec_enabled, ec_mode);
2834 EXPECT_FALSE(ec_enabled);
2835
2836 // Turn echo cancellation back on, with settings, and make sure
2837 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002838 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2839 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002840 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002841 voe_.GetAecmMode(aecm_mode, cng_enabled);
2842 voe_.GetAgcStatus(agc_enabled, agc_mode);
2843 voe_.GetAgcConfig(agc_config);
2844 voe_.GetNsStatus(ns_enabled, ns_mode);
2845 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2846 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2847 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2848 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002849 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002850 EXPECT_TRUE(agc_enabled);
2851 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2852 EXPECT_TRUE(ns_enabled);
2853 EXPECT_TRUE(highpass_filter_enabled);
2854 EXPECT_FALSE(stereo_swapping_enabled);
2855 EXPECT_TRUE(typing_detection_enabled);
2856 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2857 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2858
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002859 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2860 // control.
solenberg246b8172015-12-08 09:50:23 -08002861 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2862 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002863 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002864 voe_.GetAecmMode(aecm_mode, cng_enabled);
2865 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002866 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002867 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2868
2869 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002870 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2871 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2872 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2873 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002874 voe_.GetEcStatus(ec_enabled, ec_mode);
2875 EXPECT_FALSE(ec_enabled);
2876 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002877 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2878 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002879 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002880 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002881 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002882 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2883
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002884 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002885 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2886 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002887 voe_.GetAgcStatus(agc_enabled, agc_mode);
2888 EXPECT_FALSE(agc_enabled);
2889
2890 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002891 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2892 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2893 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002894 voe_.GetAgcStatus(agc_enabled, agc_mode);
2895 EXPECT_TRUE(agc_enabled);
2896 voe_.GetAgcConfig(agc_config);
2897 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2898
2899 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002900 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2901 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2902 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2903 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2904 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002905 voe_.GetNsStatus(ns_enabled, ns_mode);
2906 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2907 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2908 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2909 EXPECT_FALSE(ns_enabled);
2910 EXPECT_FALSE(highpass_filter_enabled);
2911 EXPECT_FALSE(typing_detection_enabled);
2912 EXPECT_TRUE(stereo_swapping_enabled);
2913
solenberg1ac56142015-10-13 03:58:19 -07002914 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002915 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002916 voe_.GetEcStatus(ec_enabled, ec_mode);
2917 voe_.GetNsStatus(ns_enabled, ns_mode);
2918 EXPECT_TRUE(ec_enabled);
2919 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2920 EXPECT_FALSE(ns_enabled);
2921 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2922}
2923
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002924TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002925 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926
2927 bool ec_enabled;
2928 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929 bool agc_enabled;
2930 webrtc::AgcModes agc_mode;
2931 bool ns_enabled;
2932 webrtc::NsModes ns_mode;
2933 bool highpass_filter_enabled;
2934 bool stereo_swapping_enabled;
2935 bool typing_detection_enabled;
2936
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002938 voe_.GetAgcStatus(agc_enabled, agc_mode);
2939 voe_.GetNsStatus(ns_enabled, ns_mode);
2940 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2941 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2942 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2943 EXPECT_TRUE(ec_enabled);
2944 EXPECT_TRUE(agc_enabled);
2945 EXPECT_TRUE(ns_enabled);
2946 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002947 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002948 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002949}
2950
2951TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2952 webrtc::AgcConfig set_config = {0};
2953 set_config.targetLeveldBOv = 3;
2954 set_config.digitalCompressionGaindB = 9;
2955 set_config.limiterEnable = true;
2956 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002957
2958 webrtc::AgcConfig config = {0};
2959 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2960 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2961 EXPECT_EQ(set_config.digitalCompressionGaindB,
2962 config.digitalCompressionGaindB);
2963 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2964}
2965
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002966TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002967 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002968 EXPECT_CALL(adm_,
2969 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2970 EXPECT_CALL(adm_,
2971 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2972 EXPECT_CALL(adm_,
2973 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2974
kwiberg686a8ef2016-02-26 03:00:35 -08002975 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002976 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002977 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002978 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002979 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002980 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002981
2982 // Have to add a stream to make SetSend work.
2983 cricket::StreamParams stream1;
2984 stream1.ssrcs.push_back(1);
2985 channel1->AddSendStream(stream1);
2986 cricket::StreamParams stream2;
2987 stream2.ssrcs.push_back(2);
2988 channel2->AddSendStream(stream2);
2989
2990 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002991 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002992 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2993 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2994 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002995 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2996 EXPECT_EQ(parameters_options_all.options, channel1->options());
2997 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2998 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002999
3000 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003001 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003002 parameters_options_no_ns.options.noise_suppression =
3003 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003004 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3005 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003006 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3007 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3008 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003009 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003010
3011 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003012 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003013 parameters_options_no_agc.options.auto_gain_control =
3014 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003015 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003016 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3017 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3018 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003019 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003020
solenberg246b8172015-12-08 09:50:23 -08003021 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003022 bool ec_enabled;
3023 webrtc::EcModes ec_mode;
3024 bool agc_enabled;
3025 webrtc::AgcModes agc_mode;
3026 bool ns_enabled;
3027 webrtc::NsModes ns_mode;
3028 voe_.GetEcStatus(ec_enabled, ec_mode);
3029 voe_.GetAgcStatus(agc_enabled, agc_mode);
3030 voe_.GetNsStatus(ns_enabled, ns_mode);
3031 EXPECT_TRUE(ec_enabled);
3032 EXPECT_TRUE(agc_enabled);
3033 EXPECT_TRUE(ns_enabled);
3034
solenbergd53a3f92016-04-14 13:56:37 -07003035 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003036 voe_.GetEcStatus(ec_enabled, ec_mode);
3037 voe_.GetAgcStatus(agc_enabled, agc_mode);
3038 voe_.GetNsStatus(ns_enabled, ns_mode);
3039 EXPECT_TRUE(ec_enabled);
3040 EXPECT_TRUE(agc_enabled);
3041 EXPECT_FALSE(ns_enabled);
3042
solenbergd53a3f92016-04-14 13:56:37 -07003043 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003044 voe_.GetEcStatus(ec_enabled, ec_mode);
3045 voe_.GetAgcStatus(agc_enabled, agc_mode);
3046 voe_.GetNsStatus(ns_enabled, ns_mode);
3047 EXPECT_TRUE(ec_enabled);
3048 EXPECT_FALSE(agc_enabled);
3049 EXPECT_TRUE(ns_enabled);
3050
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003051 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003052 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003053 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3054 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003055 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003056 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003057 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003058 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003059 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003060 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003061 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3062 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3063 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003064 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003065 voe_.GetEcStatus(ec_enabled, ec_mode);
3066 voe_.GetAgcStatus(agc_enabled, agc_mode);
3067 voe_.GetNsStatus(ns_enabled, ns_mode);
3068 EXPECT_TRUE(ec_enabled);
3069 EXPECT_FALSE(agc_enabled);
3070 EXPECT_FALSE(ns_enabled);
3071}
3072
wu@webrtc.orgde305012013-10-31 15:40:38 +00003073// This test verifies DSCP settings are properly applied on voice media channel.
3074TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003075 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003076 cricket::FakeNetworkInterface network_interface;
3077 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003078 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003079
solenbergbc37fc82016-04-04 09:54:44 -07003080 channel.reset(
3081 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003082 channel->SetInterface(&network_interface);
3083 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3084 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3085
3086 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003087 channel.reset(
3088 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003089 channel->SetInterface(&network_interface);
3090 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3091
3092 // Verify that setting the option to false resets the
3093 // DiffServCodePoint.
3094 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003095 channel.reset(
3096 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003097 channel->SetInterface(&network_interface);
3098 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3099 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3100
3101 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003102}
3103
solenberg1ac56142015-10-13 03:58:19 -07003104TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003105 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003106 cricket::WebRtcVoiceMediaChannel* media_channel =
3107 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003108 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3109 EXPECT_TRUE(channel_->AddRecvStream(
3110 cricket::StreamParams::CreateLegacy(kSsrc1)));
3111 int channel_id = voe_.GetLastChannel();
3112 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3113 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3114 EXPECT_TRUE(channel_->AddRecvStream(
3115 cricket::StreamParams::CreateLegacy(kSsrc2)));
3116 int channel_id2 = voe_.GetLastChannel();
3117 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003118}
3119
solenberg1ac56142015-10-13 03:58:19 -07003120TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003121 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003122 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003123 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3124 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3125 EXPECT_TRUE(channel_->AddSendStream(
3126 cricket::StreamParams::CreateLegacy(kSsrc1)));
3127 int channel_id = voe_.GetLastChannel();
3128 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3129 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3130 EXPECT_TRUE(channel_->AddSendStream(
3131 cricket::StreamParams::CreateLegacy(kSsrc2)));
3132 int channel_id2 = voe_.GetLastChannel();
3133 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003134}
3135
solenberg4bac9c52015-10-09 02:32:53 -07003136TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003137 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003138 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003139 cricket::StreamParams stream;
3140 stream.ssrcs.push_back(kSsrc2);
3141 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003142 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003143 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003144 float scale = 0;
3145 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3146 EXPECT_DOUBLE_EQ(3, scale);
3147}
3148
3149TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003150 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003151 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3152 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3153 int channel_id = voe_.GetLastChannel();
3154 float scale = 0;
3155 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3156 EXPECT_DOUBLE_EQ(2, scale);
3157 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003158 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003159 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003160}
3161
pbos8fc7fa72015-07-15 08:02:58 -07003162TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003163 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003164 const std::string kSyncLabel = "AvSyncLabel";
3165
solenbergff976312016-03-30 23:28:51 -07003166 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003167 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3168 sp.sync_label = kSyncLabel;
3169 // Creating two channels to make sure that sync label is set properly for both
3170 // the default voice channel and following ones.
3171 EXPECT_TRUE(channel_->AddRecvStream(sp));
3172 sp.ssrcs[0] += 1;
3173 EXPECT_TRUE(channel_->AddRecvStream(sp));
3174
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003175 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003176 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003177 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003178 << "SyncGroup should be set based on sync_label";
3179 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003180 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003181 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003182}
3183
solenberg3a941542015-11-16 07:34:50 -08003184// TODO(solenberg): Remove, once recv streams are configured through Call.
3185// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003186TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003187 // Test that setting the header extensions results in the expected state
3188 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003189 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003190 ssrcs.push_back(223);
3191 ssrcs.push_back(224);
3192
solenbergff976312016-03-30 23:28:51 -07003193 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003194 cricket::WebRtcVoiceMediaChannel* media_channel =
3195 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003196 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003197 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003198 EXPECT_TRUE(media_channel->AddRecvStream(
3199 cricket::StreamParams::CreateLegacy(ssrc)));
3200 }
3201
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003202 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003203 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003204 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003205 EXPECT_NE(nullptr, s);
3206 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3207 }
3208
3209 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003210 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003211 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003212 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003213 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003214 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003215 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003216 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003217 EXPECT_NE(nullptr, s);
3218 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003219 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3220 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003221 for (const auto& s_ext : s_exts) {
3222 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003223 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003224 }
3225 }
3226 }
3227 }
3228
3229 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003230 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003231 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003232 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003233 EXPECT_NE(nullptr, s);
3234 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3235 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003236}
3237
3238TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3239 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003240 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003241 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003242 static const unsigned char kRtcp[] = {
3243 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3244 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3247 };
jbaucheec21bd2016-03-20 06:15:43 -07003248 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003249
solenbergff976312016-03-30 23:28:51 -07003250 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003251 cricket::WebRtcVoiceMediaChannel* media_channel =
3252 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003253 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003254 EXPECT_TRUE(media_channel->AddRecvStream(
3255 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3256
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003257 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003258 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003259 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003260 EXPECT_EQ(0, s->received_packets());
3261 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3262 EXPECT_EQ(1, s->received_packets());
3263 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3264 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003265}
Minyue2013aec2015-05-13 14:14:42 +02003266
solenberg0a617e22015-10-20 15:49:38 -07003267// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003268// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003269TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003270 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003271 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003272 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003273 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3274 int recv_ch = voe_.GetLastChannel();
3275 EXPECT_NE(recv_ch, default_channel);
3276 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3277 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3278 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003279 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3280 recv_ch = voe_.GetLastChannel();
3281 EXPECT_NE(recv_ch, default_channel);
3282 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003283}
3284
3285TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003286 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003287 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003288
3289 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3290 int recv_ch = voe_.GetLastChannel();
3291
3292 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3293 int send_ch = voe_.GetLastChannel();
3294
3295 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3296 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3297 // channel of |recv_ch|.This is not a common case, since, normally, only the
3298 // default channel can be associated. However, the default is not deletable.
3299 // So we force the |recv_ch| to associate with a non-default channel.
3300 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3301 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3302
3303 EXPECT_TRUE(channel_->RemoveSendStream(2));
3304 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3305}
stefan658910c2015-09-03 05:48:32 -07003306
deadbeef884f5852016-01-15 09:20:04 -08003307TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003308 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003309 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3310 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003311
3312 // Setting the sink before a recv stream exists should do nothing.
3313 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3314 EXPECT_TRUE(
3315 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3316 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3317
3318 // Now try actually setting the sink.
3319 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3320 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3321
3322 // Now try resetting it.
3323 channel_->SetRawAudioSink(kSsrc1, nullptr);
3324 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3325}
3326
3327TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003328 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003329 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3330 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003331
3332 // Should be able to set a default sink even when no stream exists.
3333 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3334
3335 // Create default channel and ensure it's assigned the default sink.
3336 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3337 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3338
3339 // Try resetting the default sink.
3340 channel_->SetRawAudioSink(0, nullptr);
3341 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3342
3343 // Try setting the default sink while the default stream exists.
3344 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3345 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3346
3347 // If we remove and add a default stream, it should get the same sink.
3348 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3349 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3350 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3351}
3352
skvlad7a43d252016-03-22 15:32:27 -07003353// Test that, just like the video channel, the voice channel communicates the
3354// network state to the call.
3355TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003356 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003357
3358 EXPECT_EQ(webrtc::kNetworkUp,
3359 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3360 EXPECT_EQ(webrtc::kNetworkUp,
3361 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3362
3363 channel_->OnReadyToSend(false);
3364 EXPECT_EQ(webrtc::kNetworkDown,
3365 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3366 EXPECT_EQ(webrtc::kNetworkUp,
3367 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3368
3369 channel_->OnReadyToSend(true);
3370 EXPECT_EQ(webrtc::kNetworkUp,
3371 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3372 EXPECT_EQ(webrtc::kNetworkUp,
3373 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3374}
3375
stefan658910c2015-09-03 05:48:32 -07003376// Tests that the library initializes and shuts down properly.
3377TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003378 using testing::_;
3379 using testing::AnyNumber;
3380
3381 // If the VoiceEngine wants to gather available codecs early, that's fine but
3382 // we never want it to create a decoder at this stage.
3383 rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
3384 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
3385 ON_CALL(*factory.get(), GetSupportedFormats())
3386 .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
3387 EXPECT_CALL(*factory.get(), GetSupportedFormats())
3388 .Times(AnyNumber());
3389 EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
3390
3391 cricket::WebRtcVoiceEngine engine(nullptr, factory);
kwiberg686a8ef2016-02-26 03:00:35 -08003392 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003393 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003394 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3395 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003396 EXPECT_TRUE(channel != nullptr);
3397 delete channel;
solenbergff976312016-03-30 23:28:51 -07003398}
stefan658910c2015-09-03 05:48:32 -07003399
solenbergff976312016-03-30 23:28:51 -07003400// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003401TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3402 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3403 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3404 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003405 {
ossu29b1a8d2016-06-13 07:34:51 -07003406 cricket::WebRtcVoiceEngine engine(&adm, nullptr);
solenbergff976312016-03-30 23:28:51 -07003407 std::unique_ptr<webrtc::Call> call(
3408 webrtc::Call::Create(webrtc::Call::Config()));
3409 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3410 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3411 EXPECT_TRUE(channel != nullptr);
3412 delete channel;
3413 }
stefan658910c2015-09-03 05:48:32 -07003414}
3415
3416// Tests that the library is configured with the codecs we want.
ossudedfd282016-06-14 07:12:39 -07003417// TODO(ossu): This test should move into the builtin audio codecs module
3418// eventually.
stefan658910c2015-09-03 05:48:32 -07003419TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003420 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3421 // module.
3422
stefan658910c2015-09-03 05:48:32 -07003423 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003424 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003425 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003426 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003427 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003428 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003429 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003430 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003431 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003432 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003433 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003434 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003435 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003436 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003437 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003438 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003439 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003440 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003441 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003442 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003443 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003444 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003445 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003446 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003447 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003448 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003449 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003450 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003451 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003452 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003453 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003454 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003455 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003456 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003457 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003458 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003459 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003460 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003461 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003462 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003463 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003464 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003465 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003466 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003467 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003468 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003469 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003470 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003471 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003472
stefan658910c2015-09-03 05:48:32 -07003473 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossu29b1a8d2016-06-13 07:34:51 -07003474 cricket::WebRtcVoiceEngine engine(nullptr,
3475 webrtc::CreateBuiltinAudioDecoderFactory());
stefan658910c2015-09-03 05:48:32 -07003476 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossudedfd282016-06-14 07:12:39 -07003477 engine.send_codecs().begin(); it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003478 if (it->name == "CN" && it->clockrate == 16000) {
3479 EXPECT_EQ(105, it->id);
3480 } else if (it->name == "CN" && it->clockrate == 32000) {
3481 EXPECT_EQ(106, it->id);
3482 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3483 EXPECT_EQ(103, it->id);
3484 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3485 EXPECT_EQ(104, it->id);
3486 } else if (it->name == "G722" && it->clockrate == 8000) {
3487 EXPECT_EQ(9, it->id);
3488 } else if (it->name == "telephone-event") {
3489 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003490 } else if (it->name == "opus") {
3491 EXPECT_EQ(111, it->id);
3492 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3493 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003494 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3495 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3496 }
3497 }
stefan658910c2015-09-03 05:48:32 -07003498}
3499
3500// Tests that VoE supports at least 32 channels
3501TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossu29b1a8d2016-06-13 07:34:51 -07003502 cricket::WebRtcVoiceEngine engine(nullptr, nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003503 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003504 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003505
3506 cricket::VoiceMediaChannel* channels[32];
3507 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003508 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003509 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3510 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003511 if (!channel)
3512 break;
stefan658910c2015-09-03 05:48:32 -07003513 channels[num_channels++] = channel;
3514 }
3515
tfarina5237aaf2015-11-10 23:44:30 -08003516 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003517 EXPECT_EQ(expected, num_channels);
3518
3519 while (num_channels > 0) {
3520 delete channels[--num_channels];
3521 }
stefan658910c2015-09-03 05:48:32 -07003522}
3523
3524// Test that we set our preferred codecs properly.
3525TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003526 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3527 // - Check that our builtin codecs are usable by Channel.
3528 // - The codecs provided by the engine is usable by Channel.
3529 // It does not check that the codecs in the RecvParameters are actually
3530 // what we sent in - though it's probably reasonable to expect so, if
3531 // SetRecvParameters returns true.
3532 // I think it will become clear once audio decoder injection is completed.
3533 cricket::WebRtcVoiceEngine engine(
3534 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003535 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003536 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003537 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3538 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003539 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003540 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003541 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003542}