blob: ec7a168f65ad4c94c4c43c63c1304458a5503e3f [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakenetworkinterface.h"
22#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080023#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
ossu29b1a8d2016-06-13 07:34:51 -070027#include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
28#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h"
solenbergbc37fc82016-04-04 09:54:44 -070029#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000030
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
deadbeef67cf2c12016-04-13 10:07:16 -070036const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
deadbeef67cf2c12016-04-13 10:07:16 -070041const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
42const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
43const cricket::AudioCodec kTelephoneEventCodec(106,
44 "telephone-event",
45 8000,
46 0,
47 1);
solenberg85a04962015-10-27 03:35:21 -070048const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080049const uint32_t kSsrc2 = 2;
50const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070051const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052
solenberg971cab02016-06-14 10:02:41 -070053constexpr int kRtpHistoryMs = 5000;
54
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055class FakeVoEWrapper : public cricket::VoEWrapper {
56 public:
57 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
58 : cricket::VoEWrapper(engine, // processing
59 engine, // base
60 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 engine) { // volume
63 }
64};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020065} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066
solenbergff976312016-03-30 23:28:51 -070067// Tests that our stub library "works".
68TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070069 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
70 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
71 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070072 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
73 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
74 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070075 cricket::FakeWebRtcVoiceEngine voe;
76 EXPECT_FALSE(voe.IsInited());
77 {
ossu95eb1ba2016-07-13 06:05:27 -070078 cricket::WebRtcVoiceEngine engine(
79 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(),
80 new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070081 EXPECT_TRUE(voe.IsInited());
82 }
83 EXPECT_FALSE(voe.IsInited());
84}
85
deadbeef884f5852016-01-15 09:20:04 -080086class FakeAudioSink : public webrtc::AudioSinkInterface {
87 public:
88 void OnData(const Data& audio) override {}
89};
90
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080091class FakeAudioSource : public cricket::AudioSource {
92 void SetSink(Sink* sink) override {}
93};
94
henrike@webrtc.org28e20752013-07-10 00:45:36 +000095class WebRtcVoiceEngineTestFake : public testing::Test {
96 public:
stefanba4c0e42016-02-04 04:12:24 -080097 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
98
99 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -0700100 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
ossu95eb1ba2016-07-13 06:05:27 -0700101 auto factory = webrtc::MockAudioDecoderFactory::CreateUnusedFactory();
solenbergbc37fc82016-04-04 09:54:44 -0700102 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
103 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700104 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
105 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
106 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
ossu95eb1ba2016-07-13 06:05:27 -0700107 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory,
solenbergbc37fc82016-04-04 09:54:44 -0700108 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200109 send_parameters_.codecs.push_back(kPcmuCodec);
110 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111 }
solenberg8189b022016-06-14 12:13:00 -0700112
solenbergff976312016-03-30 23:28:51 -0700113 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700114 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
115 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200116 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000117 }
solenberg8189b022016-06-14 12:13:00 -0700118
solenbergff976312016-03-30 23:28:51 -0700119 bool SetupRecvStream() {
120 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700121 return false;
122 }
solenberg8189b022016-06-14 12:13:00 -0700123 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700124 }
solenberg8189b022016-06-14 12:13:00 -0700125
solenbergff976312016-03-30 23:28:51 -0700126 bool SetupSendStream() {
127 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000128 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800130 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
131 return false;
132 }
133 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134 }
solenberg8189b022016-06-14 12:13:00 -0700135
136 bool AddRecvStream(uint32_t ssrc) {
137 EXPECT_TRUE(channel_);
138 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
139 }
140
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000141 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700142 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700143 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800144 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700145 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700146 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800147 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000148 }
solenberg8189b022016-06-14 12:13:00 -0700149
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000150 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700151 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000152 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 }
solenberg8189b022016-06-14 12:13:00 -0700154
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200155 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157 }
158
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100159 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
160 const auto* send_stream = call_.GetAudioSendStream(ssrc);
161 EXPECT_TRUE(send_stream);
162 return *send_stream;
163 }
164
deadbeef884f5852016-01-15 09:20:04 -0800165 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
166 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
167 EXPECT_TRUE(recv_stream);
168 return *recv_stream;
169 }
170
solenberg3a941542015-11-16 07:34:50 -0800171 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800172 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800173 }
174
solenberg7add0582015-11-20 09:59:34 -0800175 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800176 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800177 }
178
solenbergd53a3f92016-04-14 13:56:37 -0700179 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
180 ASSERT_TRUE(channel);
181 if (enable) {
182 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
183 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
184 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
185 }
186 channel->SetSend(enable);
187 }
188
Peter Boström0c4e06b2015-10-07 12:23:21 +0200189 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700190 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000191 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700192 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000193 // send stream.
194 EXPECT_TRUE(channel_->AddSendStream(
195 cricket::StreamParams::CreateLegacy(kSsrc1)));
196 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000197
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200199 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700200 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800202 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200203 send_parameters_.codecs.push_back(kTelephoneEventCodec);
204 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000205 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000206
207 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700208 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800209 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000210 EXPECT_TRUE(channel_->AddSendStream(
211 cricket::StreamParams::CreateLegacy(kSsrc1)));
212 }
213
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000214 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800215 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000216
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100217 // Test send.
218 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
219 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
220 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800221 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100222 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
223 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
224 EXPECT_EQ(2, telephone_event.event_code);
225 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000226 }
227
228 // Test that send bandwidth is set correctly.
229 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000230 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
231 // |expected_result| is the expected result from SetMaxSendBandwidth().
232 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700233 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
234 int max_bitrate,
235 bool expected_result,
236 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200237 cricket::AudioSendParameters parameters;
238 parameters.codecs.push_back(codec);
239 parameters.max_bandwidth_bps = max_bitrate;
240 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
241
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000242 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000243 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000244 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000245 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000246 }
247
skvlade0d46372016-04-07 22:59:22 -0700248 // Sets the per-stream maximum bitrate limit for the specified SSRC.
249 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700250 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700251 EXPECT_EQ(1UL, parameters.encodings.size());
252
253 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700254 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700255 }
256
257 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
258 cricket::AudioSendParameters send_parameters;
259 send_parameters.codecs.push_back(codec);
260 send_parameters.max_bandwidth_bps = bitrate;
261 return channel_->SetSendParameters(send_parameters);
262 }
263
264 int GetCodecBitrate(int32_t ssrc) {
265 cricket::WebRtcVoiceMediaChannel* media_channel =
266 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
267 int channel = media_channel->GetSendChannelId(ssrc);
268 EXPECT_NE(-1, channel);
269 webrtc::CodecInst codec;
270 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
271 return codec.rate;
272 }
273
274 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
275 int global_max,
276 int stream_max,
277 bool expected_result,
278 int expected_codec_bitrate) {
279 // Clear the bitrate limit from the previous test case.
280 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
281
282 // Attempt to set the requested bitrate limits.
283 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
284 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
285
286 // Verify that reading back the parameters gives results
287 // consistent with the Set() result.
288 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700289 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700290 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
291 EXPECT_EQ(expected_result ? stream_max : -1,
292 resulting_parameters.encodings[0].max_bitrate_bps);
293
294 // Verify that the codec settings have the expected bitrate.
295 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
296 }
297
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000298 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700299 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000300
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000301 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800302 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000303
304 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700305 send_parameters_.extensions.push_back(
306 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200307 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800308 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000309
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000310 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200311 send_parameters_.extensions.clear();
312 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800313 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000314
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000315 // Ensure extension is set properly.
316 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700317 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200318 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800319 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700320 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800321 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000322
solenberg7add0582015-11-20 09:59:34 -0800323 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000324 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700325 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800326 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
327 call_.GetAudioSendStream(kSsrc2));
328 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700329 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800330 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000331
332 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200333 send_parameters_.codecs.push_back(kPcmuCodec);
334 send_parameters_.extensions.clear();
335 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800336 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
337 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000338 }
339
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000340 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700341 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000342
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000343 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800344 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000345
346 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700347 recv_parameters_.extensions.push_back(
348 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800349 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
350 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000351
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000352 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800353 recv_parameters_.extensions.clear();
354 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
355 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000356
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000357 // Ensure extension is set properly.
358 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700359 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800360 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
361 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700362 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800363 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000364
solenberg7add0582015-11-20 09:59:34 -0800365 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700366 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800367 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
368 call_.GetAudioReceiveStream(kSsrc2));
369 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700370 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800371 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000372
373 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800374 recv_parameters_.extensions.clear();
375 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
376 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
377 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000378 }
379
solenberg85a04962015-10-27 03:35:21 -0700380 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
381 webrtc::AudioSendStream::Stats stats;
382 stats.local_ssrc = 12;
383 stats.bytes_sent = 345;
384 stats.packets_sent = 678;
385 stats.packets_lost = 9012;
386 stats.fraction_lost = 34.56f;
387 stats.codec_name = "codec_name_send";
388 stats.ext_seqnum = 789;
389 stats.jitter_ms = 12;
390 stats.rtt_ms = 345;
391 stats.audio_level = 678;
392 stats.aec_quality_min = 9.01f;
393 stats.echo_delay_median_ms = 234;
394 stats.echo_delay_std_ms = 567;
395 stats.echo_return_loss = 890;
396 stats.echo_return_loss_enhancement = 1234;
397 stats.typing_noise_detected = true;
398 return stats;
399 }
400 void SetAudioSendStreamStats() {
401 for (auto* s : call_.GetAudioSendStreams()) {
402 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200403 }
solenberg85a04962015-10-27 03:35:21 -0700404 }
solenberg566ef242015-11-06 15:34:49 -0800405 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
406 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700407 const auto stats = GetAudioSendStreamStats();
408 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
409 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
410 EXPECT_EQ(info.packets_sent, stats.packets_sent);
411 EXPECT_EQ(info.packets_lost, stats.packets_lost);
412 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
413 EXPECT_EQ(info.codec_name, stats.codec_name);
414 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
415 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
416 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
417 EXPECT_EQ(info.audio_level, stats.audio_level);
418 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
419 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
420 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
421 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
422 EXPECT_EQ(info.echo_return_loss_enhancement,
423 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800424 EXPECT_EQ(info.typing_noise_detected,
425 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700426 }
427
428 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
429 webrtc::AudioReceiveStream::Stats stats;
430 stats.remote_ssrc = 123;
431 stats.bytes_rcvd = 456;
432 stats.packets_rcvd = 768;
433 stats.packets_lost = 101;
434 stats.fraction_lost = 23.45f;
435 stats.codec_name = "codec_name_recv";
436 stats.ext_seqnum = 678;
437 stats.jitter_ms = 901;
438 stats.jitter_buffer_ms = 234;
439 stats.jitter_buffer_preferred_ms = 567;
440 stats.delay_estimate_ms = 890;
441 stats.audio_level = 1234;
442 stats.expand_rate = 5.67f;
443 stats.speech_expand_rate = 8.90f;
444 stats.secondary_decoded_rate = 1.23f;
445 stats.accelerate_rate = 4.56f;
446 stats.preemptive_expand_rate = 7.89f;
447 stats.decoding_calls_to_silence_generator = 12;
448 stats.decoding_calls_to_neteq = 345;
449 stats.decoding_normal = 67890;
450 stats.decoding_plc = 1234;
451 stats.decoding_cng = 5678;
452 stats.decoding_plc_cng = 9012;
453 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200454 return stats;
455 }
456 void SetAudioReceiveStreamStats() {
457 for (auto* s : call_.GetAudioReceiveStreams()) {
458 s->SetStats(GetAudioReceiveStreamStats());
459 }
460 }
461 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700462 const auto stats = GetAudioReceiveStreamStats();
463 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
464 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
465 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
466 EXPECT_EQ(info.packets_lost, stats.packets_lost);
467 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
468 EXPECT_EQ(info.codec_name, stats.codec_name);
469 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
470 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
471 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200472 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700473 stats.jitter_buffer_preferred_ms);
474 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
475 EXPECT_EQ(info.audio_level, stats.audio_level);
476 EXPECT_EQ(info.expand_rate, stats.expand_rate);
477 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
478 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
479 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
480 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200481 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700482 stats.decoding_calls_to_silence_generator);
483 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
484 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
485 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
486 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
487 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
488 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200489 }
490
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700492 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200493 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000494 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700495 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700496 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200497 cricket::AudioSendParameters send_parameters_;
498 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800499 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800500 private:
501 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502};
503
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504// Tests that we can create and destroy a channel.
505TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700506 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507}
508
solenberg31fec402016-05-06 02:13:12 -0700509// Test that we can add a send stream and that it has the correct defaults.
510TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
511 EXPECT_TRUE(SetupChannel());
512 EXPECT_TRUE(
513 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
514 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
515 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
516 EXPECT_EQ("", config.rtp.c_name);
517 EXPECT_EQ(0u, config.rtp.extensions.size());
518 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
519 config.send_transport);
520}
521
522// Test that we can add a receive stream and that it has the correct defaults.
523TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
524 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700525 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700526 const webrtc::AudioReceiveStream::Config& config =
527 GetRecvStreamConfig(kSsrc1);
528 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
529 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
530 EXPECT_FALSE(config.rtp.transport_cc);
531 EXPECT_EQ(0u, config.rtp.extensions.size());
532 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
533 config.rtcp_send_transport);
534 EXPECT_EQ("", config.sync_group);
535}
536
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700538// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700539// TODO(ossu): This test should move into a separate builtin audio codecs
540// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700541TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700542 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543 ASSERT_FALSE(codecs.empty());
544 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
545 EXPECT_EQ(48000, codecs[0].clockrate);
546 EXPECT_EQ(2, codecs[0].channels);
547 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548}
549
stefanba4c0e42016-02-04 04:12:24 -0800550TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700551 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800552 bool opus_found = false;
553 for (cricket::AudioCodec codec : codecs) {
554 if (codec.name == "opus") {
555 EXPECT_TRUE(HasTransportCc(codec));
556 opus_found = true;
557 }
558 }
559 EXPECT_TRUE(opus_found);
560}
561
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562// Tests that we can find codecs by name or id, and that we interpret the
563// clockrate and bitrate fields properly.
564TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
565 cricket::AudioCodec codec;
566 webrtc::CodecInst codec_inst;
567 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800568 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000569 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800570 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800572 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
573 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574 // Find ISAC with a different payload id.
575 codec = kIsacCodec;
576 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800577 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578 EXPECT_EQ(codec.id, codec_inst.pltype);
579 // Find PCMU with a 0 clockrate.
580 codec = kPcmuCodec;
581 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800582 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 EXPECT_EQ(codec.id, codec_inst.pltype);
584 EXPECT_EQ(8000, codec_inst.plfreq);
585 // Find PCMU with a 0 bitrate.
586 codec = kPcmuCodec;
587 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800588 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 EXPECT_EQ(codec.id, codec_inst.pltype);
590 EXPECT_EQ(64000, codec_inst.rate);
591 // Find ISAC with an explicit bitrate.
592 codec = kIsacCodec;
593 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800594 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 EXPECT_EQ(codec.id, codec_inst.pltype);
596 EXPECT_EQ(32000, codec_inst.rate);
597}
598
599// Test that we set our inbound codecs properly, including changing PT.
600TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700601 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200602 cricket::AudioRecvParameters parameters;
603 parameters.codecs.push_back(kIsacCodec);
604 parameters.codecs.push_back(kPcmuCodec);
605 parameters.codecs.push_back(kTelephoneEventCodec);
606 parameters.codecs[0].id = 106; // collide with existing telephone-event
607 parameters.codecs[2].id = 126;
608 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700609 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700610 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800612 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 gcodec.plfreq = 16000;
614 gcodec.channels = 1;
615 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
616 EXPECT_EQ(106, gcodec.pltype);
617 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800618 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 gcodec.plfreq = 8000;
620 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
621 EXPECT_EQ(126, gcodec.pltype);
622 EXPECT_STREQ("telephone-event", gcodec.plname);
623}
624
625// Test that we fail to set an unknown inbound codec.
626TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700627 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200628 cricket::AudioRecvParameters parameters;
629 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700630 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200631 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632}
633
634// Test that we fail if we have duplicate types in the inbound list.
635TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700636 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200637 cricket::AudioRecvParameters parameters;
638 parameters.codecs.push_back(kIsacCodec);
639 parameters.codecs.push_back(kCn16000Codec);
640 parameters.codecs[1].id = kIsacCodec.id;
641 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000642}
643
644// Test that we can decode OPUS without stereo parameters.
645TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700646 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200647 cricket::AudioRecvParameters parameters;
648 parameters.codecs.push_back(kIsacCodec);
649 parameters.codecs.push_back(kPcmuCodec);
650 parameters.codecs.push_back(kOpusCodec);
651 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700652 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700653 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800655 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 // Even without stereo parameters, recv codecs still specify channels = 2.
657 EXPECT_EQ(2, opus.channels);
658 EXPECT_EQ(111, opus.pltype);
659 EXPECT_STREQ("opus", opus.plname);
660 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700661 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_EQ(111, opus.pltype);
663}
664
665// Test that we can decode OPUS with stereo = 0.
666TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700667 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200668 cricket::AudioRecvParameters parameters;
669 parameters.codecs.push_back(kIsacCodec);
670 parameters.codecs.push_back(kPcmuCodec);
671 parameters.codecs.push_back(kOpusCodec);
672 parameters.codecs[2].params["stereo"] = "0";
673 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700674 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 int channel_num2 = voe_.GetLastChannel();
676 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800677 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 // Even when stereo is off, recv codecs still specify channels = 2.
679 EXPECT_EQ(2, opus.channels);
680 EXPECT_EQ(111, opus.pltype);
681 EXPECT_STREQ("opus", opus.plname);
682 opus.pltype = 0;
683 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
684 EXPECT_EQ(111, opus.pltype);
685}
686
687// Test that we can decode OPUS with stereo = 1.
688TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700689 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200690 cricket::AudioRecvParameters parameters;
691 parameters.codecs.push_back(kIsacCodec);
692 parameters.codecs.push_back(kPcmuCodec);
693 parameters.codecs.push_back(kOpusCodec);
694 parameters.codecs[2].params["stereo"] = "1";
695 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700696 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 int channel_num2 = voe_.GetLastChannel();
698 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800699 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700 EXPECT_EQ(2, opus.channels);
701 EXPECT_EQ(111, opus.pltype);
702 EXPECT_STREQ("opus", opus.plname);
703 opus.pltype = 0;
704 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
705 EXPECT_EQ(111, opus.pltype);
706}
707
708// Test that changes to recv codecs are applied to all streams.
709TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700710 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200711 cricket::AudioRecvParameters parameters;
712 parameters.codecs.push_back(kIsacCodec);
713 parameters.codecs.push_back(kPcmuCodec);
714 parameters.codecs.push_back(kTelephoneEventCodec);
715 parameters.codecs[0].id = 106; // collide with existing telephone-event
716 parameters.codecs[2].id = 126;
717 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700718 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 int channel_num2 = voe_.GetLastChannel();
720 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800721 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 gcodec.plfreq = 16000;
723 gcodec.channels = 1;
724 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
725 EXPECT_EQ(106, gcodec.pltype);
726 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800727 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 gcodec.plfreq = 8000;
729 gcodec.channels = 1;
730 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
731 EXPECT_EQ(126, gcodec.pltype);
732 EXPECT_STREQ("telephone-event", gcodec.plname);
733}
734
735TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700736 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200737 cricket::AudioRecvParameters parameters;
738 parameters.codecs.push_back(kIsacCodec);
739 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200740 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741
742 int channel_num2 = voe_.GetLastChannel();
743 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800744 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745 gcodec.plfreq = 16000;
746 gcodec.channels = 1;
747 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
748 EXPECT_EQ(106, gcodec.pltype);
749 EXPECT_STREQ("ISAC", gcodec.plname);
750}
751
752// Test that we can apply the same set of codecs again while playing.
753TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700754 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755 cricket::AudioRecvParameters parameters;
756 parameters.codecs.push_back(kIsacCodec);
757 parameters.codecs.push_back(kCn16000Codec);
758 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200760 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761
762 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200763 parameters.codecs[0].id = 127;
764 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
765 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 EXPECT_TRUE(voe_.GetPlayout(channel_num));
767}
768
769// Test that we can add a codec while playing.
770TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700771 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200772 cricket::AudioRecvParameters parameters;
773 parameters.codecs.push_back(kIsacCodec);
774 parameters.codecs.push_back(kCn16000Codec);
775 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_TRUE(channel_->SetPlayout(true));
777
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200778 parameters.codecs.push_back(kOpusCodec);
779 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
780 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781 EXPECT_TRUE(voe_.GetPlayout(channel_num));
782 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800783 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
785}
786
787TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700788 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000790 // Test that when autobw is enabled, bitrate is kept as the default
791 // value. autobw is enabled for the following tests because the target
792 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793
794 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700795 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796
797 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700798 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700801 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802}
803
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000804TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700805 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000807 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000808
809 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700810 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
811 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
812 // Rates above the max (56000) should be capped.
813 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700816 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
817 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
818 // Rates above the max (510000) should be capped.
819 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820}
821
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000822TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700823 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000824
825 // Test that we can only set a maximum bitrate for a fixed-rate codec
826 // if it's bigger than the fixed rate.
827
828 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700829 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
830 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
831 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
832 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
833 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
834 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
835 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000836}
837
838TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700839 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200840 const int kDesiredBitrate = 128000;
841 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700842 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200843 parameters.max_bandwidth_bps = kDesiredBitrate;
844 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000845
846 EXPECT_TRUE(channel_->AddSendStream(
847 cricket::StreamParams::CreateLegacy(kSsrc1)));
848
849 int channel_num = voe_.GetLastChannel();
850 webrtc::CodecInst codec;
851 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200852 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000853}
854
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855// Test that bitrate cannot be set for CBR codecs.
856// Bitrate is ignored if it is higher than the fixed bitrate.
857// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000858TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700859 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860
861 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200862 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
863 int channel_num = voe_.GetLastChannel();
864 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
866 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200867
868 send_parameters_.max_bandwidth_bps = 128000;
869 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
871 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200872
873 send_parameters_.max_bandwidth_bps = 128;
874 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000875 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
876 EXPECT_EQ(64000, codec.rate);
877}
878
skvlade0d46372016-04-07 22:59:22 -0700879// Test that the per-stream bitrate limit and the global
880// bitrate limit both apply.
881TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
882 EXPECT_TRUE(SetupSendStream());
883
884 // opus, default bitrate == 64000.
885 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
886 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
887 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
888 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
889
890 // CBR codecs allow both maximums to exceed the bitrate.
891 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
892 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
893 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
894 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
895
896 // CBR codecs don't allow per stream maximums to be too low.
897 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
898 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
899}
900
901// Test that an attempt to set RtpParameters for a stream that does not exist
902// fails.
903TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
904 EXPECT_TRUE(SetupChannel());
905 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700906 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700907 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
908
909 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700910 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700911}
912
913TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700914 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700915 // This test verifies that setting RtpParameters succeeds only if
916 // the structure contains exactly one encoding.
917 // TODO(skvlad): Update this test when we start supporting setting parameters
918 // for each encoding individually.
919
920 EXPECT_TRUE(SetupSendStream());
921 // Setting RtpParameters with no encoding is expected to fail.
922 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700923 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700924 // Setting RtpParameters with exactly one encoding should succeed.
925 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700926 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700927 // Two or more encodings should result in failure.
928 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700929 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700930}
931
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700932// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700933// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700934TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
935 EXPECT_TRUE(SetupSendStream());
936 SetSend(channel_, true);
937 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
938 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700939 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700940 ASSERT_EQ(1u, parameters.encodings.size());
941 ASSERT_TRUE(parameters.encodings[0].active);
942 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700943 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700944 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
945
946 // Now change it back to active and verify we resume sending.
947 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700948 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700949 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
950}
951
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700952// Test that SetRtpSendParameters configures the correct encoding channel for
953// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700954TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
955 SetupForMultiSendStream();
956 // Create send streams.
957 for (uint32_t ssrc : kSsrcs4) {
958 EXPECT_TRUE(
959 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
960 }
961 // Configure one stream to be limited by the stream config, another to be
962 // limited by the global max, and the third one with no per-stream limit
963 // (still subject to the global limit).
964 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
965 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
966 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
967 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
968
969 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
970 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
971 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
972
973 // Remove the global cap; the streams should switch to their respective
974 // maximums (or remain unchanged if there was no other limit on them.)
975 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
976 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
977 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
978 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
979}
980
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700981// Test that GetRtpSendParameters returns the currently configured codecs.
982TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700983 EXPECT_TRUE(SetupSendStream());
984 cricket::AudioSendParameters parameters;
985 parameters.codecs.push_back(kIsacCodec);
986 parameters.codecs.push_back(kPcmuCodec);
987 EXPECT_TRUE(channel_->SetSendParameters(parameters));
988
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700989 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700990 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700991 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
992 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700993}
994
995// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700996TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700997 EXPECT_TRUE(SetupSendStream());
998 cricket::AudioSendParameters parameters;
999 parameters.codecs.push_back(kIsacCodec);
1000 parameters.codecs.push_back(kPcmuCodec);
1001 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1002
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001003 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001004
1005 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001006 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001007
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001008 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1009 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1010 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1011}
1012
1013// Test that GetRtpReceiveParameters returns the currently configured codecs.
1014TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1015 EXPECT_TRUE(SetupRecvStream());
1016 cricket::AudioRecvParameters parameters;
1017 parameters.codecs.push_back(kIsacCodec);
1018 parameters.codecs.push_back(kPcmuCodec);
1019 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1020
1021 webrtc::RtpParameters rtp_parameters =
1022 channel_->GetRtpReceiveParameters(kSsrc1);
1023 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1024 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1025 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1026}
1027
1028// Test that if we set/get parameters multiple times, we get the same results.
1029TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1030 EXPECT_TRUE(SetupRecvStream());
1031 cricket::AudioRecvParameters parameters;
1032 parameters.codecs.push_back(kIsacCodec);
1033 parameters.codecs.push_back(kPcmuCodec);
1034 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1035
1036 webrtc::RtpParameters initial_params =
1037 channel_->GetRtpReceiveParameters(kSsrc1);
1038
1039 // We should be able to set the params we just got.
1040 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1041
1042 // ... And this shouldn't change the params returned by
1043 // GetRtpReceiveParameters.
1044 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1045 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001046}
1047
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001048// Test that we apply codecs properly.
1049TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001050 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001051 cricket::AudioSendParameters parameters;
1052 parameters.codecs.push_back(kIsacCodec);
1053 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001054 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001055 parameters.codecs[0].id = 96;
1056 parameters.codecs[0].bitrate = 48000;
1057 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001058 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001059 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 webrtc::CodecInst gcodec;
1061 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1062 EXPECT_EQ(96, gcodec.pltype);
1063 EXPECT_EQ(48000, gcodec.rate);
1064 EXPECT_STREQ("ISAC", gcodec.plname);
1065 EXPECT_FALSE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1067 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001068 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001069}
1070
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001071// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1072// to apply.
1073TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001074 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001075 cricket::AudioSendParameters parameters;
1076 parameters.codecs.push_back(kIsacCodec);
1077 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001078 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 parameters.codecs[0].id = 96;
1080 parameters.codecs[0].bitrate = 48000;
1081 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001082 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1083 // Calling SetSendCodec again with same codec which is already set.
1084 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001085 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001086 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1087}
1088
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001089// Verify that G722 is set with 16000 samples per second to WebRTC.
1090TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001091 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001092 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001093 cricket::AudioSendParameters parameters;
1094 parameters.codecs.push_back(kG722CodecSdp);
1095 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001096 webrtc::CodecInst gcodec;
1097 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1098 EXPECT_STREQ("G722", gcodec.plname);
1099 EXPECT_EQ(1, gcodec.channels);
1100 EXPECT_EQ(16000, gcodec.plfreq);
1101}
1102
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001103// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001105 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 cricket::AudioSendParameters parameters;
1107 parameters.codecs.push_back(kOpusCodec);
1108 parameters.codecs[0].bitrate = 0;
1109 parameters.codecs[0].clockrate = 50000;
1110 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111}
1112
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001113// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001115 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001116 cricket::AudioSendParameters parameters;
1117 parameters.codecs.push_back(kOpusCodec);
1118 parameters.codecs[0].bitrate = 0;
1119 parameters.codecs[0].channels = 0;
1120 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121}
1122
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001123// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001125 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001126 cricket::AudioSendParameters parameters;
1127 parameters.codecs.push_back(kOpusCodec);
1128 parameters.codecs[0].bitrate = 0;
1129 parameters.codecs[0].channels = 0;
1130 parameters.codecs[0].params["stereo"] = "1";
1131 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132}
1133
1134// Test that if channel is 1 for opus and there's no stereo, we fail.
1135TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001136 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001137 cricket::AudioSendParameters parameters;
1138 parameters.codecs.push_back(kOpusCodec);
1139 parameters.codecs[0].bitrate = 0;
1140 parameters.codecs[0].channels = 1;
1141 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142}
1143
1144// Test that if channel is 1 for opus and stereo=0, we fail.
1145TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001146 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001147 cricket::AudioSendParameters parameters;
1148 parameters.codecs.push_back(kOpusCodec);
1149 parameters.codecs[0].bitrate = 0;
1150 parameters.codecs[0].channels = 1;
1151 parameters.codecs[0].params["stereo"] = "0";
1152 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153}
1154
1155// Test that if channel is 1 for opus and stereo=1, we fail.
1156TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001157 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001158 cricket::AudioSendParameters parameters;
1159 parameters.codecs.push_back(kOpusCodec);
1160 parameters.codecs[0].bitrate = 0;
1161 parameters.codecs[0].channels = 1;
1162 parameters.codecs[0].params["stereo"] = "1";
1163 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164}
1165
1166// Test that with bitrate=0 and no stereo,
1167// channels and bitrate are 1 and 32000.
1168TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001169 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001171 cricket::AudioSendParameters parameters;
1172 parameters.codecs.push_back(kOpusCodec);
1173 parameters.codecs[0].bitrate = 0;
1174 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175 webrtc::CodecInst gcodec;
1176 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1177 EXPECT_STREQ("opus", gcodec.plname);
1178 EXPECT_EQ(1, gcodec.channels);
1179 EXPECT_EQ(32000, gcodec.rate);
1180}
1181
1182// Test that with bitrate=0 and stereo=0,
1183// channels and bitrate are 1 and 32000.
1184TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001185 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001186 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001187 cricket::AudioSendParameters parameters;
1188 parameters.codecs.push_back(kOpusCodec);
1189 parameters.codecs[0].bitrate = 0;
1190 parameters.codecs[0].params["stereo"] = "0";
1191 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192 webrtc::CodecInst gcodec;
1193 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1194 EXPECT_STREQ("opus", gcodec.plname);
1195 EXPECT_EQ(1, gcodec.channels);
1196 EXPECT_EQ(32000, gcodec.rate);
1197}
1198
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001199// Test that with bitrate=invalid and stereo=0,
1200// channels and bitrate are 1 and 32000.
1201TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001202 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001203 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001204 cricket::AudioSendParameters parameters;
1205 parameters.codecs.push_back(kOpusCodec);
1206 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001207 webrtc::CodecInst gcodec;
1208
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001209 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001210 parameters.codecs[0].bitrate = 5999;
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001212 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1213 EXPECT_STREQ("opus", gcodec.plname);
1214 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001215 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001217 parameters.codecs[0].bitrate = 510001;
1218 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001219 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1220 EXPECT_STREQ("opus", gcodec.plname);
1221 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001222 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001223}
1224
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001225// Test that with bitrate=0 and stereo=1,
1226// channels and bitrate are 2 and 64000.
1227TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001228 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001229 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001230 cricket::AudioSendParameters parameters;
1231 parameters.codecs.push_back(kOpusCodec);
1232 parameters.codecs[0].bitrate = 0;
1233 parameters.codecs[0].params["stereo"] = "1";
1234 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001235 webrtc::CodecInst gcodec;
1236 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1237 EXPECT_STREQ("opus", gcodec.plname);
1238 EXPECT_EQ(2, gcodec.channels);
1239 EXPECT_EQ(64000, gcodec.rate);
1240}
1241
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001242// Test that with bitrate=invalid and stereo=1,
1243// channels and bitrate are 2 and 64000.
1244TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001245 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001246 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001247 cricket::AudioSendParameters parameters;
1248 parameters.codecs.push_back(kOpusCodec);
1249 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001250 webrtc::CodecInst gcodec;
1251
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001252 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 parameters.codecs[0].bitrate = 5999;
1254 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001255 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1256 EXPECT_STREQ("opus", gcodec.plname);
1257 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001258 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001259
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001260 parameters.codecs[0].bitrate = 510001;
1261 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001262 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1263 EXPECT_STREQ("opus", gcodec.plname);
1264 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001265 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001266}
1267
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001268// Test that with bitrate=N and stereo unset,
1269// channels and bitrate are 1 and N.
1270TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001271 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001273 cricket::AudioSendParameters parameters;
1274 parameters.codecs.push_back(kOpusCodec);
1275 parameters.codecs[0].bitrate = 96000;
1276 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001277 webrtc::CodecInst gcodec;
1278 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1279 EXPECT_EQ(111, gcodec.pltype);
1280 EXPECT_EQ(96000, gcodec.rate);
1281 EXPECT_STREQ("opus", gcodec.plname);
1282 EXPECT_EQ(1, gcodec.channels);
1283 EXPECT_EQ(48000, gcodec.plfreq);
1284}
1285
1286// Test that with bitrate=N and stereo=0,
1287// channels and bitrate are 1 and N.
1288TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001289 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001290 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001291 cricket::AudioSendParameters parameters;
1292 parameters.codecs.push_back(kOpusCodec);
1293 parameters.codecs[0].bitrate = 30000;
1294 parameters.codecs[0].params["stereo"] = "0";
1295 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001296 webrtc::CodecInst gcodec;
1297 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1298 EXPECT_EQ(1, gcodec.channels);
1299 EXPECT_EQ(30000, gcodec.rate);
1300 EXPECT_STREQ("opus", gcodec.plname);
1301}
1302
1303// Test that with bitrate=N and without any parameters,
1304// channels and bitrate are 1 and N.
1305TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001306 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001308 cricket::AudioSendParameters parameters;
1309 parameters.codecs.push_back(kOpusCodec);
1310 parameters.codecs[0].bitrate = 30000;
1311 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001312 webrtc::CodecInst gcodec;
1313 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1314 EXPECT_EQ(1, gcodec.channels);
1315 EXPECT_EQ(30000, gcodec.rate);
1316 EXPECT_STREQ("opus", gcodec.plname);
1317}
1318
1319// Test that with bitrate=N and stereo=1,
1320// channels and bitrate are 2 and N.
1321TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001322 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001323 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001324 cricket::AudioSendParameters parameters;
1325 parameters.codecs.push_back(kOpusCodec);
1326 parameters.codecs[0].bitrate = 30000;
1327 parameters.codecs[0].params["stereo"] = "1";
1328 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001329 webrtc::CodecInst gcodec;
1330 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1331 EXPECT_EQ(2, gcodec.channels);
1332 EXPECT_EQ(30000, gcodec.rate);
1333 EXPECT_STREQ("opus", gcodec.plname);
1334}
1335
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001336// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1337// Also test that the "maxaveragebitrate" can't be set to values outside the
1338// range of 6000 and 510000
1339TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001340 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001341 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001342 cricket::AudioSendParameters parameters;
1343 parameters.codecs.push_back(kOpusCodec);
1344 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345 webrtc::CodecInst gcodec;
1346
1347 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001348 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1349 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001350 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001351 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001352
1353 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001354 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1355 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001356 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001357 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001358
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001359 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1360 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001361 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1362 EXPECT_EQ(200000, gcodec.rate);
1363}
1364
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001365// Test that we can enable NACK with opus as caller.
1366TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001367 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 cricket::AudioSendParameters parameters;
1369 parameters.codecs.push_back(kOpusCodec);
1370 parameters.codecs[0].AddFeedbackParam(
1371 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1372 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001373 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001375 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376}
1377
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001378// Test that we can enable NACK with opus as callee.
1379TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001380 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001381 cricket::AudioSendParameters parameters;
1382 parameters.codecs.push_back(kOpusCodec);
1383 parameters.codecs[0].AddFeedbackParam(
1384 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1385 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001386 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001387 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001388 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001389 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001390
1391 EXPECT_TRUE(channel_->AddSendStream(
1392 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001393 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001394}
1395
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001396// Test that we can enable NACK on receive streams.
1397TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001398 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001399 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001400 cricket::AudioSendParameters parameters;
1401 parameters.codecs.push_back(kOpusCodec);
1402 parameters.codecs[0].AddFeedbackParam(
1403 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1404 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001405 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001406 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001407 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001408 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001409 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001410}
1411
1412// Test that we can disable NACK.
1413TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001414 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kOpusCodec);
1417 parameters.codecs[0].AddFeedbackParam(
1418 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1419 cricket::kParamValueEmpty));
1420 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001421 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001422
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001423 parameters.codecs.clear();
1424 parameters.codecs.push_back(kOpusCodec);
1425 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001426 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001427}
1428
1429// Test that we can disable NACK on receive streams.
1430TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001431 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001432 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 cricket::AudioSendParameters parameters;
1434 parameters.codecs.push_back(kOpusCodec);
1435 parameters.codecs[0].AddFeedbackParam(
1436 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1437 cricket::kParamValueEmpty));
1438 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001439 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001440 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001442 parameters.codecs.clear();
1443 parameters.codecs.push_back(kOpusCodec);
1444 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001445 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001446 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447}
1448
1449// Test that NACK is enabled on a new receive stream.
1450TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001451 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001452 cricket::AudioSendParameters parameters;
1453 parameters.codecs.push_back(kIsacCodec);
1454 parameters.codecs.push_back(kCn16000Codec);
1455 parameters.codecs[0].AddFeedbackParam(
1456 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1457 cricket::kParamValueEmpty));
1458 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001459 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001460
solenberg8189b022016-06-14 12:13:00 -07001461 EXPECT_TRUE(AddRecvStream(kSsrc2));
1462 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1463 EXPECT_TRUE(AddRecvStream(kSsrc3));
1464 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465}
1466
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001467// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001468TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001469 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001470 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001471 cricket::AudioSendParameters parameters;
1472 parameters.codecs.push_back(kOpusCodec);
1473 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001474 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1475}
1476
1477// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001478TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001479 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001480 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001481 cricket::AudioSendParameters parameters;
1482 parameters.codecs.push_back(kOpusCodec);
1483 parameters.codecs[0].bitrate = 0;
1484 parameters.codecs[0].params["useinbandfec"] = "0";
1485 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001486 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1487 webrtc::CodecInst gcodec;
1488 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1489 EXPECT_STREQ("opus", gcodec.plname);
1490 EXPECT_EQ(1, gcodec.channels);
1491 EXPECT_EQ(32000, gcodec.rate);
1492}
1493
1494// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001495TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001496 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001497 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001498 cricket::AudioSendParameters parameters;
1499 parameters.codecs.push_back(kOpusCodec);
1500 parameters.codecs[0].bitrate = 0;
1501 parameters.codecs[0].params["useinbandfec"] = "1";
1502 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001503 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1504 webrtc::CodecInst gcodec;
1505 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1506 EXPECT_STREQ("opus", gcodec.plname);
1507 EXPECT_EQ(1, gcodec.channels);
1508 EXPECT_EQ(32000, gcodec.rate);
1509}
1510
1511// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001512TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001513 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001514 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 cricket::AudioSendParameters parameters;
1516 parameters.codecs.push_back(kOpusCodec);
1517 parameters.codecs[0].bitrate = 0;
1518 parameters.codecs[0].params["stereo"] = "1";
1519 parameters.codecs[0].params["useinbandfec"] = "1";
1520 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001521 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1522 webrtc::CodecInst gcodec;
1523 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1524 EXPECT_STREQ("opus", gcodec.plname);
1525 EXPECT_EQ(2, gcodec.channels);
1526 EXPECT_EQ(64000, gcodec.rate);
1527}
1528
1529// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001530TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001531 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001532 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001533 cricket::AudioSendParameters parameters;
1534 parameters.codecs.push_back(kIsacCodec);
1535 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001536 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1537}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001538
1539// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1540TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001541 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001542 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001543 cricket::AudioSendParameters parameters;
1544 parameters.codecs.push_back(kIsacCodec);
1545 parameters.codecs[0].params["useinbandfec"] = "1";
1546 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001547 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1548}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001549
1550// Test that Opus FEC status can be changed.
1551TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001552 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001553 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001554 cricket::AudioSendParameters parameters;
1555 parameters.codecs.push_back(kOpusCodec);
1556 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001557 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001558 parameters.codecs[0].params["useinbandfec"] = "1";
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1561}
1562
stefanba4c0e42016-02-04 04:12:24 -08001563TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001564 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001565 cricket::AudioSendParameters send_parameters;
1566 send_parameters.codecs.push_back(kOpusCodec);
1567 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1568 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1569
1570 cricket::AudioRecvParameters recv_parameters;
1571 recv_parameters.codecs.push_back(kIsacCodec);
1572 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001573 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001574 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1575 EXPECT_FALSE(
1576 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1577
ossudedfd282016-06-14 07:12:39 -07001578 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001579 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1580 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1581 EXPECT_TRUE(
1582 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1583}
1584
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001585// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1586TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001587 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001588 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001589 cricket::AudioSendParameters parameters;
1590 parameters.codecs.push_back(kOpusCodec);
1591 parameters.codecs[0].bitrate = 0;
1592 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1593 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001594 EXPECT_EQ(cricket::kOpusBandwidthNb,
1595 voe_.GetMaxEncodingBandwidth(channel_num));
1596 webrtc::CodecInst gcodec;
1597 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1598 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001599
1600 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001601 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1602 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001603 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1604 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001605}
1606
1607// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1608TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001609 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001610 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001611 cricket::AudioSendParameters parameters;
1612 parameters.codecs.push_back(kOpusCodec);
1613 parameters.codecs[0].bitrate = 0;
1614 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1615 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001616 EXPECT_EQ(cricket::kOpusBandwidthMb,
1617 voe_.GetMaxEncodingBandwidth(channel_num));
1618 webrtc::CodecInst gcodec;
1619 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1620 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001621
1622 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001623 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1624 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001625 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1626 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001627}
1628
1629// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1630TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001631 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001632 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001633 cricket::AudioSendParameters parameters;
1634 parameters.codecs.push_back(kOpusCodec);
1635 parameters.codecs[0].bitrate = 0;
1636 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1637 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001638 EXPECT_EQ(cricket::kOpusBandwidthWb,
1639 voe_.GetMaxEncodingBandwidth(channel_num));
1640 webrtc::CodecInst gcodec;
1641 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1642 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001643
1644 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001645 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1646 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001647 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1648 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001649}
1650
1651// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1652TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001653 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001654 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001655 cricket::AudioSendParameters parameters;
1656 parameters.codecs.push_back(kOpusCodec);
1657 parameters.codecs[0].bitrate = 0;
1658 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1659 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001660 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1661 voe_.GetMaxEncodingBandwidth(channel_num));
1662 webrtc::CodecInst gcodec;
1663 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1664 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001665
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001666 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001667 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1668 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001669 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1670 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001671}
1672
1673// Test 24000 < maxplaybackrate triggers Opus full band mode.
1674TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001675 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001676 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001677 cricket::AudioSendParameters parameters;
1678 parameters.codecs.push_back(kOpusCodec);
1679 parameters.codecs[0].bitrate = 0;
1680 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1681 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001682 EXPECT_EQ(cricket::kOpusBandwidthFb,
1683 voe_.GetMaxEncodingBandwidth(channel_num));
1684 webrtc::CodecInst gcodec;
1685 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1686 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001687
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001688 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001689 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1690 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001691 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1692 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001693}
1694
1695// Test Opus that without maxplaybackrate, default playback rate is used.
1696TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001697 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001698 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001699 cricket::AudioSendParameters parameters;
1700 parameters.codecs.push_back(kOpusCodec);
1701 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001702 EXPECT_EQ(cricket::kOpusBandwidthFb,
1703 voe_.GetMaxEncodingBandwidth(channel_num));
1704}
1705
1706// Test the with non-Opus, maxplaybackrate has no effect.
1707TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001708 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001709 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001710 cricket::AudioSendParameters parameters;
1711 parameters.codecs.push_back(kIsacCodec);
1712 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1713 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001714 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1715}
1716
1717// Test maxplaybackrate can be set on two streams.
1718TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001719 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001720 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001721 cricket::AudioSendParameters parameters;
1722 parameters.codecs.push_back(kOpusCodec);
1723 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001724 // Default bandwidth is 24000.
1725 EXPECT_EQ(cricket::kOpusBandwidthFb,
1726 voe_.GetMaxEncodingBandwidth(channel_num));
1727
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001728 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001729
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001730 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001731 EXPECT_EQ(cricket::kOpusBandwidthNb,
1732 voe_.GetMaxEncodingBandwidth(channel_num));
1733
1734 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1735 channel_num = voe_.GetLastChannel();
1736 EXPECT_EQ(cricket::kOpusBandwidthNb,
1737 voe_.GetMaxEncodingBandwidth(channel_num));
1738}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001739
Minyue Li7100dcd2015-03-27 05:05:59 +01001740// Test that with usedtx=0, Opus DTX is off.
1741TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001742 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001743 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001744 cricket::AudioSendParameters parameters;
1745 parameters.codecs.push_back(kOpusCodec);
1746 parameters.codecs[0].params["usedtx"] = "0";
1747 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001748 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1749}
1750
1751// Test that with usedtx=1, Opus DTX is on.
1752TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001753 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001754 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001755 cricket::AudioSendParameters parameters;
1756 parameters.codecs.push_back(kOpusCodec);
1757 parameters.codecs[0].params["usedtx"] = "1";
1758 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001759 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1760 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1761}
1762
1763// Test that usedtx=1 works with stereo Opus.
1764TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001765 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001766 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001767 cricket::AudioSendParameters parameters;
1768 parameters.codecs.push_back(kOpusCodec);
1769 parameters.codecs[0].params["usedtx"] = "1";
1770 parameters.codecs[0].params["stereo"] = "1";
1771 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001772 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1773 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1774}
1775
1776// Test that usedtx=1 does not work with non Opus.
1777TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001778 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001779 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001780 cricket::AudioSendParameters parameters;
1781 parameters.codecs.push_back(kIsacCodec);
1782 parameters.codecs[0].params["usedtx"] = "1";
1783 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001784 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1785}
1786
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001787// Test that we can switch back and forth between Opus and ISAC with CN.
1788TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001789 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001790 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001791 cricket::AudioSendParameters opus_parameters;
1792 opus_parameters.codecs.push_back(kOpusCodec);
1793 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 webrtc::CodecInst gcodec;
1795 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001796 EXPECT_EQ(111, gcodec.pltype);
1797 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001799 cricket::AudioSendParameters isac_parameters;
1800 isac_parameters.codecs.push_back(kIsacCodec);
1801 isac_parameters.codecs.push_back(kCn16000Codec);
1802 isac_parameters.codecs.push_back(kOpusCodec);
1803 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1805 EXPECT_EQ(103, gcodec.pltype);
1806 EXPECT_STREQ("ISAC", gcodec.plname);
1807
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001808 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001809 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001810 EXPECT_EQ(111, gcodec.pltype);
1811 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812}
1813
1814// Test that we handle various ways of specifying bitrate.
1815TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001816 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001817 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001818 cricket::AudioSendParameters parameters;
1819 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1820 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 webrtc::CodecInst gcodec;
1822 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1823 EXPECT_EQ(103, gcodec.pltype);
1824 EXPECT_STREQ("ISAC", gcodec.plname);
1825 EXPECT_EQ(32000, gcodec.rate);
1826
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001827 parameters.codecs[0].bitrate = 0; // bitrate == default
1828 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1830 EXPECT_EQ(103, gcodec.pltype);
1831 EXPECT_STREQ("ISAC", gcodec.plname);
1832 EXPECT_EQ(-1, gcodec.rate);
1833
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001834 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1835 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1837 EXPECT_EQ(103, gcodec.pltype);
1838 EXPECT_STREQ("ISAC", gcodec.plname);
1839 EXPECT_EQ(28000, gcodec.rate);
1840
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001841 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1842 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1844 EXPECT_EQ(0, gcodec.pltype);
1845 EXPECT_STREQ("PCMU", gcodec.plname);
1846 EXPECT_EQ(64000, gcodec.rate);
1847
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001848 parameters.codecs[0].bitrate = 0; // bitrate == default
1849 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001850 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1851 EXPECT_EQ(0, gcodec.pltype);
1852 EXPECT_STREQ("PCMU", gcodec.plname);
1853 EXPECT_EQ(64000, gcodec.rate);
1854
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001855 parameters.codecs[0] = kOpusCodec;
1856 parameters.codecs[0].bitrate = 0; // bitrate == default
1857 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1859 EXPECT_EQ(111, gcodec.pltype);
1860 EXPECT_STREQ("opus", gcodec.plname);
1861 EXPECT_EQ(32000, gcodec.rate);
1862}
1863
Brave Yao5225dd82015-03-26 07:39:19 +08001864// Test that we could set packet size specified in kCodecParamPTime.
1865TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001866 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001867 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001868 cricket::AudioSendParameters parameters;
1869 parameters.codecs.push_back(kOpusCodec);
1870 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1871 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001872 webrtc::CodecInst gcodec;
1873 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1874 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1875
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001876 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1877 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001878 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1879 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1880
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001881 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1882 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001883 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1884 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1885
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001886 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1887 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1888 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001889 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1890 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1891
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001892 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1893 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1894 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001895 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1896 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1897}
1898
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001899// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001901 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001902 cricket::AudioSendParameters parameters;
1903 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001904}
1905
1906// Test that we can set send codecs even with telephone-event codec as the first
1907// one on the list.
1908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001909 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001911 cricket::AudioSendParameters parameters;
1912 parameters.codecs.push_back(kTelephoneEventCodec);
1913 parameters.codecs.push_back(kIsacCodec);
1914 parameters.codecs.push_back(kPcmuCodec);
1915 parameters.codecs[0].id = 98; // DTMF
1916 parameters.codecs[1].id = 96;
1917 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001918 webrtc::CodecInst gcodec;
1919 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001920 EXPECT_EQ(96, gcodec.pltype);
1921 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001922 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001923}
1924
solenberg31642aa2016-03-14 08:00:37 -07001925// Test that payload type range is limited for telephone-event codec.
1926TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001927 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001928 cricket::AudioSendParameters parameters;
1929 parameters.codecs.push_back(kTelephoneEventCodec);
1930 parameters.codecs.push_back(kIsacCodec);
1931 parameters.codecs[0].id = 0; // DTMF
1932 parameters.codecs[1].id = 96;
1933 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1934 EXPECT_TRUE(channel_->CanInsertDtmf());
1935 parameters.codecs[0].id = 128; // DTMF
1936 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1937 EXPECT_FALSE(channel_->CanInsertDtmf());
1938 parameters.codecs[0].id = 127;
1939 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1940 EXPECT_TRUE(channel_->CanInsertDtmf());
1941 parameters.codecs[0].id = -1; // DTMF
1942 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1943 EXPECT_FALSE(channel_->CanInsertDtmf());
1944}
1945
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001946// Test that we can set send codecs even with CN codec as the first
1947// one on the list.
1948TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001949 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001950 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001951 cricket::AudioSendParameters parameters;
1952 parameters.codecs.push_back(kCn16000Codec);
1953 parameters.codecs.push_back(kIsacCodec);
1954 parameters.codecs.push_back(kPcmuCodec);
1955 parameters.codecs[0].id = 98; // wideband CN
1956 parameters.codecs[1].id = 96;
1957 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001958 webrtc::CodecInst gcodec;
1959 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1960 EXPECT_EQ(96, gcodec.pltype);
1961 EXPECT_STREQ("ISAC", gcodec.plname);
1962 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963}
1964
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001965// Test that we set VAD and DTMF types correctly as caller.
1966TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001967 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001969 cricket::AudioSendParameters parameters;
1970 parameters.codecs.push_back(kIsacCodec);
1971 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 parameters.codecs.push_back(kCn16000Codec);
1974 parameters.codecs.push_back(kCn8000Codec);
1975 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001976 parameters.codecs[0].id = 96;
1977 parameters.codecs[2].id = 97; // wideband CN
1978 parameters.codecs[4].id = 98; // DTMF
1979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 webrtc::CodecInst gcodec;
1981 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1982 EXPECT_EQ(96, gcodec.pltype);
1983 EXPECT_STREQ("ISAC", gcodec.plname);
1984 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001985 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1986 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001987 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001988}
1989
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001990// Test that we set VAD and DTMF types correctly as callee.
1991TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001992 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001993 cricket::AudioSendParameters parameters;
1994 parameters.codecs.push_back(kIsacCodec);
1995 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001996 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001997 parameters.codecs.push_back(kCn16000Codec);
1998 parameters.codecs.push_back(kCn8000Codec);
1999 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002000 parameters.codecs[0].id = 96;
2001 parameters.codecs[2].id = 97; // wideband CN
2002 parameters.codecs[4].id = 98; // DTMF
2003 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002004 EXPECT_TRUE(channel_->AddSendStream(
2005 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002006 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002007
2008 webrtc::CodecInst gcodec;
2009 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2010 EXPECT_EQ(96, gcodec.pltype);
2011 EXPECT_STREQ("ISAC", gcodec.plname);
2012 EXPECT_TRUE(voe_.GetVAD(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002013 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2014 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002015 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002016}
2017
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002018// Test that we only apply VAD if we have a CN codec that matches the
2019// send codec clockrate.
2020TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002021 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002023 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002024 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002025 parameters.codecs.push_back(kIsacCodec);
2026 parameters.codecs.push_back(kCn16000Codec);
2027 parameters.codecs[1].id = 97;
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_STREQ("ISAC", gcodec.plname);
2032 EXPECT_TRUE(voe_.GetVAD(channel_num));
2033 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2034 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002035 parameters.codecs[0] = kPcmuCodec;
2036 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002037 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2038 EXPECT_STREQ("PCMU", gcodec.plname);
2039 EXPECT_FALSE(voe_.GetVAD(channel_num));
2040 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002041 parameters.codecs[1] = kCn8000Codec;
2042 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002043 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2044 EXPECT_STREQ("PCMU", gcodec.plname);
2045 EXPECT_TRUE(voe_.GetVAD(channel_num));
2046 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002047 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002048 parameters.codecs[0] = kIsacCodec;
2049 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002050 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2051 EXPECT_STREQ("ISAC", gcodec.plname);
2052 EXPECT_FALSE(voe_.GetVAD(channel_num));
2053}
2054
2055// Test that we perform case-insensitive matching of codec names.
2056TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
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(kIsacCodec);
2061 parameters.codecs.push_back(kPcmuCodec);
2062 parameters.codecs.push_back(kCn16000Codec);
2063 parameters.codecs.push_back(kCn8000Codec);
2064 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002065 parameters.codecs[0].name = "iSaC";
2066 parameters.codecs[0].id = 96;
2067 parameters.codecs[2].id = 97; // wideband CN
2068 parameters.codecs[4].id = 98; // DTMF
2069 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070 webrtc::CodecInst gcodec;
2071 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2072 EXPECT_EQ(96, gcodec.pltype);
2073 EXPECT_STREQ("ISAC", gcodec.plname);
2074 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002075 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2076 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002077 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002078}
2079
stefanba4c0e42016-02-04 04:12:24 -08002080class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2081 public:
2082 WebRtcVoiceEngineWithSendSideBweTest()
2083 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2084};
2085
2086TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2087 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002088 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002089 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002090 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2091 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2092 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002093 extension.id);
2094 return;
2095 }
2096 }
2097 FAIL() << "Transport sequence number extension not in header-extension list.";
2098}
2099
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002100// Test support for audio level header extension.
2101TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002102 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002103}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002104TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002105 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002106}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002107
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002108// Test support for absolute send time header extension.
2109TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002110 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002111}
2112TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002113 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114}
2115
solenberg1ac56142015-10-13 03:58:19 -07002116// Test that we can create a channel and start sending on it.
2117TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002118 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002119 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002120 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002121 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002122 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002123 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2124}
2125
2126// Test that a channel will send if and only if it has a source and is enabled
2127// for sending.
2128TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002129 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002130 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2131 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002132 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002133 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2134 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2135 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2136 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2137 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002138}
2139
solenberg94218532016-06-16 10:53:22 -07002140// Test that a channel is muted/unmuted.
2141TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2142 EXPECT_TRUE(SetupSendStream());
2143 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2144 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2145 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2146 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2147 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2148 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2149}
2150
solenberg6d6e7c52016-04-13 09:07:30 -07002151// Test that SetSendParameters() does not alter a stream's send state.
2152TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2153 EXPECT_TRUE(SetupSendStream());
2154 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2155
2156 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002157 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002158 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2159
2160 // Changing RTP header extensions will recreate the AudioSendStream.
2161 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002162 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002163 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2164 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2165
2166 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002167 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002168 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2169
2170 // Changing RTP header extensions will recreate the AudioSendStream.
2171 send_parameters_.extensions.clear();
2172 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2173 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2174}
2175
solenberg1ac56142015-10-13 03:58:19 -07002176// Test that we can create a channel and start playing out on it.
2177TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002178 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002179 int channel_num = voe_.GetLastChannel();
2180 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2181 EXPECT_TRUE(channel_->SetPlayout(true));
2182 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183 EXPECT_TRUE(channel_->SetPlayout(false));
2184 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2185}
2186
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002187// Test that we can add and remove send streams.
2188TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2189 SetupForMultiSendStream();
2190
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002191 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002192 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002193
solenbergc96df772015-10-21 13:01:53 -07002194 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002195 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002196 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002197 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002198 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002199 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002200 }
tfarina5237aaf2015-11-10 23:44:30 -08002201 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002202
solenbergc96df772015-10-21 13:01:53 -07002203 // Delete the send streams.
2204 for (uint32_t ssrc : kSsrcs4) {
2205 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002206 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002207 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002208 }
solenbergc96df772015-10-21 13:01:53 -07002209 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002210}
2211
2212// Test SetSendCodecs correctly configure the codecs in all send streams.
2213TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2214 SetupForMultiSendStream();
2215
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002216 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002217 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002218 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002219 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002220 }
2221
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002222 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002223 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002224 parameters.codecs.push_back(kIsacCodec);
2225 parameters.codecs.push_back(kCn16000Codec);
2226 parameters.codecs[1].id = 97;
2227 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002228
2229 // Verify ISAC and VAD are corrected configured on all send channels.
2230 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002231 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002232 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002233 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2234 EXPECT_STREQ("ISAC", gcodec.plname);
2235 EXPECT_TRUE(voe_.GetVAD(channel_num));
2236 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2237 }
2238
2239 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002240 parameters.codecs[0] = kPcmuCodec;
2241 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002242 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002243 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002244 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2245 EXPECT_STREQ("PCMU", gcodec.plname);
2246 EXPECT_FALSE(voe_.GetVAD(channel_num));
2247 }
2248}
2249
2250// Test we can SetSend on all send streams correctly.
2251TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2252 SetupForMultiSendStream();
2253
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002254 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002255 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002256 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002257 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002258 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2259 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002260 }
2261
2262 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002263 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002264 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002265 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002266 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002267 }
2268
2269 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002270 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002271 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002272 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002273 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002274 }
2275}
2276
2277// Test we can set the correct statistics on all send streams.
2278TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2279 SetupForMultiSendStream();
2280
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002281 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002282 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002283 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002284 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002285 }
solenberg85a04962015-10-27 03:35:21 -07002286
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002287 // Create a receive stream to check that none of the send streams end up in
2288 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002289 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002290
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002291 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002292 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2293 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002294 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002295
solenberg85a04962015-10-27 03:35:21 -07002296 // Check stats for the added streams.
2297 {
2298 cricket::VoiceMediaInfo info;
2299 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002300
solenberg85a04962015-10-27 03:35:21 -07002301 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002302 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002303 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002304 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002305 }
2306
2307 // We have added one receive stream. We should see empty stats.
2308 EXPECT_EQ(info.receivers.size(), 1u);
2309 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002310 }
solenberg1ac56142015-10-13 03:58:19 -07002311
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002312 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002313 {
2314 cricket::VoiceMediaInfo info;
2315 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2316 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002317 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002318 EXPECT_EQ(0u, info.receivers.size());
2319 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002320
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002321 // Deliver a new packet - a default receive stream should be created and we
2322 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002323 {
2324 cricket::VoiceMediaInfo info;
2325 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2326 SetAudioReceiveStreamStats();
2327 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002328 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002329 EXPECT_EQ(1u, info.receivers.size());
2330 VerifyVoiceReceiverInfo(info.receivers[0]);
2331 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002332}
2333
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002334// Test that we can add and remove receive streams, and do proper send/playout.
2335// We can receive on multiple streams while sending one stream.
2336TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002337 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338 int channel_num1 = voe_.GetLastChannel();
2339
solenberg1ac56142015-10-13 03:58:19 -07002340 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002341 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002343 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344
solenberg1ac56142015-10-13 03:58:19 -07002345 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002346 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347 int channel_num2 = voe_.GetLastChannel();
solenbergd53a3f92016-04-14 13:56:37 -07002348 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002349 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350
solenberg1ac56142015-10-13 03:58:19 -07002351 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2353 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2354
2355 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002356 EXPECT_TRUE(AddRecvStream(kSsrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357 int channel_num3 = voe_.GetLastChannel();
2358 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2359 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2360 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361
2362 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002363 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002364 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365
2366 // Stop playout.
2367 EXPECT_TRUE(channel_->SetPlayout(false));
2368 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2369 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2370 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2371
solenberg1ac56142015-10-13 03:58:19 -07002372 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 EXPECT_TRUE(channel_->SetPlayout(true));
2374 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2375 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2376 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2377
solenberg1ac56142015-10-13 03:58:19 -07002378 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2380 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002381 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002382}
2383
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002385// and start sending on it.
2386TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002387 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002388 cricket::AudioOptions options_adjust_agc;
2389 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390 webrtc::AgcConfig agc_config;
2391 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2392 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002393 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002394 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002395 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002396 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2398 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002399 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002400 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002401 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002402}
2403
wu@webrtc.org97077a32013-10-25 21:18:33 +00002404TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002405 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002406 EXPECT_CALL(adm_,
2407 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002408 webrtc::AgcConfig agc_config;
2409 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2410 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002411 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2412 send_parameters_.options.tx_agc_digital_compression_gain =
2413 rtc::Optional<uint16_t>(9);
2414 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2415 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2416 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002417 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2418 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2419 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2420 EXPECT_TRUE(agc_config.limiterEnable);
2421
2422 // Check interaction with adjust_agc_delta. Both should be respected, for
2423 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002424 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2425 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002426 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2427 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2428}
2429
wu@webrtc.org97077a32013-10-25 21:18:33 +00002430TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002431 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002432 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2433 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002434 send_parameters_.options.recording_sample_rate =
2435 rtc::Optional<uint32_t>(48000);
2436 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2437 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002438}
2439
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002441// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002443 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002444 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002445}
2446
2447TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2448 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002449 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002450 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002451 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002452 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002453 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2454 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002455 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002456
solenberg85a04962015-10-27 03:35:21 -07002457 // Check stats for the added streams.
2458 {
2459 cricket::VoiceMediaInfo info;
2460 EXPECT_EQ(true, channel_->GetStats(&info));
2461
2462 // We have added one send stream. We should see the stats we've set.
2463 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002464 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002465 // We have added one receive stream. We should see empty stats.
2466 EXPECT_EQ(info.receivers.size(), 1u);
2467 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2468 }
solenberg1ac56142015-10-13 03:58:19 -07002469
solenberg566ef242015-11-06 15:34:49 -08002470 // Start sending - this affects some reported stats.
2471 {
2472 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002473 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002474 EXPECT_EQ(true, channel_->GetStats(&info));
2475 VerifyVoiceSenderInfo(info.senders[0], true);
2476 }
2477
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002478 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002479 {
2480 cricket::VoiceMediaInfo info;
2481 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2482 EXPECT_EQ(true, channel_->GetStats(&info));
2483 EXPECT_EQ(1u, info.senders.size());
2484 EXPECT_EQ(0u, info.receivers.size());
2485 }
solenberg1ac56142015-10-13 03:58:19 -07002486
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002487 // Deliver a new packet - a default receive stream should be created and we
2488 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002489 {
2490 cricket::VoiceMediaInfo info;
2491 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2492 SetAudioReceiveStreamStats();
2493 EXPECT_EQ(true, channel_->GetStats(&info));
2494 EXPECT_EQ(1u, info.senders.size());
2495 EXPECT_EQ(1u, info.receivers.size());
2496 VerifyVoiceReceiverInfo(info.receivers[0]);
2497 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498}
2499
2500// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002501// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002502TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002503 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002504 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002505 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002506 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507}
2508
2509// Test that the local SSRC is the same on sending and receiving channels if the
2510// receive channel is created before the send channel.
2511TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002512 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002513 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002515 cricket::StreamParams::CreateLegacy(kSsrc1)));
2516 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2517 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518}
2519
2520// Test that we can properly receive packets.
2521TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002522 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002523 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002525
2526 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2527 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528}
2529
2530// Test that we can properly receive packets on multiple streams.
2531TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002532 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002533 const uint32_t ssrc1 = 1;
2534 const uint32_t ssrc2 = 2;
2535 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002536 EXPECT_TRUE(AddRecvStream(ssrc1));
2537 EXPECT_TRUE(AddRecvStream(ssrc2));
2538 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002540 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002541 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002542 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002543 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 }
mflodman3d7db262016-04-29 00:57:13 -07002545
2546 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2547 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2548 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2549
2550 EXPECT_EQ(s1.received_packets(), 0);
2551 EXPECT_EQ(s2.received_packets(), 0);
2552 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002553
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002554 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002555 EXPECT_EQ(s1.received_packets(), 0);
2556 EXPECT_EQ(s2.received_packets(), 0);
2557 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002558
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002560 EXPECT_EQ(s1.received_packets(), 1);
2561 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2562 EXPECT_EQ(s2.received_packets(), 0);
2563 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002564
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002565 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002566 EXPECT_EQ(s1.received_packets(), 1);
2567 EXPECT_EQ(s2.received_packets(), 1);
2568 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2569 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002570
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002572 EXPECT_EQ(s1.received_packets(), 1);
2573 EXPECT_EQ(s2.received_packets(), 1);
2574 EXPECT_EQ(s3.received_packets(), 1);
2575 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002576
mflodman3d7db262016-04-29 00:57:13 -07002577 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2578 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2579 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580}
2581
solenberg7e63ef02015-11-20 00:19:43 -08002582// Test that receiving on an unsignalled stream works (default channel will be
2583// created).
2584TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002585 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002586 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2587
solenberg7e63ef02015-11-20 00:19:43 -08002588 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002589
2590 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2591 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2592 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002593}
2594
2595// Test that receiving on an unsignalled stream works (default channel will be
2596// created), and that packets will be forwarded to the default channel
2597// regardless of their SSRCs.
2598TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002599 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002600 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002601 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2602
mflodman3d7db262016-04-29 00:57:13 -07002603 // Note that ssrc = 0 is not supported.
2604 uint32_t ssrc = 1;
2605 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002606 rtc::SetBE32(&packet[8], ssrc);
2607 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002608
2609 // Verify we only have one default stream.
2610 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2611 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2612 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002613 }
mflodman3d7db262016-04-29 00:57:13 -07002614
2615 // Sending the same ssrc again should not create a new stream.
2616 --ssrc;
2617 DeliverPacket(packet, sizeof(packet));
2618 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2619 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2620 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002621}
2622
2623// Test that a default channel is created even after a signalled stream has been
2624// added, and that this stream will get any packets for unknown SSRCs.
2625TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002626 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002627 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002628 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2629
2630 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002631 const uint32_t signaled_ssrc = 1;
2632 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002633 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002634 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002635 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2636 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002637
2638 // Note that the first unknown SSRC cannot be 0, because we only support
2639 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002640 const uint32_t unsignaled_ssrc = 7011;
2641 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002642 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002643 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2644 packet, sizeof(packet)));
2645 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2646
2647 DeliverPacket(packet, sizeof(packet));
2648 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2649
2650 rtc::SetBE32(&packet[8], signaled_ssrc);
2651 DeliverPacket(packet, sizeof(packet));
2652 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2653 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002654}
2655
solenberg0a617e22015-10-20 15:49:38 -07002656// Test that we properly handle failures to add a receive stream.
2657TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002658 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002659 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002660 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661}
2662
solenberg0a617e22015-10-20 15:49:38 -07002663// Test that we properly handle failures to add a send stream.
2664TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002665 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002666 voe_.set_fail_create_channel(true);
2667 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2668}
2669
solenberg1ac56142015-10-13 03:58:19 -07002670// Test that AddRecvStream creates new stream.
2671TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002672 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002674 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002675 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676}
2677
2678// Test that after adding a recv stream, we do not decode more codecs than
2679// those previously passed into SetRecvCodecs.
2680TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002681 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002682 cricket::AudioRecvParameters parameters;
2683 parameters.codecs.push_back(kIsacCodec);
2684 parameters.codecs.push_back(kPcmuCodec);
2685 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002686 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687 int channel_num2 = voe_.GetLastChannel();
2688 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002689 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002690 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002691 gcodec.channels = 2;
2692 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2693}
2694
2695// Test that we properly clean up any streams that were added, even if
2696// not explicitly removed.
2697TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002698 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002699 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8189b022016-06-14 12:13:00 -07002700 EXPECT_TRUE(AddRecvStream(1));
2701 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2703 delete channel_;
2704 channel_ = NULL;
2705 EXPECT_EQ(0, voe_.GetNumChannels());
2706}
2707
wu@webrtc.org78187522013-10-07 23:32:02 +00002708TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002709 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002710 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002711}
2712
2713TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002714 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002715 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002716 // Manually delete channel to simulate a failure.
2717 int channel = voe_.GetLastChannel();
2718 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2719 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002720 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002721 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002722 EXPECT_NE(channel, new_channel);
2723 // The last created channel is deleted too.
2724 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002725}
2726
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002727// Test the InsertDtmf on default send stream as caller.
2728TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2729 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002730}
2731
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002732// Test the InsertDtmf on default send stream as callee
2733TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2734 TestInsertDtmf(0, false);
2735}
2736
2737// Test the InsertDtmf on specified send stream as caller.
2738TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2739 TestInsertDtmf(kSsrc1, true);
2740}
2741
2742// Test the InsertDtmf on specified send stream as callee.
2743TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2744 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745}
2746
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002748 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002749 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002750 SetSend(channel_, true);
solenberg8189b022016-06-14 12:13:00 -07002751 EXPECT_TRUE(AddRecvStream(2));
2752 EXPECT_TRUE(AddRecvStream(3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002753 EXPECT_TRUE(channel_->SetPlayout(true));
2754 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2755 EXPECT_TRUE(channel_->SetPlayout(false));
2756 EXPECT_FALSE(channel_->SetPlayout(true));
2757}
2758
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002759TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002760 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002761 EXPECT_CALL(adm_,
2762 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2763 EXPECT_CALL(adm_,
2764 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2765 EXPECT_CALL(adm_,
2766 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767 bool ec_enabled;
2768 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769 webrtc::AecmModes aecm_mode;
2770 bool cng_enabled;
2771 bool agc_enabled;
2772 webrtc::AgcModes agc_mode;
2773 webrtc::AgcConfig agc_config;
2774 bool ns_enabled;
2775 webrtc::NsModes ns_mode;
2776 bool highpass_filter_enabled;
2777 bool stereo_swapping_enabled;
2778 bool typing_detection_enabled;
2779 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 voe_.GetAecmMode(aecm_mode, cng_enabled);
2781 voe_.GetAgcStatus(agc_enabled, agc_mode);
2782 voe_.GetAgcConfig(agc_config);
2783 voe_.GetNsStatus(ns_enabled, ns_mode);
2784 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2785 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2786 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2787 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002788 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789 EXPECT_FALSE(cng_enabled);
2790 EXPECT_TRUE(agc_enabled);
2791 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2792 EXPECT_TRUE(ns_enabled);
2793 EXPECT_TRUE(highpass_filter_enabled);
2794 EXPECT_FALSE(stereo_swapping_enabled);
2795 EXPECT_TRUE(typing_detection_enabled);
2796 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2797 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002798 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2799 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800
solenberg246b8172015-12-08 09:50:23 -08002801 // Nothing set in AudioOptions, so everything should be as default.
2802 send_parameters_.options = cricket::AudioOptions();
2803 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002805 voe_.GetAecmMode(aecm_mode, cng_enabled);
2806 voe_.GetAgcStatus(agc_enabled, agc_mode);
2807 voe_.GetAgcConfig(agc_config);
2808 voe_.GetNsStatus(ns_enabled, ns_mode);
2809 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2810 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2811 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2812 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002813 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814 EXPECT_FALSE(cng_enabled);
2815 EXPECT_TRUE(agc_enabled);
2816 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2817 EXPECT_TRUE(ns_enabled);
2818 EXPECT_TRUE(highpass_filter_enabled);
2819 EXPECT_FALSE(stereo_swapping_enabled);
2820 EXPECT_TRUE(typing_detection_enabled);
2821 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2822 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002823 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2824 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002825
2826 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002827 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2828 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002829 voe_.GetEcStatus(ec_enabled, ec_mode);
2830 EXPECT_FALSE(ec_enabled);
2831
2832 // Turn echo cancellation back on, with settings, and make sure
2833 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002834 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2835 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002836 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002837 voe_.GetAecmMode(aecm_mode, cng_enabled);
2838 voe_.GetAgcStatus(agc_enabled, agc_mode);
2839 voe_.GetAgcConfig(agc_config);
2840 voe_.GetNsStatus(ns_enabled, ns_mode);
2841 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2842 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2843 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2844 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002845 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002846 EXPECT_TRUE(agc_enabled);
2847 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2848 EXPECT_TRUE(ns_enabled);
2849 EXPECT_TRUE(highpass_filter_enabled);
2850 EXPECT_FALSE(stereo_swapping_enabled);
2851 EXPECT_TRUE(typing_detection_enabled);
2852 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2853 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2854
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002855 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2856 // control.
solenberg246b8172015-12-08 09:50:23 -08002857 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2858 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002859 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002860 voe_.GetAecmMode(aecm_mode, cng_enabled);
2861 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002862 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002863 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2864
2865 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002866 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2867 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2868 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2869 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002870 voe_.GetEcStatus(ec_enabled, ec_mode);
2871 EXPECT_FALSE(ec_enabled);
2872 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002873 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2874 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002875 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002876 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002877 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002878 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2879
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002880 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002881 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2882 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002883 voe_.GetAgcStatus(agc_enabled, agc_mode);
2884 EXPECT_FALSE(agc_enabled);
2885
2886 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002887 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2888 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2889 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002890 voe_.GetAgcStatus(agc_enabled, agc_mode);
2891 EXPECT_TRUE(agc_enabled);
2892 voe_.GetAgcConfig(agc_config);
2893 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2894
2895 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002896 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2897 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2898 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2899 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2900 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002901 voe_.GetNsStatus(ns_enabled, ns_mode);
2902 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2903 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2904 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2905 EXPECT_FALSE(ns_enabled);
2906 EXPECT_FALSE(highpass_filter_enabled);
2907 EXPECT_FALSE(typing_detection_enabled);
2908 EXPECT_TRUE(stereo_swapping_enabled);
2909
solenberg1ac56142015-10-13 03:58:19 -07002910 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002911 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002912 voe_.GetEcStatus(ec_enabled, ec_mode);
2913 voe_.GetNsStatus(ns_enabled, ns_mode);
2914 EXPECT_TRUE(ec_enabled);
2915 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2916 EXPECT_FALSE(ns_enabled);
2917 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2918}
2919
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002920TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002921 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002922
2923 bool ec_enabled;
2924 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002925 bool agc_enabled;
2926 webrtc::AgcModes agc_mode;
2927 bool ns_enabled;
2928 webrtc::NsModes ns_mode;
2929 bool highpass_filter_enabled;
2930 bool stereo_swapping_enabled;
2931 bool typing_detection_enabled;
2932
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002934 voe_.GetAgcStatus(agc_enabled, agc_mode);
2935 voe_.GetNsStatus(ns_enabled, ns_mode);
2936 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2937 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2938 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2939 EXPECT_TRUE(ec_enabled);
2940 EXPECT_TRUE(agc_enabled);
2941 EXPECT_TRUE(ns_enabled);
2942 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002943 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002945}
2946
2947TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2948 webrtc::AgcConfig set_config = {0};
2949 set_config.targetLeveldBOv = 3;
2950 set_config.digitalCompressionGaindB = 9;
2951 set_config.limiterEnable = true;
2952 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953
2954 webrtc::AgcConfig config = {0};
2955 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2956 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2957 EXPECT_EQ(set_config.digitalCompressionGaindB,
2958 config.digitalCompressionGaindB);
2959 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2960}
2961
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002962TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002963 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002964 EXPECT_CALL(adm_,
2965 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2966 EXPECT_CALL(adm_,
2967 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2968 EXPECT_CALL(adm_,
2969 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2970
kwiberg686a8ef2016-02-26 03:00:35 -08002971 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002972 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002973 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002974 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002975 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002976 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002977
2978 // Have to add a stream to make SetSend work.
2979 cricket::StreamParams stream1;
2980 stream1.ssrcs.push_back(1);
2981 channel1->AddSendStream(stream1);
2982 cricket::StreamParams stream2;
2983 stream2.ssrcs.push_back(2);
2984 channel2->AddSendStream(stream2);
2985
2986 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002987 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002988 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2989 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2990 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002991 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2992 EXPECT_EQ(parameters_options_all.options, channel1->options());
2993 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2994 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995
2996 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002997 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002998 parameters_options_no_ns.options.noise_suppression =
2999 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003000 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
3001 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003002 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3003 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3004 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003005 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003006
3007 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003008 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003009 parameters_options_no_agc.options.auto_gain_control =
3010 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003011 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003012 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3013 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3014 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003015 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003016
solenberg246b8172015-12-08 09:50:23 -08003017 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018 bool ec_enabled;
3019 webrtc::EcModes ec_mode;
3020 bool agc_enabled;
3021 webrtc::AgcModes agc_mode;
3022 bool ns_enabled;
3023 webrtc::NsModes ns_mode;
3024 voe_.GetEcStatus(ec_enabled, ec_mode);
3025 voe_.GetAgcStatus(agc_enabled, agc_mode);
3026 voe_.GetNsStatus(ns_enabled, ns_mode);
3027 EXPECT_TRUE(ec_enabled);
3028 EXPECT_TRUE(agc_enabled);
3029 EXPECT_TRUE(ns_enabled);
3030
solenbergd53a3f92016-04-14 13:56:37 -07003031 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003032 voe_.GetEcStatus(ec_enabled, ec_mode);
3033 voe_.GetAgcStatus(agc_enabled, agc_mode);
3034 voe_.GetNsStatus(ns_enabled, ns_mode);
3035 EXPECT_TRUE(ec_enabled);
3036 EXPECT_TRUE(agc_enabled);
3037 EXPECT_FALSE(ns_enabled);
3038
solenbergd53a3f92016-04-14 13:56:37 -07003039 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003040 voe_.GetEcStatus(ec_enabled, ec_mode);
3041 voe_.GetAgcStatus(agc_enabled, agc_mode);
3042 voe_.GetNsStatus(ns_enabled, ns_mode);
3043 EXPECT_TRUE(ec_enabled);
3044 EXPECT_FALSE(agc_enabled);
3045 EXPECT_TRUE(ns_enabled);
3046
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003047 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003048 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003049 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3050 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003051 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003052 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003053 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003054 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003055 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003056 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003057 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3058 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3059 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003060 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003061 voe_.GetEcStatus(ec_enabled, ec_mode);
3062 voe_.GetAgcStatus(agc_enabled, agc_mode);
3063 voe_.GetNsStatus(ns_enabled, ns_mode);
3064 EXPECT_TRUE(ec_enabled);
3065 EXPECT_FALSE(agc_enabled);
3066 EXPECT_FALSE(ns_enabled);
3067}
3068
wu@webrtc.orgde305012013-10-31 15:40:38 +00003069// This test verifies DSCP settings are properly applied on voice media channel.
3070TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003071 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003072 cricket::FakeNetworkInterface network_interface;
3073 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003074 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003075
solenbergbc37fc82016-04-04 09:54:44 -07003076 channel.reset(
3077 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003078 channel->SetInterface(&network_interface);
3079 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3080 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3081
3082 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003083 channel.reset(
3084 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003085 channel->SetInterface(&network_interface);
3086 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3087
3088 // Verify that setting the option to false resets the
3089 // DiffServCodePoint.
3090 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003091 channel.reset(
3092 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003093 channel->SetInterface(&network_interface);
3094 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3095 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3096
3097 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003098}
3099
solenberg1ac56142015-10-13 03:58:19 -07003100TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003101 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003102 cricket::WebRtcVoiceMediaChannel* media_channel =
3103 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003104 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003105 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003106 int channel_id = voe_.GetLastChannel();
3107 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3108 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003109 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003110 int channel_id2 = voe_.GetLastChannel();
3111 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003112}
3113
solenberg1ac56142015-10-13 03:58:19 -07003114TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003115 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003116 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003117 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3118 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3119 EXPECT_TRUE(channel_->AddSendStream(
3120 cricket::StreamParams::CreateLegacy(kSsrc1)));
3121 int channel_id = voe_.GetLastChannel();
3122 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3123 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3124 EXPECT_TRUE(channel_->AddSendStream(
3125 cricket::StreamParams::CreateLegacy(kSsrc2)));
3126 int channel_id2 = voe_.GetLastChannel();
3127 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128}
3129
solenberg4bac9c52015-10-09 02:32:53 -07003130TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003131 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003132 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003133 cricket::StreamParams stream;
3134 stream.ssrcs.push_back(kSsrc2);
3135 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003136 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003137 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003138 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003139}
3140
3141TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003142 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003143 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3144 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003145 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003146 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003147 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3148 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3149 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003150}
3151
pbos8fc7fa72015-07-15 08:02:58 -07003152TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003153 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003154 const std::string kSyncLabel = "AvSyncLabel";
3155
solenbergff976312016-03-30 23:28:51 -07003156 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003157 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3158 sp.sync_label = kSyncLabel;
3159 // Creating two channels to make sure that sync label is set properly for both
3160 // the default voice channel and following ones.
3161 EXPECT_TRUE(channel_->AddRecvStream(sp));
3162 sp.ssrcs[0] += 1;
3163 EXPECT_TRUE(channel_->AddRecvStream(sp));
3164
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003165 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003166 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003167 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003168 << "SyncGroup should be set based on sync_label";
3169 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003170 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003171 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003172}
3173
solenberg3a941542015-11-16 07:34:50 -08003174// TODO(solenberg): Remove, once recv streams are configured through Call.
3175// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003176TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003177 // Test that setting the header extensions results in the expected state
3178 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003179 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003180 ssrcs.push_back(223);
3181 ssrcs.push_back(224);
3182
solenbergff976312016-03-30 23:28:51 -07003183 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003184 cricket::WebRtcVoiceMediaChannel* media_channel =
3185 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003186 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003187 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003188 EXPECT_TRUE(media_channel->AddRecvStream(
3189 cricket::StreamParams::CreateLegacy(ssrc)));
3190 }
3191
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003192 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003193 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003194 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003195 EXPECT_NE(nullptr, s);
3196 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3197 }
3198
3199 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003200 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003201 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003202 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003203 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003204 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003205 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003206 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003207 EXPECT_NE(nullptr, s);
3208 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003209 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3210 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003211 for (const auto& s_ext : s_exts) {
3212 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003213 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003214 }
3215 }
3216 }
3217 }
3218
3219 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003220 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003221 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003222 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003223 EXPECT_NE(nullptr, s);
3224 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3225 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003226}
3227
3228TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3229 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003230 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003231 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003232 static const unsigned char kRtcp[] = {
3233 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3234 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3237 };
jbaucheec21bd2016-03-20 06:15:43 -07003238 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003239
solenbergff976312016-03-30 23:28:51 -07003240 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003241 cricket::WebRtcVoiceMediaChannel* media_channel =
3242 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003243 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003244 EXPECT_TRUE(media_channel->AddRecvStream(
3245 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3246
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003247 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003248 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003249 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003250 EXPECT_EQ(0, s->received_packets());
3251 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3252 EXPECT_EQ(1, s->received_packets());
3253 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3254 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003255}
Minyue2013aec2015-05-13 14:14:42 +02003256
solenberg0a617e22015-10-20 15:49:38 -07003257// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003258// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003259TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003260 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003261 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003262 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003263 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003264 int recv_ch = voe_.GetLastChannel();
3265 EXPECT_NE(recv_ch, default_channel);
3266 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3267 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3268 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003269 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003270 recv_ch = voe_.GetLastChannel();
3271 EXPECT_NE(recv_ch, default_channel);
3272 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003273}
3274
3275TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003276 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003277 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003278
solenberg8189b022016-06-14 12:13:00 -07003279 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003280 int recv_ch = voe_.GetLastChannel();
3281
3282 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3283 int send_ch = voe_.GetLastChannel();
3284
3285 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3286 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3287 // channel of |recv_ch|.This is not a common case, since, normally, only the
3288 // default channel can be associated. However, the default is not deletable.
3289 // So we force the |recv_ch| to associate with a non-default channel.
3290 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3291 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3292
3293 EXPECT_TRUE(channel_->RemoveSendStream(2));
3294 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3295}
stefan658910c2015-09-03 05:48:32 -07003296
deadbeef884f5852016-01-15 09:20:04 -08003297TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003298 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003299 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3300 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003301
3302 // Setting the sink before a recv stream exists should do nothing.
3303 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003304 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003305 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3306
3307 // Now try actually setting the sink.
3308 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3309 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3310
3311 // Now try resetting it.
3312 channel_->SetRawAudioSink(kSsrc1, nullptr);
3313 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3314}
3315
3316TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003317 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003318 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3319 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003320
3321 // Should be able to set a default sink even when no stream exists.
3322 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3323
3324 // Create default channel and ensure it's assigned the default sink.
3325 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3326 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3327
3328 // Try resetting the default sink.
3329 channel_->SetRawAudioSink(0, nullptr);
3330 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3331
3332 // Try setting the default sink while the default stream exists.
3333 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3334 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3335
3336 // If we remove and add a default stream, it should get the same sink.
3337 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3338 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3339 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3340}
3341
skvlad7a43d252016-03-22 15:32:27 -07003342// Test that, just like the video channel, the voice channel communicates the
3343// network state to the call.
3344TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003345 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003346
3347 EXPECT_EQ(webrtc::kNetworkUp,
3348 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3349 EXPECT_EQ(webrtc::kNetworkUp,
3350 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3351
3352 channel_->OnReadyToSend(false);
3353 EXPECT_EQ(webrtc::kNetworkDown,
3354 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3355 EXPECT_EQ(webrtc::kNetworkUp,
3356 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3357
3358 channel_->OnReadyToSend(true);
3359 EXPECT_EQ(webrtc::kNetworkUp,
3360 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3361 EXPECT_EQ(webrtc::kNetworkUp,
3362 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3363}
3364
stefan658910c2015-09-03 05:48:32 -07003365// Tests that the library initializes and shuts down properly.
3366TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003367 // If the VoiceEngine wants to gather available codecs early, that's fine but
3368 // we never want it to create a decoder at this stage.
ossu95eb1ba2016-07-13 06:05:27 -07003369 cricket::WebRtcVoiceEngine engine(
3370 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003371 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003372 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003373 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3374 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003375 EXPECT_TRUE(channel != nullptr);
3376 delete channel;
solenbergff976312016-03-30 23:28:51 -07003377}
stefan658910c2015-09-03 05:48:32 -07003378
solenbergff976312016-03-30 23:28:51 -07003379// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003380TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3381 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3382 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3383 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003384 {
ossu95eb1ba2016-07-13 06:05:27 -07003385 cricket::WebRtcVoiceEngine engine(
3386 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
solenbergff976312016-03-30 23:28:51 -07003387 std::unique_ptr<webrtc::Call> call(
3388 webrtc::Call::Create(webrtc::Call::Config()));
3389 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3390 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3391 EXPECT_TRUE(channel != nullptr);
3392 delete channel;
3393 }
stefan658910c2015-09-03 05:48:32 -07003394}
3395
3396// Tests that the library is configured with the codecs we want.
3397TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003398 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3399 // module.
3400
stefan658910c2015-09-03 05:48:32 -07003401 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003402 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003403 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003404 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003405 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003406 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003407 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003408 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003409 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003410 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003411 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003412 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003413 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003414 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003415 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003416 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003417 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003418 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003419 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003420 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003421 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003422 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003423 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003424 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003425 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003426 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003427 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003428 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003429 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003430 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003431 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003432 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003433 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003434 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003435 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003436 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003437 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003438 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003439 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003440 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003441 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003442 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003443 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003444 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003445 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003446 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003447 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003448 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003449 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003450
stefan658910c2015-09-03 05:48:32 -07003451 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossu95eb1ba2016-07-13 06:05:27 -07003452 // TODO(ossu): Why are the payload types of codecs with non-static payload
3453 // type assignments checked here? It shouldn't really matter.
3454 cricket::WebRtcVoiceEngine engine(
3455 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
stefan658910c2015-09-03 05:48:32 -07003456 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossu95eb1ba2016-07-13 06:05:27 -07003457 engine.send_codecs().begin();
3458 it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003459 if (it->name == "CN" && it->clockrate == 16000) {
3460 EXPECT_EQ(105, it->id);
3461 } else if (it->name == "CN" && it->clockrate == 32000) {
3462 EXPECT_EQ(106, it->id);
3463 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3464 EXPECT_EQ(103, it->id);
3465 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3466 EXPECT_EQ(104, it->id);
3467 } else if (it->name == "G722" && it->clockrate == 8000) {
3468 EXPECT_EQ(9, it->id);
3469 } else if (it->name == "telephone-event") {
3470 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003471 } else if (it->name == "opus") {
3472 EXPECT_EQ(111, it->id);
3473 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3474 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003475 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3476 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3477 }
3478 }
stefan658910c2015-09-03 05:48:32 -07003479}
3480
3481// Tests that VoE supports at least 32 channels
3482TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossu95eb1ba2016-07-13 06:05:27 -07003483 cricket::WebRtcVoiceEngine engine(
3484 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003485 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003486 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003487
3488 cricket::VoiceMediaChannel* channels[32];
3489 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003490 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003491 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3492 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003493 if (!channel)
3494 break;
stefan658910c2015-09-03 05:48:32 -07003495 channels[num_channels++] = channel;
3496 }
3497
tfarina5237aaf2015-11-10 23:44:30 -08003498 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003499 EXPECT_EQ(expected, num_channels);
3500
3501 while (num_channels > 0) {
3502 delete channels[--num_channels];
3503 }
stefan658910c2015-09-03 05:48:32 -07003504}
3505
3506// Test that we set our preferred codecs properly.
3507TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003508 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3509 // - Check that our builtin codecs are usable by Channel.
3510 // - The codecs provided by the engine is usable by Channel.
3511 // It does not check that the codecs in the RecvParameters are actually
3512 // what we sent in - though it's probably reasonable to expect so, if
3513 // SetRecvParameters returns true.
3514 // I think it will become clear once audio decoder injection is completed.
3515 cricket::WebRtcVoiceEngine engine(
3516 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003517 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003518 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003519 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3520 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003521 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003522 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003523 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003524}