blob: 7645e9272c2ef03319254d6dadb984dbb5ee11ee [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"
solenbergbc37fc82016-04-04 09:54:44 -070027#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000029using cricket::kRtpAudioLevelHeaderExtension;
30using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
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
36const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
44const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
45 1, 0);
solenberg85a04962015-10-27 03:35:21 -070046const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080047const uint32_t kSsrc2 = 2;
48const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
51class FakeVoEWrapper : public cricket::VoEWrapper {
52 public:
53 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
54 : cricket::VoEWrapper(engine, // processing
55 engine, // base
56 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 engine, // network
59 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine) { // volume
61 }
62};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020063} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
solenbergff976312016-03-30 23:28:51 -070065// Tests that our stub library "works".
66TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070067 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
68 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
69 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenbergff976312016-03-30 23:28:51 -070070 cricket::FakeWebRtcVoiceEngine voe;
71 EXPECT_FALSE(voe.IsInited());
72 {
solenbergbc37fc82016-04-04 09:54:44 -070073 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070074 EXPECT_TRUE(voe.IsInited());
75 }
76 EXPECT_FALSE(voe.IsInited());
77}
78
deadbeef884f5852016-01-15 09:20:04 -080079class FakeAudioSink : public webrtc::AudioSinkInterface {
80 public:
81 void OnData(const Data& audio) override {}
82};
83
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080084class FakeAudioSource : public cricket::AudioSource {
85 void SetSink(Sink* sink) override {}
86};
87
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088class WebRtcVoiceEngineTestFake : public testing::Test {
89 public:
stefanba4c0e42016-02-04 04:12:24 -080090 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
91
92 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070093 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
94 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
95 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
96 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
97 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +020098 send_parameters_.codecs.push_back(kPcmuCodec);
99 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 }
solenbergff976312016-03-30 23:28:51 -0700101 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700102 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
103 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200104 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000105 }
solenbergff976312016-03-30 23:28:51 -0700106 bool SetupRecvStream() {
107 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700108 return false;
109 }
110 return channel_->AddRecvStream(
111 cricket::StreamParams::CreateLegacy(kSsrc1));
112 }
solenbergff976312016-03-30 23:28:51 -0700113 bool SetupSendStream() {
114 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000115 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800117 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
118 return false;
119 }
120 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000122 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700123 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700124 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800125 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700126 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700127 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800128 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000129 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700131 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000132 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200134 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136 }
137
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100138 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
139 const auto* send_stream = call_.GetAudioSendStream(ssrc);
140 EXPECT_TRUE(send_stream);
141 return *send_stream;
142 }
143
deadbeef884f5852016-01-15 09:20:04 -0800144 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
145 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
146 EXPECT_TRUE(recv_stream);
147 return *recv_stream;
148 }
149
solenberg3a941542015-11-16 07:34:50 -0800150 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800151 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800152 }
153
solenberg7add0582015-11-20 09:59:34 -0800154 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800155 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800156 }
157
Peter Boström0c4e06b2015-10-07 12:23:21 +0200158 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700159 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000160 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700161 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000162 // send stream.
163 EXPECT_TRUE(channel_->AddSendStream(
164 cricket::StreamParams::CreateLegacy(kSsrc1)));
165 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000166
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200168 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800169 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000170 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800171 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200172 send_parameters_.codecs.push_back(kTelephoneEventCodec);
173 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000175
176 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700177 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800178 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000179 EXPECT_TRUE(channel_->AddSendStream(
180 cricket::StreamParams::CreateLegacy(kSsrc1)));
181 }
182
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800184 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100186 // Test send.
187 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
188 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
189 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800190 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100191 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
192 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
193 EXPECT_EQ(2, telephone_event.event_code);
194 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 }
196
197 // Test that send bandwidth is set correctly.
198 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000199 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
200 // |expected_result| is the expected result from SetMaxSendBandwidth().
201 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000203 int max_bitrate,
204 bool expected_result,
205 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200206 cricket::AudioSendParameters parameters;
207 parameters.codecs.push_back(codec);
208 parameters.max_bandwidth_bps = max_bitrate;
209 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
210
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000212 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000214 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000215 }
216
skvlade0d46372016-04-07 22:59:22 -0700217 // Sets the per-stream maximum bitrate limit for the specified SSRC.
218 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
219 webrtc::RtpParameters parameters = channel_->GetRtpParameters(ssrc);
220 EXPECT_EQ(1UL, parameters.encodings.size());
221
222 parameters.encodings[0].max_bitrate_bps = bitrate;
223 return channel_->SetRtpParameters(ssrc, parameters);
224 }
225
226 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
227 cricket::AudioSendParameters send_parameters;
228 send_parameters.codecs.push_back(codec);
229 send_parameters.max_bandwidth_bps = bitrate;
230 return channel_->SetSendParameters(send_parameters);
231 }
232
233 int GetCodecBitrate(int32_t ssrc) {
234 cricket::WebRtcVoiceMediaChannel* media_channel =
235 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
236 int channel = media_channel->GetSendChannelId(ssrc);
237 EXPECT_NE(-1, channel);
238 webrtc::CodecInst codec;
239 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
240 return codec.rate;
241 }
242
243 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
244 int global_max,
245 int stream_max,
246 bool expected_result,
247 int expected_codec_bitrate) {
248 // Clear the bitrate limit from the previous test case.
249 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
250
251 // Attempt to set the requested bitrate limits.
252 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
253 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
254
255 // Verify that reading back the parameters gives results
256 // consistent with the Set() result.
257 webrtc::RtpParameters resulting_parameters =
258 channel_->GetRtpParameters(kSsrc1);
259 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
260 EXPECT_EQ(expected_result ? stream_max : -1,
261 resulting_parameters.encodings[0].max_bitrate_bps);
262
263 // Verify that the codec settings have the expected bitrate.
264 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
265 }
266
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000267 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700268 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000269
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000270 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800271 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000272
273 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200274 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000275 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200276 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800277 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000278
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000279 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200280 send_parameters_.extensions.clear();
281 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800282 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000283
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000284 // Ensure extension is set properly.
285 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200286 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
287 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800288 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
289 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
290 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000291
solenberg7add0582015-11-20 09:59:34 -0800292 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000293 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700294 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800295 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
296 call_.GetAudioSendStream(kSsrc2));
297 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
298 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
299 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000300
301 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200302 send_parameters_.codecs.push_back(kPcmuCodec);
303 send_parameters_.extensions.clear();
304 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800305 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
306 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000307 }
308
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000309 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700310 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000311
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000312 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800313 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000314
315 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800316 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000317 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800318 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
319 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000320
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000321 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800322 recv_parameters_.extensions.clear();
323 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
324 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000325
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000326 // Ensure extension is set properly.
327 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800328 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
329 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
330 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
331 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
332 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000333
solenberg7add0582015-11-20 09:59:34 -0800334 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000335 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700336 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800337 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
338 call_.GetAudioReceiveStream(kSsrc2));
339 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
340 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
341 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000342
343 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800344 recv_parameters_.extensions.clear();
345 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
346 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
347 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000348 }
349
solenberg85a04962015-10-27 03:35:21 -0700350 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
351 webrtc::AudioSendStream::Stats stats;
352 stats.local_ssrc = 12;
353 stats.bytes_sent = 345;
354 stats.packets_sent = 678;
355 stats.packets_lost = 9012;
356 stats.fraction_lost = 34.56f;
357 stats.codec_name = "codec_name_send";
358 stats.ext_seqnum = 789;
359 stats.jitter_ms = 12;
360 stats.rtt_ms = 345;
361 stats.audio_level = 678;
362 stats.aec_quality_min = 9.01f;
363 stats.echo_delay_median_ms = 234;
364 stats.echo_delay_std_ms = 567;
365 stats.echo_return_loss = 890;
366 stats.echo_return_loss_enhancement = 1234;
367 stats.typing_noise_detected = true;
368 return stats;
369 }
370 void SetAudioSendStreamStats() {
371 for (auto* s : call_.GetAudioSendStreams()) {
372 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200373 }
solenberg85a04962015-10-27 03:35:21 -0700374 }
solenberg566ef242015-11-06 15:34:49 -0800375 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
376 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700377 const auto stats = GetAudioSendStreamStats();
378 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
379 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
380 EXPECT_EQ(info.packets_sent, stats.packets_sent);
381 EXPECT_EQ(info.packets_lost, stats.packets_lost);
382 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
383 EXPECT_EQ(info.codec_name, stats.codec_name);
384 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
385 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
386 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
387 EXPECT_EQ(info.audio_level, stats.audio_level);
388 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
389 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
390 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
391 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
392 EXPECT_EQ(info.echo_return_loss_enhancement,
393 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800394 EXPECT_EQ(info.typing_noise_detected,
395 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700396 }
397
398 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
399 webrtc::AudioReceiveStream::Stats stats;
400 stats.remote_ssrc = 123;
401 stats.bytes_rcvd = 456;
402 stats.packets_rcvd = 768;
403 stats.packets_lost = 101;
404 stats.fraction_lost = 23.45f;
405 stats.codec_name = "codec_name_recv";
406 stats.ext_seqnum = 678;
407 stats.jitter_ms = 901;
408 stats.jitter_buffer_ms = 234;
409 stats.jitter_buffer_preferred_ms = 567;
410 stats.delay_estimate_ms = 890;
411 stats.audio_level = 1234;
412 stats.expand_rate = 5.67f;
413 stats.speech_expand_rate = 8.90f;
414 stats.secondary_decoded_rate = 1.23f;
415 stats.accelerate_rate = 4.56f;
416 stats.preemptive_expand_rate = 7.89f;
417 stats.decoding_calls_to_silence_generator = 12;
418 stats.decoding_calls_to_neteq = 345;
419 stats.decoding_normal = 67890;
420 stats.decoding_plc = 1234;
421 stats.decoding_cng = 5678;
422 stats.decoding_plc_cng = 9012;
423 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200424 return stats;
425 }
426 void SetAudioReceiveStreamStats() {
427 for (auto* s : call_.GetAudioReceiveStreams()) {
428 s->SetStats(GetAudioReceiveStreamStats());
429 }
430 }
431 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700432 const auto stats = GetAudioReceiveStreamStats();
433 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
434 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
435 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
436 EXPECT_EQ(info.packets_lost, stats.packets_lost);
437 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
438 EXPECT_EQ(info.codec_name, stats.codec_name);
439 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
440 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
441 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200442 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700443 stats.jitter_buffer_preferred_ms);
444 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
445 EXPECT_EQ(info.audio_level, stats.audio_level);
446 EXPECT_EQ(info.expand_rate, stats.expand_rate);
447 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
448 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
449 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
450 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200451 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700452 stats.decoding_calls_to_silence_generator);
453 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
454 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
455 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
456 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
457 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
458 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200459 }
460
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700462 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200463 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700465 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700466 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200467 cricket::AudioSendParameters send_parameters_;
468 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800469 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800470 private:
471 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000472};
473
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000474// Tests that we can create and destroy a channel.
475TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700476 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000477}
478
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479// Tests that the list of supported codecs is created properly and ordered
480// correctly
481TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
solenbergbc37fc82016-04-04 09:54:44 -0700482 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 ASSERT_FALSE(codecs.empty());
484 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
485 EXPECT_EQ(48000, codecs[0].clockrate);
486 EXPECT_EQ(2, codecs[0].channels);
487 EXPECT_EQ(64000, codecs[0].bitrate);
488 int pref = codecs[0].preference;
489 for (size_t i = 1; i < codecs.size(); ++i) {
490 EXPECT_GT(pref, codecs[i].preference);
491 pref = codecs[i].preference;
492 }
493}
494
stefanba4c0e42016-02-04 04:12:24 -0800495TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700496 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800497 bool opus_found = false;
498 for (cricket::AudioCodec codec : codecs) {
499 if (codec.name == "opus") {
500 EXPECT_TRUE(HasTransportCc(codec));
501 opus_found = true;
502 }
503 }
504 EXPECT_TRUE(opus_found);
505}
506
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507// Tests that we can find codecs by name or id, and that we interpret the
508// clockrate and bitrate fields properly.
509TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
510 cricket::AudioCodec codec;
511 webrtc::CodecInst codec_inst;
512 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800513 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000514 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800515 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800517 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
518 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 // Find ISAC with a different payload id.
520 codec = kIsacCodec;
521 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800522 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000523 EXPECT_EQ(codec.id, codec_inst.pltype);
524 // Find PCMU with a 0 clockrate.
525 codec = kPcmuCodec;
526 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800527 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528 EXPECT_EQ(codec.id, codec_inst.pltype);
529 EXPECT_EQ(8000, codec_inst.plfreq);
530 // Find PCMU with a 0 bitrate.
531 codec = kPcmuCodec;
532 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800533 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534 EXPECT_EQ(codec.id, codec_inst.pltype);
535 EXPECT_EQ(64000, codec_inst.rate);
536 // Find ISAC with an explicit bitrate.
537 codec = kIsacCodec;
538 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800539 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 EXPECT_EQ(codec.id, codec_inst.pltype);
541 EXPECT_EQ(32000, codec_inst.rate);
542}
543
544// Test that we set our inbound codecs properly, including changing PT.
545TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700546 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200547 cricket::AudioRecvParameters parameters;
548 parameters.codecs.push_back(kIsacCodec);
549 parameters.codecs.push_back(kPcmuCodec);
550 parameters.codecs.push_back(kTelephoneEventCodec);
551 parameters.codecs[0].id = 106; // collide with existing telephone-event
552 parameters.codecs[2].id = 126;
553 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700554 EXPECT_TRUE(channel_->AddRecvStream(
555 cricket::StreamParams::CreateLegacy(kSsrc1)));
556 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800558 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 gcodec.plfreq = 16000;
560 gcodec.channels = 1;
561 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
562 EXPECT_EQ(106, gcodec.pltype);
563 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800564 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000565 gcodec.plfreq = 8000;
566 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
567 EXPECT_EQ(126, gcodec.pltype);
568 EXPECT_STREQ("telephone-event", gcodec.plname);
569}
570
571// Test that we fail to set an unknown inbound codec.
572TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700573 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200574 cricket::AudioRecvParameters parameters;
575 parameters.codecs.push_back(kIsacCodec);
576 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
577 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578}
579
580// Test that we fail if we have duplicate types in the inbound list.
581TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700582 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200583 cricket::AudioRecvParameters parameters;
584 parameters.codecs.push_back(kIsacCodec);
585 parameters.codecs.push_back(kCn16000Codec);
586 parameters.codecs[1].id = kIsacCodec.id;
587 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588}
589
590// Test that we can decode OPUS without stereo parameters.
591TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700592 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200593 cricket::AudioRecvParameters parameters;
594 parameters.codecs.push_back(kIsacCodec);
595 parameters.codecs.push_back(kPcmuCodec);
596 parameters.codecs.push_back(kOpusCodec);
597 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 EXPECT_TRUE(channel_->AddRecvStream(
599 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700600 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800602 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 // Even without stereo parameters, recv codecs still specify channels = 2.
604 EXPECT_EQ(2, opus.channels);
605 EXPECT_EQ(111, opus.pltype);
606 EXPECT_STREQ("opus", opus.plname);
607 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700608 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 EXPECT_EQ(111, opus.pltype);
610}
611
612// Test that we can decode OPUS with stereo = 0.
613TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700614 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200615 cricket::AudioRecvParameters parameters;
616 parameters.codecs.push_back(kIsacCodec);
617 parameters.codecs.push_back(kPcmuCodec);
618 parameters.codecs.push_back(kOpusCodec);
619 parameters.codecs[2].params["stereo"] = "0";
620 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 EXPECT_TRUE(channel_->AddRecvStream(
622 cricket::StreamParams::CreateLegacy(kSsrc1)));
623 int channel_num2 = voe_.GetLastChannel();
624 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800625 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 // Even when stereo is off, recv codecs still specify channels = 2.
627 EXPECT_EQ(2, opus.channels);
628 EXPECT_EQ(111, opus.pltype);
629 EXPECT_STREQ("opus", opus.plname);
630 opus.pltype = 0;
631 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
632 EXPECT_EQ(111, opus.pltype);
633}
634
635// Test that we can decode OPUS with stereo = 1.
636TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700637 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200638 cricket::AudioRecvParameters parameters;
639 parameters.codecs.push_back(kIsacCodec);
640 parameters.codecs.push_back(kPcmuCodec);
641 parameters.codecs.push_back(kOpusCodec);
642 parameters.codecs[2].params["stereo"] = "1";
643 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 EXPECT_TRUE(channel_->AddRecvStream(
645 cricket::StreamParams::CreateLegacy(kSsrc1)));
646 int channel_num2 = voe_.GetLastChannel();
647 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800648 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 EXPECT_EQ(2, opus.channels);
650 EXPECT_EQ(111, opus.pltype);
651 EXPECT_STREQ("opus", opus.plname);
652 opus.pltype = 0;
653 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
654 EXPECT_EQ(111, opus.pltype);
655}
656
657// Test that changes to recv codecs are applied to all streams.
658TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700659 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200660 cricket::AudioRecvParameters parameters;
661 parameters.codecs.push_back(kIsacCodec);
662 parameters.codecs.push_back(kPcmuCodec);
663 parameters.codecs.push_back(kTelephoneEventCodec);
664 parameters.codecs[0].id = 106; // collide with existing telephone-event
665 parameters.codecs[2].id = 126;
666 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 EXPECT_TRUE(channel_->AddRecvStream(
668 cricket::StreamParams::CreateLegacy(kSsrc1)));
669 int channel_num2 = voe_.GetLastChannel();
670 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800671 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672 gcodec.plfreq = 16000;
673 gcodec.channels = 1;
674 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
675 EXPECT_EQ(106, gcodec.pltype);
676 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800677 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 gcodec.plfreq = 8000;
679 gcodec.channels = 1;
680 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
681 EXPECT_EQ(126, gcodec.pltype);
682 EXPECT_STREQ("telephone-event", gcodec.plname);
683}
684
685TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700686 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200687 cricket::AudioRecvParameters parameters;
688 parameters.codecs.push_back(kIsacCodec);
689 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200690 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691
692 int channel_num2 = voe_.GetLastChannel();
693 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800694 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695 gcodec.plfreq = 16000;
696 gcodec.channels = 1;
697 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
698 EXPECT_EQ(106, gcodec.pltype);
699 EXPECT_STREQ("ISAC", gcodec.plname);
700}
701
702// Test that we can apply the same set of codecs again while playing.
703TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700704 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200705 cricket::AudioRecvParameters parameters;
706 parameters.codecs.push_back(kIsacCodec);
707 parameters.codecs.push_back(kCn16000Codec);
708 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200710 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711
712 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200713 parameters.codecs[0].id = 127;
714 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
715 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716 EXPECT_TRUE(voe_.GetPlayout(channel_num));
717}
718
719// Test that we can add a codec while playing.
720TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700721 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200722 cricket::AudioRecvParameters parameters;
723 parameters.codecs.push_back(kIsacCodec);
724 parameters.codecs.push_back(kCn16000Codec);
725 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000726 EXPECT_TRUE(channel_->SetPlayout(true));
727
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200728 parameters.codecs.push_back(kOpusCodec);
729 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
730 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731 EXPECT_TRUE(voe_.GetPlayout(channel_num));
732 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800733 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
735}
736
737TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700738 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000740 // Test that when autobw is enabled, bitrate is kept as the default
741 // value. autobw is enabled for the following tests because the target
742 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743
744 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000745 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746
747 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000748 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000751 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752}
753
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000754TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700755 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000757 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758
759 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000760 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
761 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000764 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
765 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766}
767
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000768TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700769 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000770
771 // Test that we can only set a maximum bitrate for a fixed-rate codec
772 // if it's bigger than the fixed rate.
773
774 // PCMU, fixed bitrate == 64000.
775 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
776 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
777 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
778 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
779 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
780 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
781 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
782}
783
784TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700785 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200786 const int kDesiredBitrate = 128000;
787 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700788 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200789 parameters.max_bandwidth_bps = kDesiredBitrate;
790 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000791
792 EXPECT_TRUE(channel_->AddSendStream(
793 cricket::StreamParams::CreateLegacy(kSsrc1)));
794
795 int channel_num = voe_.GetLastChannel();
796 webrtc::CodecInst codec;
797 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200798 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000799}
800
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801// Test that bitrate cannot be set for CBR codecs.
802// Bitrate is ignored if it is higher than the fixed bitrate.
803// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000804TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700805 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
807 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200808 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
809 int channel_num = voe_.GetLastChannel();
810 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
812 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813
814 send_parameters_.max_bandwidth_bps = 128000;
815 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000816 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
817 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200818
819 send_parameters_.max_bandwidth_bps = 128;
820 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
822 EXPECT_EQ(64000, codec.rate);
823}
824
skvlade0d46372016-04-07 22:59:22 -0700825// Test that the per-stream bitrate limit and the global
826// bitrate limit both apply.
827TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
828 EXPECT_TRUE(SetupSendStream());
829
830 // opus, default bitrate == 64000.
831 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
832 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
833 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
834 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
835
836 // CBR codecs allow both maximums to exceed the bitrate.
837 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
838 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
839 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
840 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
841
842 // CBR codecs don't allow per stream maximums to be too low.
843 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
844 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
845}
846
847// Test that an attempt to set RtpParameters for a stream that does not exist
848// fails.
849TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
850 EXPECT_TRUE(SetupChannel());
851 webrtc::RtpParameters nonexistent_parameters =
852 channel_->GetRtpParameters(kSsrc1);
853 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
854
855 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
856 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, nonexistent_parameters));
857}
858
859TEST_F(WebRtcVoiceEngineTestFake,
860 CannotSetRtpParametersWithIncorrectNumberOfEncodings) {
861 // This test verifies that setting RtpParameters succeeds only if
862 // the structure contains exactly one encoding.
863 // TODO(skvlad): Update this test when we start supporting setting parameters
864 // for each encoding individually.
865
866 EXPECT_TRUE(SetupSendStream());
867 // Setting RtpParameters with no encoding is expected to fail.
868 webrtc::RtpParameters parameters;
869 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
870 // Setting RtpParameters with exactly one encoding should succeed.
871 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
872 EXPECT_TRUE(channel_->SetRtpParameters(kSsrc1, parameters));
873 // Two or more encodings should result in failure.
874 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
875 EXPECT_FALSE(channel_->SetRtpParameters(kSsrc1, parameters));
876}
877
878// Test that SetRtpParameters configures the correct encoding channel for each
879// SSRC.
880TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
881 SetupForMultiSendStream();
882 // Create send streams.
883 for (uint32_t ssrc : kSsrcs4) {
884 EXPECT_TRUE(
885 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
886 }
887 // Configure one stream to be limited by the stream config, another to be
888 // limited by the global max, and the third one with no per-stream limit
889 // (still subject to the global limit).
890 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
891 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
892 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
893 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
894
895 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
896 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
897 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
898
899 // Remove the global cap; the streams should switch to their respective
900 // maximums (or remain unchanged if there was no other limit on them.)
901 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
902 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
903 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
904 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
905}
906
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000907// Test that we apply codecs properly.
908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700909 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200910 cricket::AudioSendParameters parameters;
911 parameters.codecs.push_back(kIsacCodec);
912 parameters.codecs.push_back(kPcmuCodec);
913 parameters.codecs.push_back(kRedCodec);
914 parameters.codecs[0].id = 96;
915 parameters.codecs[0].bitrate = 48000;
916 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000917 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200918 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 webrtc::CodecInst gcodec;
920 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
921 EXPECT_EQ(96, gcodec.pltype);
922 EXPECT_EQ(48000, gcodec.rate);
923 EXPECT_STREQ("ISAC", gcodec.plname);
924 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000925 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
927 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100928 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929}
930
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000931// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
932// to apply.
933TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700934 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200935 cricket::AudioSendParameters parameters;
936 parameters.codecs.push_back(kIsacCodec);
937 parameters.codecs.push_back(kPcmuCodec);
938 parameters.codecs.push_back(kRedCodec);
939 parameters.codecs[0].id = 96;
940 parameters.codecs[0].bitrate = 48000;
941 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000942 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
943 // Calling SetSendCodec again with same codec which is already set.
944 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200945 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000946 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
947}
948
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000949// Verify that G722 is set with 16000 samples per second to WebRTC.
950TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -0700951 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000952 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200953 cricket::AudioSendParameters parameters;
954 parameters.codecs.push_back(kG722CodecSdp);
955 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000956 webrtc::CodecInst gcodec;
957 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
958 EXPECT_STREQ("G722", gcodec.plname);
959 EXPECT_EQ(1, gcodec.channels);
960 EXPECT_EQ(16000, gcodec.plfreq);
961}
962
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000963// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000964TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -0700965 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200966 cricket::AudioSendParameters parameters;
967 parameters.codecs.push_back(kOpusCodec);
968 parameters.codecs[0].bitrate = 0;
969 parameters.codecs[0].clockrate = 50000;
970 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971}
972
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000973// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000974TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700975 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200976 cricket::AudioSendParameters parameters;
977 parameters.codecs.push_back(kOpusCodec);
978 parameters.codecs[0].bitrate = 0;
979 parameters.codecs[0].channels = 0;
980 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981}
982
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000983// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700985 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200986 cricket::AudioSendParameters parameters;
987 parameters.codecs.push_back(kOpusCodec);
988 parameters.codecs[0].bitrate = 0;
989 parameters.codecs[0].channels = 0;
990 parameters.codecs[0].params["stereo"] = "1";
991 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992}
993
994// Test that if channel is 1 for opus and there's no stereo, we fail.
995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700996 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200997 cricket::AudioSendParameters parameters;
998 parameters.codecs.push_back(kOpusCodec);
999 parameters.codecs[0].bitrate = 0;
1000 parameters.codecs[0].channels = 1;
1001 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002}
1003
1004// Test that if channel is 1 for opus and stereo=0, we fail.
1005TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001006 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001007 cricket::AudioSendParameters parameters;
1008 parameters.codecs.push_back(kOpusCodec);
1009 parameters.codecs[0].bitrate = 0;
1010 parameters.codecs[0].channels = 1;
1011 parameters.codecs[0].params["stereo"] = "0";
1012 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013}
1014
1015// Test that if channel is 1 for opus and stereo=1, we fail.
1016TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001017 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001018 cricket::AudioSendParameters parameters;
1019 parameters.codecs.push_back(kOpusCodec);
1020 parameters.codecs[0].bitrate = 0;
1021 parameters.codecs[0].channels = 1;
1022 parameters.codecs[0].params["stereo"] = "1";
1023 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024}
1025
1026// Test that with bitrate=0 and no stereo,
1027// channels and bitrate are 1 and 32000.
1028TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001029 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001031 cricket::AudioSendParameters parameters;
1032 parameters.codecs.push_back(kOpusCodec);
1033 parameters.codecs[0].bitrate = 0;
1034 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001035 webrtc::CodecInst gcodec;
1036 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1037 EXPECT_STREQ("opus", gcodec.plname);
1038 EXPECT_EQ(1, gcodec.channels);
1039 EXPECT_EQ(32000, gcodec.rate);
1040}
1041
1042// Test that with bitrate=0 and stereo=0,
1043// channels and bitrate are 1 and 32000.
1044TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001045 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001047 cricket::AudioSendParameters parameters;
1048 parameters.codecs.push_back(kOpusCodec);
1049 parameters.codecs[0].bitrate = 0;
1050 parameters.codecs[0].params["stereo"] = "0";
1051 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 webrtc::CodecInst gcodec;
1053 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1054 EXPECT_STREQ("opus", gcodec.plname);
1055 EXPECT_EQ(1, gcodec.channels);
1056 EXPECT_EQ(32000, gcodec.rate);
1057}
1058
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001059// Test that with bitrate=invalid and stereo=0,
1060// channels and bitrate are 1 and 32000.
1061TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001062 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001063 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001064 cricket::AudioSendParameters parameters;
1065 parameters.codecs.push_back(kOpusCodec);
1066 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001067 webrtc::CodecInst gcodec;
1068
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001069 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 parameters.codecs[0].bitrate = 5999;
1071 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001072 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1073 EXPECT_STREQ("opus", gcodec.plname);
1074 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001075 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001076
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001077 parameters.codecs[0].bitrate = 510001;
1078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001079 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1080 EXPECT_STREQ("opus", gcodec.plname);
1081 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001082 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001083}
1084
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085// Test that with bitrate=0 and stereo=1,
1086// channels and bitrate are 2 and 64000.
1087TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001088 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001089 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001090 cricket::AudioSendParameters parameters;
1091 parameters.codecs.push_back(kOpusCodec);
1092 parameters.codecs[0].bitrate = 0;
1093 parameters.codecs[0].params["stereo"] = "1";
1094 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095 webrtc::CodecInst gcodec;
1096 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1097 EXPECT_STREQ("opus", gcodec.plname);
1098 EXPECT_EQ(2, gcodec.channels);
1099 EXPECT_EQ(64000, gcodec.rate);
1100}
1101
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001102// Test that with bitrate=invalid and stereo=1,
1103// channels and bitrate are 2 and 64000.
1104TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001105 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001106 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001107 cricket::AudioSendParameters parameters;
1108 parameters.codecs.push_back(kOpusCodec);
1109 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001110 webrtc::CodecInst gcodec;
1111
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001112 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001113 parameters.codecs[0].bitrate = 5999;
1114 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001115 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1116 EXPECT_STREQ("opus", gcodec.plname);
1117 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001118 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001119
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001120 parameters.codecs[0].bitrate = 510001;
1121 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001122 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1123 EXPECT_STREQ("opus", gcodec.plname);
1124 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001125 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001126}
1127
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128// Test that with bitrate=N and stereo unset,
1129// channels and bitrate are 1 and N.
1130TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001131 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001133 cricket::AudioSendParameters parameters;
1134 parameters.codecs.push_back(kOpusCodec);
1135 parameters.codecs[0].bitrate = 96000;
1136 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137 webrtc::CodecInst gcodec;
1138 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1139 EXPECT_EQ(111, gcodec.pltype);
1140 EXPECT_EQ(96000, gcodec.rate);
1141 EXPECT_STREQ("opus", gcodec.plname);
1142 EXPECT_EQ(1, gcodec.channels);
1143 EXPECT_EQ(48000, gcodec.plfreq);
1144}
1145
1146// Test that with bitrate=N and stereo=0,
1147// channels and bitrate are 1 and N.
1148TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001149 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001151 cricket::AudioSendParameters parameters;
1152 parameters.codecs.push_back(kOpusCodec);
1153 parameters.codecs[0].bitrate = 30000;
1154 parameters.codecs[0].params["stereo"] = "0";
1155 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156 webrtc::CodecInst gcodec;
1157 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1158 EXPECT_EQ(1, gcodec.channels);
1159 EXPECT_EQ(30000, gcodec.rate);
1160 EXPECT_STREQ("opus", gcodec.plname);
1161}
1162
1163// Test that with bitrate=N and without any parameters,
1164// channels and bitrate are 1 and N.
1165TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001166 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 cricket::AudioSendParameters parameters;
1169 parameters.codecs.push_back(kOpusCodec);
1170 parameters.codecs[0].bitrate = 30000;
1171 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001172 webrtc::CodecInst gcodec;
1173 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1174 EXPECT_EQ(1, gcodec.channels);
1175 EXPECT_EQ(30000, gcodec.rate);
1176 EXPECT_STREQ("opus", gcodec.plname);
1177}
1178
1179// Test that with bitrate=N and stereo=1,
1180// channels and bitrate are 2 and N.
1181TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001182 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001184 cricket::AudioSendParameters parameters;
1185 parameters.codecs.push_back(kOpusCodec);
1186 parameters.codecs[0].bitrate = 30000;
1187 parameters.codecs[0].params["stereo"] = "1";
1188 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 webrtc::CodecInst gcodec;
1190 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1191 EXPECT_EQ(2, gcodec.channels);
1192 EXPECT_EQ(30000, gcodec.rate);
1193 EXPECT_STREQ("opus", gcodec.plname);
1194}
1195
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001196// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1197// Also test that the "maxaveragebitrate" can't be set to values outside the
1198// range of 6000 and 510000
1199TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001200 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001201 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001202 cricket::AudioSendParameters parameters;
1203 parameters.codecs.push_back(kOpusCodec);
1204 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001205 webrtc::CodecInst gcodec;
1206
1207 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1209 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001210 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001211 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001212
1213 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001214 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1215 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001217 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001218
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001219 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1220 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001221 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1222 EXPECT_EQ(200000, gcodec.rate);
1223}
1224
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001225// Test that we can enable NACK with opus as caller.
1226TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001227 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001229 cricket::AudioSendParameters parameters;
1230 parameters.codecs.push_back(kOpusCodec);
1231 parameters.codecs[0].AddFeedbackParam(
1232 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1233 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001235 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001236 EXPECT_TRUE(voe_.GetNACK(channel_num));
1237}
1238
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001239// Test that we can enable NACK with opus as callee.
1240TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001241 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001242 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001243 cricket::AudioSendParameters parameters;
1244 parameters.codecs.push_back(kOpusCodec);
1245 parameters.codecs[0].AddFeedbackParam(
1246 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1247 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001248 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001249 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001250 EXPECT_FALSE(voe_.GetNACK(channel_num));
1251
1252 EXPECT_TRUE(channel_->AddSendStream(
1253 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001254 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001255}
1256
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001257// Test that we can enable NACK on receive streams.
1258TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001259 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001260 int channel_num1 = voe_.GetLastChannel();
1261 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1262 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001263 cricket::AudioSendParameters parameters;
1264 parameters.codecs.push_back(kOpusCodec);
1265 parameters.codecs[0].AddFeedbackParam(
1266 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1267 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001268 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1269 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001270 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1272 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1273}
1274
1275// Test that we can disable NACK.
1276TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001277 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001278 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001279 cricket::AudioSendParameters parameters;
1280 parameters.codecs.push_back(kOpusCodec);
1281 parameters.codecs[0].AddFeedbackParam(
1282 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1283 cricket::kParamValueEmpty));
1284 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001285 EXPECT_TRUE(voe_.GetNACK(channel_num));
1286
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001287 parameters.codecs.clear();
1288 parameters.codecs.push_back(kOpusCodec);
1289 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001290 EXPECT_FALSE(voe_.GetNACK(channel_num));
1291}
1292
1293// Test that we can disable NACK on receive streams.
1294TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001295 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001296 int channel_num1 = voe_.GetLastChannel();
1297 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1298 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001299 cricket::AudioSendParameters parameters;
1300 parameters.codecs.push_back(kOpusCodec);
1301 parameters.codecs[0].AddFeedbackParam(
1302 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1303 cricket::kParamValueEmpty));
1304 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001305 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1306 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1307
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001308 parameters.codecs.clear();
1309 parameters.codecs.push_back(kOpusCodec);
1310 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001311 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1312 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1313}
1314
1315// Test that NACK is enabled on a new receive stream.
1316TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001317 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001318 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 cricket::AudioSendParameters parameters;
1320 parameters.codecs.push_back(kIsacCodec);
1321 parameters.codecs.push_back(kCn16000Codec);
1322 parameters.codecs[0].AddFeedbackParam(
1323 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1324 cricket::kParamValueEmpty));
1325 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001326 EXPECT_TRUE(voe_.GetNACK(channel_num));
1327
1328 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1329 channel_num = voe_.GetLastChannel();
1330 EXPECT_TRUE(voe_.GetNACK(channel_num));
1331 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1332 channel_num = voe_.GetLastChannel();
1333 EXPECT_TRUE(voe_.GetNACK(channel_num));
1334}
1335
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001336// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001337TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001338 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001339 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001340 cricket::AudioSendParameters parameters;
1341 parameters.codecs.push_back(kOpusCodec);
1342 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001343 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1344}
1345
1346// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001347TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001348 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001349 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001350 cricket::AudioSendParameters parameters;
1351 parameters.codecs.push_back(kOpusCodec);
1352 parameters.codecs[0].bitrate = 0;
1353 parameters.codecs[0].params["useinbandfec"] = "0";
1354 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001355 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1356 webrtc::CodecInst gcodec;
1357 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1358 EXPECT_STREQ("opus", gcodec.plname);
1359 EXPECT_EQ(1, gcodec.channels);
1360 EXPECT_EQ(32000, gcodec.rate);
1361}
1362
1363// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001364TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001365 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001366 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001367 cricket::AudioSendParameters parameters;
1368 parameters.codecs.push_back(kOpusCodec);
1369 parameters.codecs[0].bitrate = 0;
1370 parameters.codecs[0].params["useinbandfec"] = "1";
1371 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001372 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1373 webrtc::CodecInst gcodec;
1374 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1375 EXPECT_STREQ("opus", gcodec.plname);
1376 EXPECT_EQ(1, gcodec.channels);
1377 EXPECT_EQ(32000, gcodec.rate);
1378}
1379
1380// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001381TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001382 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001383 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001384 cricket::AudioSendParameters parameters;
1385 parameters.codecs.push_back(kOpusCodec);
1386 parameters.codecs[0].bitrate = 0;
1387 parameters.codecs[0].params["stereo"] = "1";
1388 parameters.codecs[0].params["useinbandfec"] = "1";
1389 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001390 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1391 webrtc::CodecInst gcodec;
1392 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1393 EXPECT_STREQ("opus", gcodec.plname);
1394 EXPECT_EQ(2, gcodec.channels);
1395 EXPECT_EQ(64000, gcodec.rate);
1396}
1397
1398// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001399TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001400 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001401 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001402 cricket::AudioSendParameters parameters;
1403 parameters.codecs.push_back(kIsacCodec);
1404 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001405 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1406}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001407
1408// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1409TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001410 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001411 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001412 cricket::AudioSendParameters parameters;
1413 parameters.codecs.push_back(kIsacCodec);
1414 parameters.codecs[0].params["useinbandfec"] = "1";
1415 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001416 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1417}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001418
1419// Test that Opus FEC status can be changed.
1420TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001421 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001422 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001423 cricket::AudioSendParameters parameters;
1424 parameters.codecs.push_back(kOpusCodec);
1425 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001426 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001427 parameters.codecs[0].params["useinbandfec"] = "1";
1428 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001429 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1430}
1431
stefanba4c0e42016-02-04 04:12:24 -08001432TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001433 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001434 cricket::AudioSendParameters send_parameters;
1435 send_parameters.codecs.push_back(kOpusCodec);
1436 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1437 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1438
1439 cricket::AudioRecvParameters recv_parameters;
1440 recv_parameters.codecs.push_back(kIsacCodec);
1441 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1442 EXPECT_TRUE(
1443 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1444 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1445 EXPECT_FALSE(
1446 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1447
solenbergbc37fc82016-04-04 09:54:44 -07001448 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001449 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1450 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1451 EXPECT_TRUE(
1452 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1453}
1454
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001455// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1456TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001457 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001458 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001459 cricket::AudioSendParameters parameters;
1460 parameters.codecs.push_back(kOpusCodec);
1461 parameters.codecs[0].bitrate = 0;
1462 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1463 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001464 EXPECT_EQ(cricket::kOpusBandwidthNb,
1465 voe_.GetMaxEncodingBandwidth(channel_num));
1466 webrtc::CodecInst gcodec;
1467 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1468 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001469
1470 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001471 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1472 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001473 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1474 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001475}
1476
1477// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1478TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001479 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001480 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001481 cricket::AudioSendParameters parameters;
1482 parameters.codecs.push_back(kOpusCodec);
1483 parameters.codecs[0].bitrate = 0;
1484 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1485 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001486 EXPECT_EQ(cricket::kOpusBandwidthMb,
1487 voe_.GetMaxEncodingBandwidth(channel_num));
1488 webrtc::CodecInst gcodec;
1489 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1490 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001491
1492 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001493 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1494 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001495 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1496 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001497}
1498
1499// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1500TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001501 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001502 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001503 cricket::AudioSendParameters parameters;
1504 parameters.codecs.push_back(kOpusCodec);
1505 parameters.codecs[0].bitrate = 0;
1506 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1507 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001508 EXPECT_EQ(cricket::kOpusBandwidthWb,
1509 voe_.GetMaxEncodingBandwidth(channel_num));
1510 webrtc::CodecInst gcodec;
1511 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1512 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001513
1514 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1516 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001517 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1518 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001519}
1520
1521// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1522TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001523 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001524 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001525 cricket::AudioSendParameters parameters;
1526 parameters.codecs.push_back(kOpusCodec);
1527 parameters.codecs[0].bitrate = 0;
1528 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1529 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001530 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1531 voe_.GetMaxEncodingBandwidth(channel_num));
1532 webrtc::CodecInst gcodec;
1533 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1534 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001535
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001536 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001537 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1538 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001539 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1540 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001541}
1542
1543// Test 24000 < maxplaybackrate triggers Opus full band mode.
1544TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001545 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001546 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001547 cricket::AudioSendParameters parameters;
1548 parameters.codecs.push_back(kOpusCodec);
1549 parameters.codecs[0].bitrate = 0;
1550 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1551 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001552 EXPECT_EQ(cricket::kOpusBandwidthFb,
1553 voe_.GetMaxEncodingBandwidth(channel_num));
1554 webrtc::CodecInst gcodec;
1555 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1556 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001557
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001558 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1560 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001561 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1562 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001563}
1564
1565// Test Opus that without maxplaybackrate, default playback rate is used.
1566TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001567 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001568 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001569 cricket::AudioSendParameters parameters;
1570 parameters.codecs.push_back(kOpusCodec);
1571 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001572 EXPECT_EQ(cricket::kOpusBandwidthFb,
1573 voe_.GetMaxEncodingBandwidth(channel_num));
1574}
1575
1576// Test the with non-Opus, maxplaybackrate has no effect.
1577TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001578 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001579 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001580 cricket::AudioSendParameters parameters;
1581 parameters.codecs.push_back(kIsacCodec);
1582 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1583 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001584 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1585}
1586
1587// Test maxplaybackrate can be set on two streams.
1588TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001589 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001590 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001591 cricket::AudioSendParameters parameters;
1592 parameters.codecs.push_back(kOpusCodec);
1593 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001594 // Default bandwidth is 24000.
1595 EXPECT_EQ(cricket::kOpusBandwidthFb,
1596 voe_.GetMaxEncodingBandwidth(channel_num));
1597
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001598 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001599
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001600 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001601 EXPECT_EQ(cricket::kOpusBandwidthNb,
1602 voe_.GetMaxEncodingBandwidth(channel_num));
1603
1604 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1605 channel_num = voe_.GetLastChannel();
1606 EXPECT_EQ(cricket::kOpusBandwidthNb,
1607 voe_.GetMaxEncodingBandwidth(channel_num));
1608}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001609
Minyue Li7100dcd2015-03-27 05:05:59 +01001610// Test that with usedtx=0, Opus DTX is off.
1611TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001612 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001613 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001614 cricket::AudioSendParameters parameters;
1615 parameters.codecs.push_back(kOpusCodec);
1616 parameters.codecs[0].params["usedtx"] = "0";
1617 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001618 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1619}
1620
1621// Test that with usedtx=1, Opus DTX is on.
1622TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001623 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001624 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001625 cricket::AudioSendParameters parameters;
1626 parameters.codecs.push_back(kOpusCodec);
1627 parameters.codecs[0].params["usedtx"] = "1";
1628 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001629 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1630 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1631}
1632
1633// Test that usedtx=1 works with stereo Opus.
1634TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001635 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001636 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].params["usedtx"] = "1";
1640 parameters.codecs[0].params["stereo"] = "1";
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001642 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1643 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1644}
1645
1646// Test that usedtx=1 does not work with non Opus.
1647TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001648 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001649 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001650 cricket::AudioSendParameters parameters;
1651 parameters.codecs.push_back(kIsacCodec);
1652 parameters.codecs[0].params["usedtx"] = "1";
1653 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001654 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1655}
1656
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001657// Test that we can switch back and forth between Opus and ISAC with CN.
1658TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001659 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001661 cricket::AudioSendParameters opus_parameters;
1662 opus_parameters.codecs.push_back(kOpusCodec);
1663 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 webrtc::CodecInst gcodec;
1665 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001666 EXPECT_EQ(111, gcodec.pltype);
1667 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 cricket::AudioSendParameters isac_parameters;
1670 isac_parameters.codecs.push_back(kIsacCodec);
1671 isac_parameters.codecs.push_back(kCn16000Codec);
1672 isac_parameters.codecs.push_back(kOpusCodec);
1673 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1675 EXPECT_EQ(103, gcodec.pltype);
1676 EXPECT_STREQ("ISAC", gcodec.plname);
1677
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001678 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001680 EXPECT_EQ(111, gcodec.pltype);
1681 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682}
1683
1684// Test that we handle various ways of specifying bitrate.
1685TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001686 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001688 cricket::AudioSendParameters parameters;
1689 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1690 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001691 webrtc::CodecInst gcodec;
1692 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1693 EXPECT_EQ(103, gcodec.pltype);
1694 EXPECT_STREQ("ISAC", gcodec.plname);
1695 EXPECT_EQ(32000, gcodec.rate);
1696
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001697 parameters.codecs[0].bitrate = 0; // bitrate == default
1698 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1700 EXPECT_EQ(103, gcodec.pltype);
1701 EXPECT_STREQ("ISAC", gcodec.plname);
1702 EXPECT_EQ(-1, gcodec.rate);
1703
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001704 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1707 EXPECT_EQ(103, gcodec.pltype);
1708 EXPECT_STREQ("ISAC", gcodec.plname);
1709 EXPECT_EQ(28000, gcodec.rate);
1710
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1712 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1714 EXPECT_EQ(0, gcodec.pltype);
1715 EXPECT_STREQ("PCMU", gcodec.plname);
1716 EXPECT_EQ(64000, gcodec.rate);
1717
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001718 parameters.codecs[0].bitrate = 0; // bitrate == default
1719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1721 EXPECT_EQ(0, gcodec.pltype);
1722 EXPECT_STREQ("PCMU", gcodec.plname);
1723 EXPECT_EQ(64000, gcodec.rate);
1724
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 parameters.codecs[0] = kOpusCodec;
1726 parameters.codecs[0].bitrate = 0; // bitrate == default
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1729 EXPECT_EQ(111, gcodec.pltype);
1730 EXPECT_STREQ("opus", gcodec.plname);
1731 EXPECT_EQ(32000, gcodec.rate);
1732}
1733
Brave Yao5225dd82015-03-26 07:39:19 +08001734// Test that we could set packet size specified in kCodecParamPTime.
1735TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001736 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001737 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001738 cricket::AudioSendParameters parameters;
1739 parameters.codecs.push_back(kOpusCodec);
1740 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1741 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001742 webrtc::CodecInst gcodec;
1743 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1744 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1745
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001746 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1747 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001748 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1749 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1750
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001751 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1752 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001753 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1754 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1755
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001756 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1757 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1758 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001759 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1760 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1761
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001762 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1763 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1764 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001765 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1766 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1767}
1768
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001769// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001771 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001772 cricket::AudioSendParameters parameters;
1773 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001774}
1775
1776// Test that we can set send codecs even with telephone-event codec as the first
1777// one on the list.
1778TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001779 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001781 cricket::AudioSendParameters parameters;
1782 parameters.codecs.push_back(kTelephoneEventCodec);
1783 parameters.codecs.push_back(kIsacCodec);
1784 parameters.codecs.push_back(kPcmuCodec);
1785 parameters.codecs[0].id = 98; // DTMF
1786 parameters.codecs[1].id = 96;
1787 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788 webrtc::CodecInst gcodec;
1789 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001790 EXPECT_EQ(96, gcodec.pltype);
1791 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001792 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001793}
1794
solenberg31642aa2016-03-14 08:00:37 -07001795// Test that payload type range is limited for telephone-event codec.
1796TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001797 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001798 cricket::AudioSendParameters parameters;
1799 parameters.codecs.push_back(kTelephoneEventCodec);
1800 parameters.codecs.push_back(kIsacCodec);
1801 parameters.codecs[0].id = 0; // DTMF
1802 parameters.codecs[1].id = 96;
1803 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1804 EXPECT_TRUE(channel_->CanInsertDtmf());
1805 parameters.codecs[0].id = 128; // DTMF
1806 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1807 EXPECT_FALSE(channel_->CanInsertDtmf());
1808 parameters.codecs[0].id = 127;
1809 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1810 EXPECT_TRUE(channel_->CanInsertDtmf());
1811 parameters.codecs[0].id = -1; // DTMF
1812 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1813 EXPECT_FALSE(channel_->CanInsertDtmf());
1814}
1815
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001816// Test that we can set send codecs even with CN codec as the first
1817// one on the list.
1818TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001819 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001820 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001821 cricket::AudioSendParameters parameters;
1822 parameters.codecs.push_back(kCn16000Codec);
1823 parameters.codecs.push_back(kIsacCodec);
1824 parameters.codecs.push_back(kPcmuCodec);
1825 parameters.codecs[0].id = 98; // wideband CN
1826 parameters.codecs[1].id = 96;
1827 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001828 webrtc::CodecInst gcodec;
1829 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1830 EXPECT_EQ(96, gcodec.pltype);
1831 EXPECT_STREQ("ISAC", gcodec.plname);
1832 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833}
1834
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001835// Test that we set VAD and DTMF types correctly as caller.
1836TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001837 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001839 cricket::AudioSendParameters parameters;
1840 parameters.codecs.push_back(kIsacCodec);
1841 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 parameters.codecs.push_back(kCn16000Codec);
1844 parameters.codecs.push_back(kCn8000Codec);
1845 parameters.codecs.push_back(kTelephoneEventCodec);
1846 parameters.codecs.push_back(kRedCodec);
1847 parameters.codecs[0].id = 96;
1848 parameters.codecs[2].id = 97; // wideband CN
1849 parameters.codecs[4].id = 98; // DTMF
1850 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851 webrtc::CodecInst gcodec;
1852 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1853 EXPECT_EQ(96, gcodec.pltype);
1854 EXPECT_STREQ("ISAC", gcodec.plname);
1855 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001856 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1858 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001859 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860}
1861
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001862// Test that we set VAD and DTMF types correctly as callee.
1863TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001864 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001865 cricket::AudioSendParameters parameters;
1866 parameters.codecs.push_back(kIsacCodec);
1867 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001868 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001869 parameters.codecs.push_back(kCn16000Codec);
1870 parameters.codecs.push_back(kCn8000Codec);
1871 parameters.codecs.push_back(kTelephoneEventCodec);
1872 parameters.codecs.push_back(kRedCodec);
1873 parameters.codecs[0].id = 96;
1874 parameters.codecs[2].id = 97; // wideband CN
1875 parameters.codecs[4].id = 98; // DTMF
1876 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001877 EXPECT_TRUE(channel_->AddSendStream(
1878 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001879 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001880
1881 webrtc::CodecInst gcodec;
1882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1883 EXPECT_EQ(96, gcodec.pltype);
1884 EXPECT_STREQ("ISAC", gcodec.plname);
1885 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001886 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001887 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1888 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001889 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001890}
1891
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001892// Test that we only apply VAD if we have a CN codec that matches the
1893// send codec clockrate.
1894TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001895 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001896 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001897 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001899 parameters.codecs.push_back(kIsacCodec);
1900 parameters.codecs.push_back(kCn16000Codec);
1901 parameters.codecs[1].id = 97;
1902 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903 webrtc::CodecInst gcodec;
1904 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1905 EXPECT_STREQ("ISAC", gcodec.plname);
1906 EXPECT_TRUE(voe_.GetVAD(channel_num));
1907 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1908 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001909 parameters.codecs[0] = kPcmuCodec;
1910 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1912 EXPECT_STREQ("PCMU", gcodec.plname);
1913 EXPECT_FALSE(voe_.GetVAD(channel_num));
1914 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001915 parameters.codecs[1] = kCn8000Codec;
1916 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1918 EXPECT_STREQ("PCMU", gcodec.plname);
1919 EXPECT_TRUE(voe_.GetVAD(channel_num));
1920 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001921 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001922 parameters.codecs[0] = kIsacCodec;
1923 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1925 EXPECT_STREQ("ISAC", gcodec.plname);
1926 EXPECT_FALSE(voe_.GetVAD(channel_num));
1927}
1928
1929// Test that we perform case-insensitive matching of codec names.
1930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001931 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001932 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001933 cricket::AudioSendParameters parameters;
1934 parameters.codecs.push_back(kIsacCodec);
1935 parameters.codecs.push_back(kPcmuCodec);
1936 parameters.codecs.push_back(kCn16000Codec);
1937 parameters.codecs.push_back(kCn8000Codec);
1938 parameters.codecs.push_back(kTelephoneEventCodec);
1939 parameters.codecs.push_back(kRedCodec);
1940 parameters.codecs[0].name = "iSaC";
1941 parameters.codecs[0].id = 96;
1942 parameters.codecs[2].id = 97; // wideband CN
1943 parameters.codecs[4].id = 98; // DTMF
1944 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945 webrtc::CodecInst gcodec;
1946 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1947 EXPECT_EQ(96, gcodec.pltype);
1948 EXPECT_STREQ("ISAC", gcodec.plname);
1949 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001950 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1952 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001953 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954}
1955
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001956// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001957TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001958 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001960 cricket::AudioSendParameters parameters;
1961 parameters.codecs.push_back(kRedCodec);
1962 parameters.codecs.push_back(kIsacCodec);
1963 parameters.codecs.push_back(kPcmuCodec);
1964 parameters.codecs[0].id = 127;
1965 parameters.codecs[0].params[""] = "96/96";
1966 parameters.codecs[1].id = 96;
1967 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968 webrtc::CodecInst gcodec;
1969 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1970 EXPECT_EQ(96, gcodec.pltype);
1971 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001972 EXPECT_TRUE(voe_.GetRED(channel_num));
1973 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001974}
1975
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001976// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001977TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001978 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001979 cricket::AudioSendParameters parameters;
1980 parameters.codecs.push_back(kRedCodec);
1981 parameters.codecs.push_back(kIsacCodec);
1982 parameters.codecs.push_back(kPcmuCodec);
1983 parameters.codecs[0].id = 127;
1984 parameters.codecs[0].params[""] = "96/96";
1985 parameters.codecs[1].id = 96;
1986 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001987 EXPECT_TRUE(channel_->AddSendStream(
1988 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001989 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001990 webrtc::CodecInst gcodec;
1991 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1992 EXPECT_EQ(96, gcodec.pltype);
1993 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001994 EXPECT_TRUE(voe_.GetRED(channel_num));
1995 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001996}
1997
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001998// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001999TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07002000 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002001 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002002 cricket::AudioSendParameters parameters;
2003 parameters.codecs.push_back(kRedCodec);
2004 parameters.codecs.push_back(kIsacCodec);
2005 parameters.codecs.push_back(kPcmuCodec);
2006 parameters.codecs[0].id = 127;
2007 parameters.codecs[1].id = 96;
2008 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002009 webrtc::CodecInst gcodec;
2010 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2011 EXPECT_EQ(96, gcodec.pltype);
2012 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002013 EXPECT_TRUE(voe_.GetRED(channel_num));
2014 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015}
2016
2017// Test that we ignore RED if the parameters aren't named the way we expect.
2018TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07002019 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002020 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002021 cricket::AudioSendParameters parameters;
2022 parameters.codecs.push_back(kRedCodec);
2023 parameters.codecs.push_back(kIsacCodec);
2024 parameters.codecs.push_back(kPcmuCodec);
2025 parameters.codecs[0].id = 127;
2026 parameters.codecs[0].params["ABC"] = "96/96";
2027 parameters.codecs[1].id = 96;
2028 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029 webrtc::CodecInst gcodec;
2030 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2031 EXPECT_EQ(96, gcodec.pltype);
2032 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002033 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002034}
2035
2036// Test that we ignore RED if it uses different primary/secondary encoding.
2037TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07002038 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002039 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002040 cricket::AudioSendParameters parameters;
2041 parameters.codecs.push_back(kRedCodec);
2042 parameters.codecs.push_back(kIsacCodec);
2043 parameters.codecs.push_back(kPcmuCodec);
2044 parameters.codecs[0].id = 127;
2045 parameters.codecs[0].params[""] = "96/0";
2046 parameters.codecs[1].id = 96;
2047 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002048 webrtc::CodecInst gcodec;
2049 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2050 EXPECT_EQ(96, gcodec.pltype);
2051 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002052 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002053}
2054
2055// Test that we ignore RED if it uses more than 2 encodings.
2056TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07002057 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002058 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002059 cricket::AudioSendParameters parameters;
2060 parameters.codecs.push_back(kRedCodec);
2061 parameters.codecs.push_back(kIsacCodec);
2062 parameters.codecs.push_back(kPcmuCodec);
2063 parameters.codecs[0].id = 127;
2064 parameters.codecs[0].params[""] = "96/96/96";
2065 parameters.codecs[1].id = 96;
2066 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067 webrtc::CodecInst gcodec;
2068 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2069 EXPECT_EQ(96, gcodec.pltype);
2070 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002071 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002072}
2073
2074// Test that we ignore RED if it has bogus codec ids.
2075TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07002076 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002077 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002078 cricket::AudioSendParameters parameters;
2079 parameters.codecs.push_back(kRedCodec);
2080 parameters.codecs.push_back(kIsacCodec);
2081 parameters.codecs.push_back(kPcmuCodec);
2082 parameters.codecs[0].id = 127;
2083 parameters.codecs[0].params[""] = "ABC/ABC";
2084 parameters.codecs[1].id = 96;
2085 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086 webrtc::CodecInst gcodec;
2087 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2088 EXPECT_EQ(96, gcodec.pltype);
2089 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002090 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002091}
2092
2093// Test that we ignore RED if it refers to a codec that is not present.
2094TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07002095 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002096 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002097 cricket::AudioSendParameters parameters;
2098 parameters.codecs.push_back(kRedCodec);
2099 parameters.codecs.push_back(kIsacCodec);
2100 parameters.codecs.push_back(kPcmuCodec);
2101 parameters.codecs[0].id = 127;
2102 parameters.codecs[0].params[""] = "97/97";
2103 parameters.codecs[1].id = 96;
2104 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105 webrtc::CodecInst gcodec;
2106 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2107 EXPECT_EQ(96, gcodec.pltype);
2108 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00002109 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110}
2111
stefanba4c0e42016-02-04 04:12:24 -08002112class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2113 public:
2114 WebRtcVoiceEngineWithSendSideBweTest()
2115 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2116};
2117
2118TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2119 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002120 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002121 ASSERT_FALSE(capabilities.header_extensions.empty());
2122 for (const cricket::RtpHeaderExtension& extension :
2123 capabilities.header_extensions) {
2124 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2125 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2126 extension.id);
2127 return;
2128 }
2129 }
2130 FAIL() << "Transport sequence number extension not in header-extension list.";
2131}
2132
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002133// Test support for audio level header extension.
2134TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2135 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002136}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002137TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2138 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2139}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002140
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002141// Test support for absolute send time header extension.
2142TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2143 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2144}
2145TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2146 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147}
2148
solenberg1ac56142015-10-13 03:58:19 -07002149// Test that we can create a channel and start sending on it.
2150TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002151 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002152 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002153 channel_->SetSend(true);
2154 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2155 channel_->SetSend(false);
2156 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2157}
2158
2159// Test that a channel will send if and only if it has a source and is enabled
2160// for sending.
2161TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002162 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002163 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2164 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2165 channel_->SetSend(true);
2166 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2167 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2168 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2169 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2170 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002171}
2172
2173// Test that we can create a channel and start playing out on it.
2174TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002175 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002176 int channel_num = voe_.GetLastChannel();
2177 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2178 EXPECT_TRUE(channel_->SetPlayout(true));
2179 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180 EXPECT_TRUE(channel_->SetPlayout(false));
2181 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2182}
2183
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002184// Test that we can add and remove send streams.
2185TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2186 SetupForMultiSendStream();
2187
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002188 // Set the global state for sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002189 channel_->SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002190
solenbergc96df772015-10-21 13:01:53 -07002191 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002192 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002193 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002194 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002195 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002196 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002197 }
tfarina5237aaf2015-11-10 23:44:30 -08002198 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002199
solenbergc96df772015-10-21 13:01:53 -07002200 // Delete the send streams.
2201 for (uint32_t ssrc : kSsrcs4) {
2202 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002203 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002204 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002205 }
solenbergc96df772015-10-21 13:01:53 -07002206 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002207}
2208
2209// Test SetSendCodecs correctly configure the codecs in all send streams.
2210TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2211 SetupForMultiSendStream();
2212
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002214 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002215 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002216 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002217 }
2218
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002219 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002220 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002221 parameters.codecs.push_back(kIsacCodec);
2222 parameters.codecs.push_back(kCn16000Codec);
2223 parameters.codecs[1].id = 97;
2224 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002225
2226 // Verify ISAC and VAD are corrected configured on all send channels.
2227 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002228 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002229 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002230 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2231 EXPECT_STREQ("ISAC", gcodec.plname);
2232 EXPECT_TRUE(voe_.GetVAD(channel_num));
2233 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2234 }
2235
2236 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002237 parameters.codecs[0] = kPcmuCodec;
2238 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002239 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002240 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002241 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2242 EXPECT_STREQ("PCMU", gcodec.plname);
2243 EXPECT_FALSE(voe_.GetVAD(channel_num));
2244 }
2245}
2246
2247// Test we can SetSend on all send streams correctly.
2248TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2249 SetupForMultiSendStream();
2250
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002251 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002252 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002253 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002254 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002255 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2256 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002257 }
2258
2259 // Set the global state for starting sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002260 channel_->SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002261 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002262 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002263 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264 }
2265
2266 // Set the global state for stopping sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002267 channel_->SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002268 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002269 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002270 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271 }
2272}
2273
2274// Test we can set the correct statistics on all send streams.
2275TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2276 SetupForMultiSendStream();
2277
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002278 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002279 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002280 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002281 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282 }
solenberg85a04962015-10-27 03:35:21 -07002283 SetAudioSendStreamStats();
2284
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002285 // Create a receive stream to check that none of the send streams end up in
2286 // the receive stream stats.
2287 EXPECT_TRUE(channel_->AddRecvStream(
2288 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002289 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002290 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2291 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002292
solenberg85a04962015-10-27 03:35:21 -07002293 // Check stats for the added streams.
2294 {
2295 cricket::VoiceMediaInfo info;
2296 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002297
solenberg85a04962015-10-27 03:35:21 -07002298 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002299 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002300 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002301 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002302 }
2303
2304 // We have added one receive stream. We should see empty stats.
2305 EXPECT_EQ(info.receivers.size(), 1u);
2306 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002307 }
solenberg1ac56142015-10-13 03:58:19 -07002308
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002309 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002310 {
2311 cricket::VoiceMediaInfo info;
2312 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2313 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002314 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002315 EXPECT_EQ(0u, info.receivers.size());
2316 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002317
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002318 // Deliver a new packet - a default receive stream should be created and we
2319 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002320 {
2321 cricket::VoiceMediaInfo info;
2322 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2323 SetAudioReceiveStreamStats();
2324 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002325 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002326 EXPECT_EQ(1u, info.receivers.size());
2327 VerifyVoiceReceiverInfo(info.receivers[0]);
2328 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002329}
2330
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002331// Test that we can add and remove receive streams, and do proper send/playout.
2332// We can receive on multiple streams while sending one stream.
2333TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002334 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335 int channel_num1 = voe_.GetLastChannel();
2336
solenberg1ac56142015-10-13 03:58:19 -07002337 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002338 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002340 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341
solenberg1ac56142015-10-13 03:58:19 -07002342 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002343 EXPECT_TRUE(
2344 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002345 int channel_num2 = voe_.GetLastChannel();
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002346 channel_->SetSend(true);
2347 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002348
solenberg1ac56142015-10-13 03:58:19 -07002349 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2351 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2352
2353 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002354 EXPECT_TRUE(
2355 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356 int channel_num3 = voe_.GetLastChannel();
2357 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2358 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2359 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360
2361 // Stop sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002362 channel_->SetSend(false);
2363 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364
2365 // Stop playout.
2366 EXPECT_TRUE(channel_->SetPlayout(false));
2367 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2368 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2369 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2370
solenberg1ac56142015-10-13 03:58:19 -07002371 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372 EXPECT_TRUE(channel_->SetPlayout(true));
2373 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2374 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2375 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2376
solenberg1ac56142015-10-13 03:58:19 -07002377 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2379 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002380 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381}
2382
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002384// and start sending on it.
2385TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002386 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002387 cricket::AudioOptions options_adjust_agc;
2388 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389 webrtc::AgcConfig agc_config;
2390 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2391 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002392 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002393 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002394 channel_->SetSend(true);
2395 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2397 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002398 channel_->SetSend(false);
2399 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002401}
2402
wu@webrtc.org97077a32013-10-25 21:18:33 +00002403TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002404 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002405 webrtc::AgcConfig agc_config;
2406 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2407 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002408 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2409 send_parameters_.options.tx_agc_digital_compression_gain =
2410 rtc::Optional<uint16_t>(9);
2411 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2412 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2413 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002414 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2415 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2416 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2417 EXPECT_TRUE(agc_config.limiterEnable);
2418
2419 // Check interaction with adjust_agc_delta. Both should be respected, for
2420 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002421 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2422 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002423 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2424 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2425}
2426
wu@webrtc.org97077a32013-10-25 21:18:33 +00002427TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002428 EXPECT_TRUE(SetupSendStream());
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 unsigned int recording_sample_rate, playout_sample_rate;
2435 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2436 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2437 EXPECT_EQ(48000u, recording_sample_rate);
2438 EXPECT_EQ(44100u, playout_sample_rate);
2439}
2440
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002442// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002443TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002444 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002445 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446}
2447
2448TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2449 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002450 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002451 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002452 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002453 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002454 EXPECT_TRUE(channel_->AddRecvStream(
2455 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002456 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2457 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458
solenberg85a04962015-10-27 03:35:21 -07002459 // Check stats for the added streams.
2460 {
2461 cricket::VoiceMediaInfo info;
2462 EXPECT_EQ(true, channel_->GetStats(&info));
2463
2464 // We have added one send stream. We should see the stats we've set.
2465 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002466 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002467 // We have added one receive stream. We should see empty stats.
2468 EXPECT_EQ(info.receivers.size(), 1u);
2469 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2470 }
solenberg1ac56142015-10-13 03:58:19 -07002471
solenberg566ef242015-11-06 15:34:49 -08002472 // Start sending - this affects some reported stats.
2473 {
2474 cricket::VoiceMediaInfo info;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002475 channel_->SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002476 EXPECT_EQ(true, channel_->GetStats(&info));
2477 VerifyVoiceSenderInfo(info.senders[0], true);
2478 }
2479
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002480 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002481 {
2482 cricket::VoiceMediaInfo info;
2483 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2484 EXPECT_EQ(true, channel_->GetStats(&info));
2485 EXPECT_EQ(1u, info.senders.size());
2486 EXPECT_EQ(0u, info.receivers.size());
2487 }
solenberg1ac56142015-10-13 03:58:19 -07002488
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002489 // Deliver a new packet - a default receive stream should be created and we
2490 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002491 {
2492 cricket::VoiceMediaInfo info;
2493 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2494 SetAudioReceiveStreamStats();
2495 EXPECT_EQ(true, channel_->GetStats(&info));
2496 EXPECT_EQ(1u, info.senders.size());
2497 EXPECT_EQ(1u, info.receivers.size());
2498 VerifyVoiceReceiverInfo(info.receivers[0]);
2499 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500}
2501
2502// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002503// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002505 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002506 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002507 EXPECT_TRUE(channel_->AddRecvStream(
2508 cricket::StreamParams::CreateLegacy(kSsrc2)));
2509 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510}
2511
2512// Test that the local SSRC is the same on sending and receiving channels if the
2513// receive channel is created before the send channel.
2514TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002515 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2517 int receive_channel_num = voe_.GetLastChannel();
2518 EXPECT_TRUE(channel_->AddSendStream(
2519 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520
solenberg3a941542015-11-16 07:34:50 -08002521 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002522 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002523}
2524
2525// Test that we can properly receive packets.
2526TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002527 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002528 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002530 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002531 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532}
2533
2534// Test that we can properly receive packets on multiple streams.
2535TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002536 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2538 int channel_num1 = voe_.GetLastChannel();
2539 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2540 int channel_num2 = voe_.GetLastChannel();
2541 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2542 int channel_num3 = voe_.GetLastChannel();
2543 // Create packets with the right SSRCs.
2544 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002545 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002547 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 }
2549 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2550 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2551 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002552
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002553 DeliverPacket(packets[0], sizeof(packets[0]));
2554 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2555 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2556 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002557
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002558 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002559 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2561 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002562
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002563 DeliverPacket(packets[2], sizeof(packets[2]));
2564 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002565 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002567
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002568 DeliverPacket(packets[3], sizeof(packets[3]));
2569 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2570 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002571 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2572
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2574 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2575 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2576}
2577
solenberg7e63ef02015-11-20 00:19:43 -08002578// Test that receiving on an unsignalled stream works (default channel will be
2579// created).
2580TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002581 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002582 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2583 int channel_num = voe_.GetLastChannel();
2584 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2585}
2586
2587// Test that receiving on an unsignalled stream works (default channel will be
2588// created), and that packets will be forwarded to the default channel
2589// regardless of their SSRCs.
2590TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002591 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002592 char packet[sizeof(kPcmuFrame)];
2593 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2594
2595 // Note that the first unknown SSRC cannot be 0, because we only support
2596 // creating receive streams for SSRC!=0.
2597 DeliverPacket(packet, sizeof(packet));
2598 int channel_num = voe_.GetLastChannel();
2599 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2600 // Once we have the default channel, SSRC==0 will be ok.
2601 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2602 rtc::SetBE32(&packet[8], ssrc);
2603 DeliverPacket(packet, sizeof(packet));
2604 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2605 }
2606}
2607
2608// Test that a default channel is created even after a signalled stream has been
2609// added, and that this stream will get any packets for unknown SSRCs.
2610TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002611 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002612 char packet[sizeof(kPcmuFrame)];
2613 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2614
2615 // Add a known stream, send packet and verify we got it.
2616 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2617 int signalled_channel_num = voe_.GetLastChannel();
2618 DeliverPacket(packet, sizeof(packet));
2619 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2620
2621 // Note that the first unknown SSRC cannot be 0, because we only support
2622 // creating receive streams for SSRC!=0.
2623 rtc::SetBE32(&packet[8], 7011);
2624 DeliverPacket(packet, sizeof(packet));
2625 int channel_num = voe_.GetLastChannel();
2626 EXPECT_NE(channel_num, signalled_channel_num);
2627 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2628 // Once we have the default channel, SSRC==0 will be ok.
2629 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2630 rtc::SetBE32(&packet[8], ssrc);
2631 DeliverPacket(packet, sizeof(packet));
2632 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2633 }
2634}
2635
solenberg0a617e22015-10-20 15:49:38 -07002636// Test that we properly handle failures to add a receive stream.
2637TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002638 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002639 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002641}
2642
solenberg0a617e22015-10-20 15:49:38 -07002643// Test that we properly handle failures to add a send stream.
2644TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002645 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002646 voe_.set_fail_create_channel(true);
2647 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2648}
2649
solenberg1ac56142015-10-13 03:58:19 -07002650// Test that AddRecvStream creates new stream.
2651TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002652 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002653 int channel_num = voe_.GetLastChannel();
2654 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002655 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656}
2657
2658// Test that after adding a recv stream, we do not decode more codecs than
2659// those previously passed into SetRecvCodecs.
2660TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002661 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002662 cricket::AudioRecvParameters parameters;
2663 parameters.codecs.push_back(kIsacCodec);
2664 parameters.codecs.push_back(kPcmuCodec);
2665 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002666 EXPECT_TRUE(channel_->AddRecvStream(
2667 cricket::StreamParams::CreateLegacy(kSsrc1)));
2668 int channel_num2 = voe_.GetLastChannel();
2669 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002670 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002671 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 gcodec.channels = 2;
2673 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2674}
2675
2676// Test that we properly clean up any streams that were added, even if
2677// not explicitly removed.
2678TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002679 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002680 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2682 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2683 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2684 delete channel_;
2685 channel_ = NULL;
2686 EXPECT_EQ(0, voe_.GetNumChannels());
2687}
2688
wu@webrtc.org78187522013-10-07 23:32:02 +00002689TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002690 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002691 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2692}
2693
2694TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002695 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002696 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002697 // Manually delete channel to simulate a failure.
2698 int channel = voe_.GetLastChannel();
2699 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2700 // Add recv stream 2 should work.
2701 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002702 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002703 EXPECT_NE(channel, new_channel);
2704 // The last created channel is deleted too.
2705 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002706}
2707
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002708// Test the InsertDtmf on default send stream as caller.
2709TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2710 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002711}
2712
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002713// Test the InsertDtmf on default send stream as callee
2714TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2715 TestInsertDtmf(0, false);
2716}
2717
2718// Test the InsertDtmf on specified send stream as caller.
2719TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2720 TestInsertDtmf(kSsrc1, true);
2721}
2722
2723// Test the InsertDtmf on specified send stream as callee.
2724TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2725 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002726}
2727
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002729 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002730 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002731 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2733 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2734 EXPECT_TRUE(channel_->SetPlayout(true));
2735 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2736 EXPECT_TRUE(channel_->SetPlayout(false));
2737 EXPECT_FALSE(channel_->SetPlayout(true));
2738}
2739
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002741 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742
2743 bool ec_enabled;
2744 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745 webrtc::AecmModes aecm_mode;
2746 bool cng_enabled;
2747 bool agc_enabled;
2748 webrtc::AgcModes agc_mode;
2749 webrtc::AgcConfig agc_config;
2750 bool ns_enabled;
2751 webrtc::NsModes ns_mode;
2752 bool highpass_filter_enabled;
2753 bool stereo_swapping_enabled;
2754 bool typing_detection_enabled;
2755 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756 voe_.GetAecmMode(aecm_mode, cng_enabled);
2757 voe_.GetAgcStatus(agc_enabled, agc_mode);
2758 voe_.GetAgcConfig(agc_config);
2759 voe_.GetNsStatus(ns_enabled, ns_mode);
2760 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2761 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2762 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2763 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002764 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765 EXPECT_FALSE(cng_enabled);
2766 EXPECT_TRUE(agc_enabled);
2767 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2768 EXPECT_TRUE(ns_enabled);
2769 EXPECT_TRUE(highpass_filter_enabled);
2770 EXPECT_FALSE(stereo_swapping_enabled);
2771 EXPECT_TRUE(typing_detection_enabled);
2772 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2773 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002774 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2775 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002776
solenberg246b8172015-12-08 09:50:23 -08002777 // Nothing set in AudioOptions, so everything should be as default.
2778 send_parameters_.options = cricket::AudioOptions();
2779 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002781 voe_.GetAecmMode(aecm_mode, cng_enabled);
2782 voe_.GetAgcStatus(agc_enabled, agc_mode);
2783 voe_.GetAgcConfig(agc_config);
2784 voe_.GetNsStatus(ns_enabled, ns_mode);
2785 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2786 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2787 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2788 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002789 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002790 EXPECT_FALSE(cng_enabled);
2791 EXPECT_TRUE(agc_enabled);
2792 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2793 EXPECT_TRUE(ns_enabled);
2794 EXPECT_TRUE(highpass_filter_enabled);
2795 EXPECT_FALSE(stereo_swapping_enabled);
2796 EXPECT_TRUE(typing_detection_enabled);
2797 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2798 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002799 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2800 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002801
2802 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002803 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2804 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002805 voe_.GetEcStatus(ec_enabled, ec_mode);
2806 EXPECT_FALSE(ec_enabled);
2807
2808 // Turn echo cancellation back on, with settings, and make sure
2809 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002810 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2811 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002812 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002813 voe_.GetAecmMode(aecm_mode, cng_enabled);
2814 voe_.GetAgcStatus(agc_enabled, agc_mode);
2815 voe_.GetAgcConfig(agc_config);
2816 voe_.GetNsStatus(ns_enabled, ns_mode);
2817 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2818 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2819 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2820 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002821 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822 EXPECT_TRUE(agc_enabled);
2823 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2824 EXPECT_TRUE(ns_enabled);
2825 EXPECT_TRUE(highpass_filter_enabled);
2826 EXPECT_FALSE(stereo_swapping_enabled);
2827 EXPECT_TRUE(typing_detection_enabled);
2828 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2829 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2830
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002831 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2832 // control.
solenberg246b8172015-12-08 09:50:23 -08002833 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2834 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002835 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002836 voe_.GetAecmMode(aecm_mode, cng_enabled);
2837 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002838 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002839 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2840
2841 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002842 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2843 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2844 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2845 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002846 voe_.GetEcStatus(ec_enabled, ec_mode);
2847 EXPECT_FALSE(ec_enabled);
2848 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002849 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2850 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002851 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002852 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002853 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002854 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2855
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002857 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2858 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002859 voe_.GetAgcStatus(agc_enabled, agc_mode);
2860 EXPECT_FALSE(agc_enabled);
2861
2862 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002863 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2864 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2865 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002866 voe_.GetAgcStatus(agc_enabled, agc_mode);
2867 EXPECT_TRUE(agc_enabled);
2868 voe_.GetAgcConfig(agc_config);
2869 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2870
2871 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002872 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2873 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2874 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2875 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2876 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002877 voe_.GetNsStatus(ns_enabled, ns_mode);
2878 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2879 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2880 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2881 EXPECT_FALSE(ns_enabled);
2882 EXPECT_FALSE(highpass_filter_enabled);
2883 EXPECT_FALSE(typing_detection_enabled);
2884 EXPECT_TRUE(stereo_swapping_enabled);
2885
solenberg1ac56142015-10-13 03:58:19 -07002886 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002887 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002888 voe_.GetEcStatus(ec_enabled, ec_mode);
2889 voe_.GetNsStatus(ns_enabled, ns_mode);
2890 EXPECT_TRUE(ec_enabled);
2891 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2892 EXPECT_FALSE(ns_enabled);
2893 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2894}
2895
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002896TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002897 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898
2899 bool ec_enabled;
2900 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002901 bool agc_enabled;
2902 webrtc::AgcModes agc_mode;
2903 bool ns_enabled;
2904 webrtc::NsModes ns_mode;
2905 bool highpass_filter_enabled;
2906 bool stereo_swapping_enabled;
2907 bool typing_detection_enabled;
2908
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002910 voe_.GetAgcStatus(agc_enabled, agc_mode);
2911 voe_.GetNsStatus(ns_enabled, ns_mode);
2912 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2913 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2914 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2915 EXPECT_TRUE(ec_enabled);
2916 EXPECT_TRUE(agc_enabled);
2917 EXPECT_TRUE(ns_enabled);
2918 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002919 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002920 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002921}
2922
2923TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2924 webrtc::AgcConfig set_config = {0};
2925 set_config.targetLeveldBOv = 3;
2926 set_config.digitalCompressionGaindB = 9;
2927 set_config.limiterEnable = true;
2928 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929
2930 webrtc::AgcConfig config = {0};
2931 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2932 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2933 EXPECT_EQ(set_config.digitalCompressionGaindB,
2934 config.digitalCompressionGaindB);
2935 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2936}
2937
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002938TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002939 EXPECT_TRUE(SetupSendStream());
kwiberg686a8ef2016-02-26 03:00:35 -08002940 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002941 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002942 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002943 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002944 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002945 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946
2947 // Have to add a stream to make SetSend work.
2948 cricket::StreamParams stream1;
2949 stream1.ssrcs.push_back(1);
2950 channel1->AddSendStream(stream1);
2951 cricket::StreamParams stream2;
2952 stream2.ssrcs.push_back(2);
2953 channel2->AddSendStream(stream2);
2954
2955 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002956 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002957 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2958 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2959 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002960 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2961 EXPECT_EQ(parameters_options_all.options, channel1->options());
2962 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2963 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002964
2965 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002966 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002967 parameters_options_no_ns.options.noise_suppression =
2968 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002969 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2970 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002971 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2972 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2973 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002974 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002975
2976 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002977 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002978 parameters_options_no_agc.options.auto_gain_control =
2979 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002980 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002981 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2982 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2983 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002984 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002985
solenberg246b8172015-12-08 09:50:23 -08002986 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002987 bool ec_enabled;
2988 webrtc::EcModes ec_mode;
2989 bool agc_enabled;
2990 webrtc::AgcModes agc_mode;
2991 bool ns_enabled;
2992 webrtc::NsModes ns_mode;
2993 voe_.GetEcStatus(ec_enabled, ec_mode);
2994 voe_.GetAgcStatus(agc_enabled, agc_mode);
2995 voe_.GetNsStatus(ns_enabled, ns_mode);
2996 EXPECT_TRUE(ec_enabled);
2997 EXPECT_TRUE(agc_enabled);
2998 EXPECT_TRUE(ns_enabled);
2999
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003000 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003001 voe_.GetEcStatus(ec_enabled, ec_mode);
3002 voe_.GetAgcStatus(agc_enabled, agc_mode);
3003 voe_.GetNsStatus(ns_enabled, ns_mode);
3004 EXPECT_TRUE(ec_enabled);
3005 EXPECT_TRUE(agc_enabled);
3006 EXPECT_FALSE(ns_enabled);
3007
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003008 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003009 voe_.GetEcStatus(ec_enabled, ec_mode);
3010 voe_.GetAgcStatus(agc_enabled, agc_mode);
3011 voe_.GetNsStatus(ns_enabled, ns_mode);
3012 EXPECT_TRUE(ec_enabled);
3013 EXPECT_FALSE(agc_enabled);
3014 EXPECT_TRUE(ns_enabled);
3015
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003016 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003017 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003018 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3019 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003020 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003021 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003022 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003023 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003024 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003025 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003026 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3027 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3028 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003029 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003030 voe_.GetEcStatus(ec_enabled, ec_mode);
3031 voe_.GetAgcStatus(agc_enabled, agc_mode);
3032 voe_.GetNsStatus(ns_enabled, ns_mode);
3033 EXPECT_TRUE(ec_enabled);
3034 EXPECT_FALSE(agc_enabled);
3035 EXPECT_FALSE(ns_enabled);
3036}
3037
wu@webrtc.orgde305012013-10-31 15:40:38 +00003038// This test verifies DSCP settings are properly applied on voice media channel.
3039TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003040 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003041 cricket::FakeNetworkInterface network_interface;
3042 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003043 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003044
solenbergbc37fc82016-04-04 09:54:44 -07003045 channel.reset(
3046 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003047 channel->SetInterface(&network_interface);
3048 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3049 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3050
3051 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003052 channel.reset(
3053 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003054 channel->SetInterface(&network_interface);
3055 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3056
3057 // Verify that setting the option to false resets the
3058 // DiffServCodePoint.
3059 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003060 channel.reset(
3061 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003062 channel->SetInterface(&network_interface);
3063 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3064 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3065
3066 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003067}
3068
solenberg1ac56142015-10-13 03:58:19 -07003069TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003070 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003071 cricket::WebRtcVoiceMediaChannel* media_channel =
3072 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003073 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
3074 EXPECT_TRUE(channel_->AddRecvStream(
3075 cricket::StreamParams::CreateLegacy(kSsrc1)));
3076 int channel_id = voe_.GetLastChannel();
3077 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3078 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
3079 EXPECT_TRUE(channel_->AddRecvStream(
3080 cricket::StreamParams::CreateLegacy(kSsrc2)));
3081 int channel_id2 = voe_.GetLastChannel();
3082 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003083}
3084
solenberg1ac56142015-10-13 03:58:19 -07003085TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003086 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003087 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003088 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3089 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3090 EXPECT_TRUE(channel_->AddSendStream(
3091 cricket::StreamParams::CreateLegacy(kSsrc1)));
3092 int channel_id = voe_.GetLastChannel();
3093 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3094 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3095 EXPECT_TRUE(channel_->AddSendStream(
3096 cricket::StreamParams::CreateLegacy(kSsrc2)));
3097 int channel_id2 = voe_.GetLastChannel();
3098 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003099}
3100
solenberg4bac9c52015-10-09 02:32:53 -07003101TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003102 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003103 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003104 cricket::StreamParams stream;
3105 stream.ssrcs.push_back(kSsrc2);
3106 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003107 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003108 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003109 float scale = 0;
3110 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3111 EXPECT_DOUBLE_EQ(3, scale);
3112}
3113
3114TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003115 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003116 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3117 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3118 int channel_id = voe_.GetLastChannel();
3119 float scale = 0;
3120 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3121 EXPECT_DOUBLE_EQ(2, scale);
3122 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003123 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003124 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003125}
3126
pbos8fc7fa72015-07-15 08:02:58 -07003127TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003128 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003129 const std::string kSyncLabel = "AvSyncLabel";
3130
solenbergff976312016-03-30 23:28:51 -07003131 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003132 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3133 sp.sync_label = kSyncLabel;
3134 // Creating two channels to make sure that sync label is set properly for both
3135 // the default voice channel and following ones.
3136 EXPECT_TRUE(channel_->AddRecvStream(sp));
3137 sp.ssrcs[0] += 1;
3138 EXPECT_TRUE(channel_->AddRecvStream(sp));
3139
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003140 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003141 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003142 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003143 << "SyncGroup should be set based on sync_label";
3144 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003145 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003146 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003147}
3148
solenberg3a941542015-11-16 07:34:50 -08003149// TODO(solenberg): Remove, once recv streams are configured through Call.
3150// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003151TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003152 // Test that setting the header extensions results in the expected state
3153 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003154 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003155 ssrcs.push_back(223);
3156 ssrcs.push_back(224);
3157
solenbergff976312016-03-30 23:28:51 -07003158 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003159 cricket::WebRtcVoiceMediaChannel* media_channel =
3160 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003161 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003162 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003163 EXPECT_TRUE(media_channel->AddRecvStream(
3164 cricket::StreamParams::CreateLegacy(ssrc)));
3165 }
3166
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003167 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003168 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003169 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003170 EXPECT_NE(nullptr, s);
3171 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3172 }
3173
3174 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003175 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003176 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003177 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003178 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003179 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003180 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003181 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003182 EXPECT_NE(nullptr, s);
3183 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003184 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3185 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003186 for (const auto& s_ext : s_exts) {
3187 if (e_ext.id == s_ext.id) {
3188 EXPECT_EQ(e_ext.uri, s_ext.name);
3189 }
3190 }
3191 }
3192 }
3193
3194 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003195 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003196 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003197 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003198 EXPECT_NE(nullptr, s);
3199 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3200 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003201}
3202
3203TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3204 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003205 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003206 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003207 static const unsigned char kRtcp[] = {
3208 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3209 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3212 };
jbaucheec21bd2016-03-20 06:15:43 -07003213 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003214
solenbergff976312016-03-30 23:28:51 -07003215 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003216 cricket::WebRtcVoiceMediaChannel* media_channel =
3217 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003218 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003219 EXPECT_TRUE(media_channel->AddRecvStream(
3220 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3221
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003222 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003223 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003224 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003225 EXPECT_EQ(0, s->received_packets());
3226 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3227 EXPECT_EQ(1, s->received_packets());
3228 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3229 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003230}
Minyue2013aec2015-05-13 14:14:42 +02003231
solenberg0a617e22015-10-20 15:49:38 -07003232// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003233// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003234TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003235 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003236 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003237 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003238 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3239 int recv_ch = voe_.GetLastChannel();
3240 EXPECT_NE(recv_ch, default_channel);
3241 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3242 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3243 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003244 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3245 recv_ch = voe_.GetLastChannel();
3246 EXPECT_NE(recv_ch, default_channel);
3247 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003248}
3249
3250TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003251 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003252 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003253
3254 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3255 int recv_ch = voe_.GetLastChannel();
3256
3257 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3258 int send_ch = voe_.GetLastChannel();
3259
3260 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3261 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3262 // channel of |recv_ch|.This is not a common case, since, normally, only the
3263 // default channel can be associated. However, the default is not deletable.
3264 // So we force the |recv_ch| to associate with a non-default channel.
3265 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3266 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3267
3268 EXPECT_TRUE(channel_->RemoveSendStream(2));
3269 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3270}
stefan658910c2015-09-03 05:48:32 -07003271
deadbeef884f5852016-01-15 09:20:04 -08003272TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003273 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003274 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3275 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003276
3277 // Setting the sink before a recv stream exists should do nothing.
3278 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3279 EXPECT_TRUE(
3280 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3281 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3282
3283 // Now try actually setting the sink.
3284 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3285 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3286
3287 // Now try resetting it.
3288 channel_->SetRawAudioSink(kSsrc1, nullptr);
3289 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3290}
3291
3292TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003293 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003294 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3295 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003296
3297 // Should be able to set a default sink even when no stream exists.
3298 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3299
3300 // Create default channel and ensure it's assigned the default sink.
3301 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3302 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3303
3304 // Try resetting the default sink.
3305 channel_->SetRawAudioSink(0, nullptr);
3306 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3307
3308 // Try setting the default sink while the default stream exists.
3309 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3310 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3311
3312 // If we remove and add a default stream, it should get the same sink.
3313 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3314 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3315 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3316}
3317
skvlad7a43d252016-03-22 15:32:27 -07003318// Test that, just like the video channel, the voice channel communicates the
3319// network state to the call.
3320TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003321 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003322
3323 EXPECT_EQ(webrtc::kNetworkUp,
3324 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3325 EXPECT_EQ(webrtc::kNetworkUp,
3326 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3327
3328 channel_->OnReadyToSend(false);
3329 EXPECT_EQ(webrtc::kNetworkDown,
3330 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3331 EXPECT_EQ(webrtc::kNetworkUp,
3332 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3333
3334 channel_->OnReadyToSend(true);
3335 EXPECT_EQ(webrtc::kNetworkUp,
3336 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3337 EXPECT_EQ(webrtc::kNetworkUp,
3338 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3339}
3340
stefan658910c2015-09-03 05:48:32 -07003341// Tests that the library initializes and shuts down properly.
3342TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003343 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003344 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003345 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003346 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3347 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003348 EXPECT_TRUE(channel != nullptr);
3349 delete channel;
solenbergff976312016-03-30 23:28:51 -07003350}
stefan658910c2015-09-03 05:48:32 -07003351
solenbergff976312016-03-30 23:28:51 -07003352// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003353TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3354 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3355 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3356 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003357 {
3358 cricket::WebRtcVoiceEngine engine(&adm);
3359 std::unique_ptr<webrtc::Call> call(
3360 webrtc::Call::Create(webrtc::Call::Config()));
3361 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3362 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3363 EXPECT_TRUE(channel != nullptr);
3364 delete channel;
3365 }
stefan658910c2015-09-03 05:48:32 -07003366}
3367
3368// Tests that the library is configured with the codecs we want.
3369TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003370 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003371 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3372 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3373 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3374 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3375 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3376 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003377 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003378 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3379 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3380 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3381 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3382 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3383 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3384 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3385 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3386 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3387 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3388 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3389 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3390 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3391 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3392 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3393 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3394 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3395 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3396 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3397 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003398 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003399 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3400 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3401 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3402 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3403 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3404 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3405 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3406 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003407 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003408 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3409 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003410 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003411 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3412 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3413 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3414 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3415 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3416 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3417 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3418 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3419 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3420 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3421
stefan658910c2015-09-03 05:48:32 -07003422 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003423 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003424 for (std::vector<cricket::AudioCodec>::const_iterator it =
3425 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3426 if (it->name == "CN" && it->clockrate == 16000) {
3427 EXPECT_EQ(105, it->id);
3428 } else if (it->name == "CN" && it->clockrate == 32000) {
3429 EXPECT_EQ(106, it->id);
3430 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3431 EXPECT_EQ(103, it->id);
3432 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3433 EXPECT_EQ(104, it->id);
3434 } else if (it->name == "G722" && it->clockrate == 8000) {
3435 EXPECT_EQ(9, it->id);
3436 } else if (it->name == "telephone-event") {
3437 EXPECT_EQ(126, it->id);
3438 } else if (it->name == "red") {
3439 EXPECT_EQ(127, it->id);
3440 } else if (it->name == "opus") {
3441 EXPECT_EQ(111, it->id);
3442 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3443 EXPECT_EQ("10", it->params.find("minptime")->second);
3444 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3445 EXPECT_EQ("60", it->params.find("maxptime")->second);
3446 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3447 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3448 }
3449 }
stefan658910c2015-09-03 05:48:32 -07003450}
3451
3452// Tests that VoE supports at least 32 channels
3453TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003454 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003455 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003456 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003457
3458 cricket::VoiceMediaChannel* channels[32];
3459 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003460 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003461 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3462 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003463 if (!channel)
3464 break;
stefan658910c2015-09-03 05:48:32 -07003465 channels[num_channels++] = channel;
3466 }
3467
tfarina5237aaf2015-11-10 23:44:30 -08003468 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003469 EXPECT_EQ(expected, num_channels);
3470
3471 while (num_channels > 0) {
3472 delete channels[--num_channels];
3473 }
stefan658910c2015-09-03 05:48:32 -07003474}
3475
3476// Test that we set our preferred codecs properly.
3477TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003478 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003479 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003480 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003481 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3482 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003483 cricket::AudioRecvParameters parameters;
3484 parameters.codecs = engine.codecs();
3485 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003486}