blob: 8be3b9d2497fa463d79915ee4bd37508e2d807b7 [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 {
ossuc54071d2016-08-17 02:45:41 -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) {
ossuc54071d2016-08-17 02:45:41 -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));
ossuc54071d2016-08-17 02:45:41 -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;
henrik.lundin63489782016-09-20 01:47:12 -0700453 stats.decoding_muted_output = 3456;
454 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200455 return stats;
456 }
457 void SetAudioReceiveStreamStats() {
458 for (auto* s : call_.GetAudioReceiveStreams()) {
459 s->SetStats(GetAudioReceiveStreamStats());
460 }
461 }
462 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700463 const auto stats = GetAudioReceiveStreamStats();
464 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
465 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
466 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
467 EXPECT_EQ(info.packets_lost, stats.packets_lost);
468 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
469 EXPECT_EQ(info.codec_name, stats.codec_name);
470 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
471 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
472 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200473 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700474 stats.jitter_buffer_preferred_ms);
475 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
476 EXPECT_EQ(info.audio_level, stats.audio_level);
477 EXPECT_EQ(info.expand_rate, stats.expand_rate);
478 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
479 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
480 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
481 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200482 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700483 stats.decoding_calls_to_silence_generator);
484 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
485 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
486 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
487 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
488 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700489 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700490 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200491 }
492
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700494 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200495 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700497 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700498 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200499 cricket::AudioSendParameters send_parameters_;
500 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800501 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800502 private:
503 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504};
505
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506// Tests that we can create and destroy a channel.
507TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700508 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000509}
510
solenberg31fec402016-05-06 02:13:12 -0700511// Test that we can add a send stream and that it has the correct defaults.
512TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
513 EXPECT_TRUE(SetupChannel());
514 EXPECT_TRUE(
515 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
516 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
517 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
518 EXPECT_EQ("", config.rtp.c_name);
519 EXPECT_EQ(0u, config.rtp.extensions.size());
520 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
521 config.send_transport);
522}
523
524// Test that we can add a receive stream and that it has the correct defaults.
525TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
526 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700527 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700528 const webrtc::AudioReceiveStream::Config& config =
529 GetRecvStreamConfig(kSsrc1);
530 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
531 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
532 EXPECT_FALSE(config.rtp.transport_cc);
533 EXPECT_EQ(0u, config.rtp.extensions.size());
534 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
535 config.rtcp_send_transport);
536 EXPECT_EQ("", config.sync_group);
537}
538
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700540// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700541// TODO(ossu): This test should move into a separate builtin audio codecs
542// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700543TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700544 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000545 ASSERT_FALSE(codecs.empty());
546 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
547 EXPECT_EQ(48000, codecs[0].clockrate);
548 EXPECT_EQ(2, codecs[0].channels);
549 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000550}
551
stefanba4c0e42016-02-04 04:12:24 -0800552TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700553 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800554 bool opus_found = false;
555 for (cricket::AudioCodec codec : codecs) {
556 if (codec.name == "opus") {
557 EXPECT_TRUE(HasTransportCc(codec));
558 opus_found = true;
559 }
560 }
561 EXPECT_TRUE(opus_found);
562}
563
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000564// Tests that we can find codecs by name or id, and that we interpret the
565// clockrate and bitrate fields properly.
566TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
567 cricket::AudioCodec codec;
568 webrtc::CodecInst codec_inst;
569 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800570 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800572 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800574 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
575 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000576 // Find ISAC with a different payload id.
577 codec = kIsacCodec;
578 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800579 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 EXPECT_EQ(codec.id, codec_inst.pltype);
581 // Find PCMU with a 0 clockrate.
582 codec = kPcmuCodec;
583 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800584 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 EXPECT_EQ(codec.id, codec_inst.pltype);
586 EXPECT_EQ(8000, codec_inst.plfreq);
587 // Find PCMU with a 0 bitrate.
588 codec = kPcmuCodec;
589 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800590 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 EXPECT_EQ(codec.id, codec_inst.pltype);
592 EXPECT_EQ(64000, codec_inst.rate);
593 // Find ISAC with an explicit bitrate.
594 codec = kIsacCodec;
595 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800596 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 EXPECT_EQ(codec.id, codec_inst.pltype);
598 EXPECT_EQ(32000, codec_inst.rate);
599}
600
601// Test that we set our inbound codecs properly, including changing PT.
602TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700603 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200604 cricket::AudioRecvParameters parameters;
605 parameters.codecs.push_back(kIsacCodec);
606 parameters.codecs.push_back(kPcmuCodec);
607 parameters.codecs.push_back(kTelephoneEventCodec);
608 parameters.codecs[0].id = 106; // collide with existing telephone-event
609 parameters.codecs[2].id = 126;
610 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700611 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700612 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800614 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 gcodec.plfreq = 16000;
616 gcodec.channels = 1;
617 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
618 EXPECT_EQ(106, gcodec.pltype);
619 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800620 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 gcodec.plfreq = 8000;
622 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
623 EXPECT_EQ(126, gcodec.pltype);
624 EXPECT_STREQ("telephone-event", gcodec.plname);
625}
626
627// Test that we fail to set an unknown inbound codec.
628TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700629 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200630 cricket::AudioRecvParameters parameters;
631 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700632 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200633 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634}
635
636// Test that we fail if we have duplicate types in the inbound list.
637TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700638 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200639 cricket::AudioRecvParameters parameters;
640 parameters.codecs.push_back(kIsacCodec);
641 parameters.codecs.push_back(kCn16000Codec);
642 parameters.codecs[1].id = kIsacCodec.id;
643 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644}
645
646// Test that we can decode OPUS without stereo parameters.
647TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700648 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200649 cricket::AudioRecvParameters parameters;
650 parameters.codecs.push_back(kIsacCodec);
651 parameters.codecs.push_back(kPcmuCodec);
652 parameters.codecs.push_back(kOpusCodec);
653 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700654 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700655 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800657 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 // Even without stereo parameters, recv codecs still specify channels = 2.
659 EXPECT_EQ(2, opus.channels);
660 EXPECT_EQ(111, opus.pltype);
661 EXPECT_STREQ("opus", opus.plname);
662 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700663 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 EXPECT_EQ(111, opus.pltype);
665}
666
667// Test that we can decode OPUS with stereo = 0.
668TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700669 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200670 cricket::AudioRecvParameters parameters;
671 parameters.codecs.push_back(kIsacCodec);
672 parameters.codecs.push_back(kPcmuCodec);
673 parameters.codecs.push_back(kOpusCodec);
674 parameters.codecs[2].params["stereo"] = "0";
675 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700676 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 int channel_num2 = voe_.GetLastChannel();
678 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800679 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 // Even when stereo is off, recv codecs still specify channels = 2.
681 EXPECT_EQ(2, opus.channels);
682 EXPECT_EQ(111, opus.pltype);
683 EXPECT_STREQ("opus", opus.plname);
684 opus.pltype = 0;
685 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
686 EXPECT_EQ(111, opus.pltype);
687}
688
689// Test that we can decode OPUS with stereo = 1.
690TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700691 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200692 cricket::AudioRecvParameters parameters;
693 parameters.codecs.push_back(kIsacCodec);
694 parameters.codecs.push_back(kPcmuCodec);
695 parameters.codecs.push_back(kOpusCodec);
696 parameters.codecs[2].params["stereo"] = "1";
697 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700698 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 int channel_num2 = voe_.GetLastChannel();
700 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800701 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702 EXPECT_EQ(2, opus.channels);
703 EXPECT_EQ(111, opus.pltype);
704 EXPECT_STREQ("opus", opus.plname);
705 opus.pltype = 0;
706 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
707 EXPECT_EQ(111, opus.pltype);
708}
709
710// Test that changes to recv codecs are applied to all streams.
711TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700712 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200713 cricket::AudioRecvParameters parameters;
714 parameters.codecs.push_back(kIsacCodec);
715 parameters.codecs.push_back(kPcmuCodec);
716 parameters.codecs.push_back(kTelephoneEventCodec);
717 parameters.codecs[0].id = 106; // collide with existing telephone-event
718 parameters.codecs[2].id = 126;
719 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700720 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 int channel_num2 = voe_.GetLastChannel();
722 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800723 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 gcodec.plfreq = 16000;
725 gcodec.channels = 1;
726 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
727 EXPECT_EQ(106, gcodec.pltype);
728 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800729 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 gcodec.plfreq = 8000;
731 gcodec.channels = 1;
732 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
733 EXPECT_EQ(126, gcodec.pltype);
734 EXPECT_STREQ("telephone-event", gcodec.plname);
735}
736
737TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700738 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200739 cricket::AudioRecvParameters parameters;
740 parameters.codecs.push_back(kIsacCodec);
741 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200742 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743
744 int channel_num2 = voe_.GetLastChannel();
745 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800746 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 gcodec.plfreq = 16000;
748 gcodec.channels = 1;
749 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
750 EXPECT_EQ(106, gcodec.pltype);
751 EXPECT_STREQ("ISAC", gcodec.plname);
752}
753
754// Test that we can apply the same set of codecs again while playing.
755TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700756 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757 cricket::AudioRecvParameters parameters;
758 parameters.codecs.push_back(kIsacCodec);
759 parameters.codecs.push_back(kCn16000Codec);
760 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700761 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200762 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763
764 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200765 parameters.codecs[0].id = 127;
766 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700767 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768}
769
770// Test that we can add a codec while playing.
771TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700772 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200773 cricket::AudioRecvParameters parameters;
774 parameters.codecs.push_back(kIsacCodec);
775 parameters.codecs.push_back(kCn16000Codec);
776 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700777 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200779 parameters.codecs.push_back(kOpusCodec);
780 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700781 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782 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 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002180 channel_->SetPlayout(true);
2181 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2182 channel_->SetPlayout(false);
2183 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002184}
2185
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002186// Test that we can add and remove send streams.
2187TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2188 SetupForMultiSendStream();
2189
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002190 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002191 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002192
solenbergc96df772015-10-21 13:01:53 -07002193 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002194 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002195 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002196 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002197 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002198 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002199 }
tfarina5237aaf2015-11-10 23:44:30 -08002200 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002201
solenbergc96df772015-10-21 13:01:53 -07002202 // Delete the send streams.
2203 for (uint32_t ssrc : kSsrcs4) {
2204 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002205 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002206 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002207 }
solenbergc96df772015-10-21 13:01:53 -07002208 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002209}
2210
2211// Test SetSendCodecs correctly configure the codecs in all send streams.
2212TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2213 SetupForMultiSendStream();
2214
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002215 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002216 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002217 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002218 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002219 }
2220
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002221 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002222 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002223 parameters.codecs.push_back(kIsacCodec);
2224 parameters.codecs.push_back(kCn16000Codec);
2225 parameters.codecs[1].id = 97;
2226 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002227
2228 // Verify ISAC and VAD are corrected configured on all send channels.
2229 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002230 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002231 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002232 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2233 EXPECT_STREQ("ISAC", gcodec.plname);
2234 EXPECT_TRUE(voe_.GetVAD(channel_num));
2235 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2236 }
2237
2238 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002239 parameters.codecs[0] = kPcmuCodec;
2240 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002241 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002242 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002243 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2244 EXPECT_STREQ("PCMU", gcodec.plname);
2245 EXPECT_FALSE(voe_.GetVAD(channel_num));
2246 }
2247}
2248
2249// Test we can SetSend on all send streams correctly.
2250TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2251 SetupForMultiSendStream();
2252
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002253 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002254 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002255 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002256 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002257 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2258 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 }
2260
2261 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002262 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002263 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002265 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002266 }
2267
2268 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002269 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002270 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002272 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002273 }
2274}
2275
2276// Test we can set the correct statistics on all send streams.
2277TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2278 SetupForMultiSendStream();
2279
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002280 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002281 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002283 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002284 }
solenberg85a04962015-10-27 03:35:21 -07002285
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002286 // Create a receive stream to check that none of the send streams end up in
2287 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002288 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002289
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002290 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002291 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2292 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002293 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002294
solenberg85a04962015-10-27 03:35:21 -07002295 // Check stats for the added streams.
2296 {
2297 cricket::VoiceMediaInfo info;
2298 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002299
solenberg85a04962015-10-27 03:35:21 -07002300 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002301 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002302 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002303 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002304 }
2305
2306 // We have added one receive stream. We should see empty stats.
2307 EXPECT_EQ(info.receivers.size(), 1u);
2308 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002309 }
solenberg1ac56142015-10-13 03:58:19 -07002310
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002311 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002312 {
2313 cricket::VoiceMediaInfo info;
2314 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2315 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002316 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002317 EXPECT_EQ(0u, info.receivers.size());
2318 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002319
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002320 // Deliver a new packet - a default receive stream should be created and we
2321 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002322 {
2323 cricket::VoiceMediaInfo info;
2324 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2325 SetAudioReceiveStreamStats();
2326 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002327 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002328 EXPECT_EQ(1u, info.receivers.size());
2329 VerifyVoiceReceiverInfo(info.receivers[0]);
2330 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002331}
2332
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002333// Test that we can add and remove receive streams, and do proper send/playout.
2334// We can receive on multiple streams while sending one stream.
2335TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002336 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337
solenberg1ac56142015-10-13 03:58:19 -07002338 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002339 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002340 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341
solenberg1ac56142015-10-13 03:58:19 -07002342 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002343 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenbergd53a3f92016-04-14 13:56:37 -07002344 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002345 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002346
solenberg1ac56142015-10-13 03:58:19 -07002347 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002348 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349
2350 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002351 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002352 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2353 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354
2355 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002356 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002357 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358
2359 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002360 channel_->SetPlayout(false);
2361 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2362 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363
aleloi84ef6152016-08-04 05:28:21 -07002364 // Restart playout and make sure recv streams are played out.
2365 channel_->SetPlayout(true);
2366 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2367 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368
aleloi84ef6152016-08-04 05:28:21 -07002369 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2371 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372}
2373
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002375// and start sending on it.
2376TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002377 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002378 cricket::AudioOptions options_adjust_agc;
2379 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380 webrtc::AgcConfig agc_config;
2381 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2382 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002383 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002384 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002385 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002386 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2388 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002389 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002390 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392}
2393
wu@webrtc.org97077a32013-10-25 21:18:33 +00002394TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002395 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002396 EXPECT_CALL(adm_,
2397 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002398 webrtc::AgcConfig agc_config;
2399 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2400 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002401 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2402 send_parameters_.options.tx_agc_digital_compression_gain =
2403 rtc::Optional<uint16_t>(9);
2404 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2405 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2406 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002407 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2408 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2409 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2410 EXPECT_TRUE(agc_config.limiterEnable);
2411
2412 // Check interaction with adjust_agc_delta. Both should be respected, for
2413 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002414 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2415 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002416 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2417 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2418}
2419
wu@webrtc.org97077a32013-10-25 21:18:33 +00002420TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002421 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002422 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2423 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002424 send_parameters_.options.recording_sample_rate =
2425 rtc::Optional<uint32_t>(48000);
2426 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2427 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002428}
2429
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002431// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002433 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002434 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002435}
2436
2437TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2438 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002439 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002440 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002441 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002442 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002443 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2444 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002445 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446
solenberg85a04962015-10-27 03:35:21 -07002447 // Check stats for the added streams.
2448 {
2449 cricket::VoiceMediaInfo info;
2450 EXPECT_EQ(true, channel_->GetStats(&info));
2451
2452 // We have added one send stream. We should see the stats we've set.
2453 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002454 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002455 // We have added one receive stream. We should see empty stats.
2456 EXPECT_EQ(info.receivers.size(), 1u);
2457 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2458 }
solenberg1ac56142015-10-13 03:58:19 -07002459
solenberg566ef242015-11-06 15:34:49 -08002460 // Start sending - this affects some reported stats.
2461 {
2462 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002463 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002464 EXPECT_EQ(true, channel_->GetStats(&info));
2465 VerifyVoiceSenderInfo(info.senders[0], true);
2466 }
2467
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002468 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002469 {
2470 cricket::VoiceMediaInfo info;
2471 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2472 EXPECT_EQ(true, channel_->GetStats(&info));
2473 EXPECT_EQ(1u, info.senders.size());
2474 EXPECT_EQ(0u, info.receivers.size());
2475 }
solenberg1ac56142015-10-13 03:58:19 -07002476
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002477 // Deliver a new packet - a default receive stream should be created and we
2478 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002479 {
2480 cricket::VoiceMediaInfo info;
2481 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2482 SetAudioReceiveStreamStats();
2483 EXPECT_EQ(true, channel_->GetStats(&info));
2484 EXPECT_EQ(1u, info.senders.size());
2485 EXPECT_EQ(1u, info.receivers.size());
2486 VerifyVoiceReceiverInfo(info.receivers[0]);
2487 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488}
2489
2490// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002491// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002493 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002494 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002495 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002496 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497}
2498
2499// Test that the local SSRC is the same on sending and receiving channels if the
2500// receive channel is created before the send channel.
2501TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002502 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002503 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002505 cricket::StreamParams::CreateLegacy(kSsrc1)));
2506 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2507 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508}
2509
2510// Test that we can properly receive packets.
2511TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002512 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002513 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002515
2516 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2517 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518}
2519
2520// Test that we can properly receive packets on multiple streams.
2521TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002522 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002523 const uint32_t ssrc1 = 1;
2524 const uint32_t ssrc2 = 2;
2525 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002526 EXPECT_TRUE(AddRecvStream(ssrc1));
2527 EXPECT_TRUE(AddRecvStream(ssrc2));
2528 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002530 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002531 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002533 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002534 }
mflodman3d7db262016-04-29 00:57:13 -07002535
2536 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2537 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2538 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2539
2540 EXPECT_EQ(s1.received_packets(), 0);
2541 EXPECT_EQ(s2.received_packets(), 0);
2542 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002543
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002545 EXPECT_EQ(s1.received_packets(), 0);
2546 EXPECT_EQ(s2.received_packets(), 0);
2547 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002548
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002549 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002550 EXPECT_EQ(s1.received_packets(), 1);
2551 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2552 EXPECT_EQ(s2.received_packets(), 0);
2553 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002554
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002555 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002556 EXPECT_EQ(s1.received_packets(), 1);
2557 EXPECT_EQ(s2.received_packets(), 1);
2558 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2559 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002560
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002562 EXPECT_EQ(s1.received_packets(), 1);
2563 EXPECT_EQ(s2.received_packets(), 1);
2564 EXPECT_EQ(s3.received_packets(), 1);
2565 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002566
mflodman3d7db262016-04-29 00:57:13 -07002567 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2568 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2569 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570}
2571
solenberg7e63ef02015-11-20 00:19:43 -08002572// Test that receiving on an unsignalled stream works (default channel will be
2573// created).
2574TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002575 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002576 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2577
solenberg7e63ef02015-11-20 00:19:43 -08002578 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002579
2580 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2581 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2582 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002583}
2584
2585// Test that receiving on an unsignalled stream works (default channel will be
2586// created), and that packets will be forwarded to the default channel
2587// regardless of their SSRCs.
2588TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002589 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002590 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002591 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2592
mflodman3d7db262016-04-29 00:57:13 -07002593 // Note that ssrc = 0 is not supported.
2594 uint32_t ssrc = 1;
2595 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002596 rtc::SetBE32(&packet[8], ssrc);
2597 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002598
2599 // Verify we only have one default stream.
2600 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2601 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2602 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002603 }
mflodman3d7db262016-04-29 00:57:13 -07002604
2605 // Sending the same ssrc again should not create a new stream.
2606 --ssrc;
2607 DeliverPacket(packet, sizeof(packet));
2608 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2609 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2610 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002611}
2612
2613// Test that a default channel is created even after a signalled stream has been
2614// added, and that this stream will get any packets for unknown SSRCs.
2615TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002616 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002617 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002618 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2619
2620 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002621 const uint32_t signaled_ssrc = 1;
2622 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002623 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002624 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002625 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2626 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002627
2628 // Note that the first unknown SSRC cannot be 0, because we only support
2629 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002630 const uint32_t unsignaled_ssrc = 7011;
2631 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002632 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002633 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2634 packet, sizeof(packet)));
2635 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2636
2637 DeliverPacket(packet, sizeof(packet));
2638 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2639
2640 rtc::SetBE32(&packet[8], signaled_ssrc);
2641 DeliverPacket(packet, sizeof(packet));
2642 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2643 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002644}
2645
solenberg0a617e22015-10-20 15:49:38 -07002646// Test that we properly handle failures to add a receive stream.
2647TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002648 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002650 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651}
2652
solenberg0a617e22015-10-20 15:49:38 -07002653// Test that we properly handle failures to add a send stream.
2654TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002655 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002656 voe_.set_fail_create_channel(true);
2657 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2658}
2659
solenberg1ac56142015-10-13 03:58:19 -07002660// Test that AddRecvStream creates new stream.
2661TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002662 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002663 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002664 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002665 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002666}
2667
2668// Test that after adding a recv stream, we do not decode more codecs than
2669// those previously passed into SetRecvCodecs.
2670TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002671 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002672 cricket::AudioRecvParameters parameters;
2673 parameters.codecs.push_back(kIsacCodec);
2674 parameters.codecs.push_back(kPcmuCodec);
2675 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002676 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 int channel_num2 = voe_.GetLastChannel();
2678 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002679 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002680 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681 gcodec.channels = 2;
2682 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2683}
2684
2685// Test that we properly clean up any streams that were added, even if
2686// not explicitly removed.
2687TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002688 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002689 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8189b022016-06-14 12:13:00 -07002690 EXPECT_TRUE(AddRecvStream(1));
2691 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002692 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2693 delete channel_;
2694 channel_ = NULL;
2695 EXPECT_EQ(0, voe_.GetNumChannels());
2696}
2697
wu@webrtc.org78187522013-10-07 23:32:02 +00002698TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002699 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002700 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002701}
2702
2703TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002704 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002705 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002706 // Manually delete channel to simulate a failure.
2707 int channel = voe_.GetLastChannel();
2708 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2709 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002710 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002711 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002712 EXPECT_NE(channel, new_channel);
2713 // The last created channel is deleted too.
2714 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002715}
2716
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002717// Test the InsertDtmf on default send stream as caller.
2718TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2719 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002720}
2721
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002722// Test the InsertDtmf on default send stream as callee
2723TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2724 TestInsertDtmf(0, false);
2725}
2726
2727// Test the InsertDtmf on specified send stream as caller.
2728TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2729 TestInsertDtmf(kSsrc1, true);
2730}
2731
2732// Test the InsertDtmf on specified send stream as callee.
2733TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2734 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002735}
2736
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002737TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002738 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002739 EXPECT_CALL(adm_,
2740 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2741 EXPECT_CALL(adm_,
2742 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2743 EXPECT_CALL(adm_,
2744 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745 bool ec_enabled;
2746 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 webrtc::AecmModes aecm_mode;
2748 bool cng_enabled;
2749 bool agc_enabled;
2750 webrtc::AgcModes agc_mode;
2751 webrtc::AgcConfig agc_config;
2752 bool ns_enabled;
2753 webrtc::NsModes ns_mode;
2754 bool highpass_filter_enabled;
2755 bool stereo_swapping_enabled;
2756 bool typing_detection_enabled;
2757 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 voe_.GetAecmMode(aecm_mode, cng_enabled);
2759 voe_.GetAgcStatus(agc_enabled, agc_mode);
2760 voe_.GetAgcConfig(agc_config);
2761 voe_.GetNsStatus(ns_enabled, ns_mode);
2762 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2763 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2764 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2765 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002766 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767 EXPECT_FALSE(cng_enabled);
2768 EXPECT_TRUE(agc_enabled);
2769 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2770 EXPECT_TRUE(ns_enabled);
2771 EXPECT_TRUE(highpass_filter_enabled);
2772 EXPECT_FALSE(stereo_swapping_enabled);
2773 EXPECT_TRUE(typing_detection_enabled);
2774 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2775 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002776 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2777 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778
solenberg246b8172015-12-08 09:50:23 -08002779 // Nothing set in AudioOptions, so everything should be as default.
2780 send_parameters_.options = cricket::AudioOptions();
2781 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002782 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002783 voe_.GetAecmMode(aecm_mode, cng_enabled);
2784 voe_.GetAgcStatus(agc_enabled, agc_mode);
2785 voe_.GetAgcConfig(agc_config);
2786 voe_.GetNsStatus(ns_enabled, ns_mode);
2787 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2788 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2789 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2790 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002791 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002792 EXPECT_FALSE(cng_enabled);
2793 EXPECT_TRUE(agc_enabled);
2794 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2795 EXPECT_TRUE(ns_enabled);
2796 EXPECT_TRUE(highpass_filter_enabled);
2797 EXPECT_FALSE(stereo_swapping_enabled);
2798 EXPECT_TRUE(typing_detection_enabled);
2799 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2800 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002801 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2802 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002803
2804 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002805 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2806 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807 voe_.GetEcStatus(ec_enabled, ec_mode);
2808 EXPECT_FALSE(ec_enabled);
2809
2810 // Turn echo cancellation back on, with settings, and make sure
2811 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002812 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2813 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002815 voe_.GetAecmMode(aecm_mode, cng_enabled);
2816 voe_.GetAgcStatus(agc_enabled, agc_mode);
2817 voe_.GetAgcConfig(agc_config);
2818 voe_.GetNsStatus(ns_enabled, ns_mode);
2819 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2820 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2821 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2822 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002823 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824 EXPECT_TRUE(agc_enabled);
2825 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2826 EXPECT_TRUE(ns_enabled);
2827 EXPECT_TRUE(highpass_filter_enabled);
2828 EXPECT_FALSE(stereo_swapping_enabled);
2829 EXPECT_TRUE(typing_detection_enabled);
2830 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2831 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2832
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002833 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2834 // control.
solenberg246b8172015-12-08 09:50:23 -08002835 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2836 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002837 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002838 voe_.GetAecmMode(aecm_mode, cng_enabled);
2839 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002840 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002841 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2842
2843 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002844 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2845 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2846 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2847 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002848 voe_.GetEcStatus(ec_enabled, ec_mode);
2849 EXPECT_FALSE(ec_enabled);
2850 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002851 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2852 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002853 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002854 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002855 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002856 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2857
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002858 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002859 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2860 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 voe_.GetAgcStatus(agc_enabled, agc_mode);
2862 EXPECT_FALSE(agc_enabled);
2863
2864 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002865 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2866 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2867 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002868 voe_.GetAgcStatus(agc_enabled, agc_mode);
2869 EXPECT_TRUE(agc_enabled);
2870 voe_.GetAgcConfig(agc_config);
2871 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2872
2873 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002874 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2875 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2876 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2877 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2878 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002879 voe_.GetNsStatus(ns_enabled, ns_mode);
2880 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2881 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2882 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2883 EXPECT_FALSE(ns_enabled);
2884 EXPECT_FALSE(highpass_filter_enabled);
2885 EXPECT_FALSE(typing_detection_enabled);
2886 EXPECT_TRUE(stereo_swapping_enabled);
2887
solenberg1ac56142015-10-13 03:58:19 -07002888 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002889 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002890 voe_.GetEcStatus(ec_enabled, ec_mode);
2891 voe_.GetNsStatus(ns_enabled, ns_mode);
2892 EXPECT_TRUE(ec_enabled);
2893 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2894 EXPECT_FALSE(ns_enabled);
2895 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2896}
2897
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002898TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002899 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002900
2901 bool ec_enabled;
2902 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903 bool agc_enabled;
2904 webrtc::AgcModes agc_mode;
2905 bool ns_enabled;
2906 webrtc::NsModes ns_mode;
2907 bool highpass_filter_enabled;
2908 bool stereo_swapping_enabled;
2909 bool typing_detection_enabled;
2910
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002912 voe_.GetAgcStatus(agc_enabled, agc_mode);
2913 voe_.GetNsStatus(ns_enabled, ns_mode);
2914 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2915 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2916 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2917 EXPECT_TRUE(ec_enabled);
2918 EXPECT_TRUE(agc_enabled);
2919 EXPECT_TRUE(ns_enabled);
2920 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002921 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002922 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002923}
2924
2925TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2926 webrtc::AgcConfig set_config = {0};
2927 set_config.targetLeveldBOv = 3;
2928 set_config.digitalCompressionGaindB = 9;
2929 set_config.limiterEnable = true;
2930 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002931
2932 webrtc::AgcConfig config = {0};
2933 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2934 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2935 EXPECT_EQ(set_config.digitalCompressionGaindB,
2936 config.digitalCompressionGaindB);
2937 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2938}
2939
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002941 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002942 EXPECT_CALL(adm_,
2943 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2944 EXPECT_CALL(adm_,
2945 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2946 EXPECT_CALL(adm_,
2947 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2948
kwiberg686a8ef2016-02-26 03:00:35 -08002949 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002950 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002951 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002952 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002953 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002954 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002955
2956 // Have to add a stream to make SetSend work.
2957 cricket::StreamParams stream1;
2958 stream1.ssrcs.push_back(1);
2959 channel1->AddSendStream(stream1);
2960 cricket::StreamParams stream2;
2961 stream2.ssrcs.push_back(2);
2962 channel2->AddSendStream(stream2);
2963
2964 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002965 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002966 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2967 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2968 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002969 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2970 EXPECT_EQ(parameters_options_all.options, channel1->options());
2971 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2972 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002973
2974 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002975 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002976 parameters_options_no_ns.options.noise_suppression =
2977 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002978 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2979 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002980 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2981 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2982 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002983 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002984
2985 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002986 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002987 parameters_options_no_agc.options.auto_gain_control =
2988 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002989 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002990 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2991 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2992 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002993 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002994
solenberg246b8172015-12-08 09:50:23 -08002995 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002996 bool ec_enabled;
2997 webrtc::EcModes ec_mode;
2998 bool agc_enabled;
2999 webrtc::AgcModes agc_mode;
3000 bool ns_enabled;
3001 webrtc::NsModes ns_mode;
3002 voe_.GetEcStatus(ec_enabled, ec_mode);
3003 voe_.GetAgcStatus(agc_enabled, agc_mode);
3004 voe_.GetNsStatus(ns_enabled, ns_mode);
3005 EXPECT_TRUE(ec_enabled);
3006 EXPECT_TRUE(agc_enabled);
3007 EXPECT_TRUE(ns_enabled);
3008
solenbergd53a3f92016-04-14 13:56:37 -07003009 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003010 voe_.GetEcStatus(ec_enabled, ec_mode);
3011 voe_.GetAgcStatus(agc_enabled, agc_mode);
3012 voe_.GetNsStatus(ns_enabled, ns_mode);
3013 EXPECT_TRUE(ec_enabled);
3014 EXPECT_TRUE(agc_enabled);
3015 EXPECT_FALSE(ns_enabled);
3016
solenbergd53a3f92016-04-14 13:56:37 -07003017 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018 voe_.GetEcStatus(ec_enabled, ec_mode);
3019 voe_.GetAgcStatus(agc_enabled, agc_mode);
3020 voe_.GetNsStatus(ns_enabled, ns_mode);
3021 EXPECT_TRUE(ec_enabled);
3022 EXPECT_FALSE(agc_enabled);
3023 EXPECT_TRUE(ns_enabled);
3024
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003025 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003026 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003027 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3028 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003029 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003030 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003031 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003032 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003033 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003034 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003035 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3036 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3037 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003038 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003039 voe_.GetEcStatus(ec_enabled, ec_mode);
3040 voe_.GetAgcStatus(agc_enabled, agc_mode);
3041 voe_.GetNsStatus(ns_enabled, ns_mode);
3042 EXPECT_TRUE(ec_enabled);
3043 EXPECT_FALSE(agc_enabled);
3044 EXPECT_FALSE(ns_enabled);
3045}
3046
wu@webrtc.orgde305012013-10-31 15:40:38 +00003047// This test verifies DSCP settings are properly applied on voice media channel.
3048TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003049 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003050 cricket::FakeNetworkInterface network_interface;
3051 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003052 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003053
solenbergbc37fc82016-04-04 09:54:44 -07003054 channel.reset(
3055 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003056 channel->SetInterface(&network_interface);
3057 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3058 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3059
3060 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003061 channel.reset(
3062 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003063 channel->SetInterface(&network_interface);
3064 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3065
3066 // Verify that setting the option to false resets the
3067 // DiffServCodePoint.
3068 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003069 channel.reset(
3070 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003071 channel->SetInterface(&network_interface);
3072 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3073 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3074
3075 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003076}
3077
solenberg1ac56142015-10-13 03:58:19 -07003078TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003079 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003080 cricket::WebRtcVoiceMediaChannel* media_channel =
3081 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003082 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003083 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003084 int channel_id = voe_.GetLastChannel();
3085 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3086 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003087 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003088 int channel_id2 = voe_.GetLastChannel();
3089 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003090}
3091
solenberg1ac56142015-10-13 03:58:19 -07003092TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003093 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003094 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003095 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3096 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3097 EXPECT_TRUE(channel_->AddSendStream(
3098 cricket::StreamParams::CreateLegacy(kSsrc1)));
3099 int channel_id = voe_.GetLastChannel();
3100 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3101 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3102 EXPECT_TRUE(channel_->AddSendStream(
3103 cricket::StreamParams::CreateLegacy(kSsrc2)));
3104 int channel_id2 = voe_.GetLastChannel();
3105 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003106}
3107
solenberg4bac9c52015-10-09 02:32:53 -07003108TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003109 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003110 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003111 cricket::StreamParams stream;
3112 stream.ssrcs.push_back(kSsrc2);
3113 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003114 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003115 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003116 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003117}
3118
3119TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003120 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003121 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3122 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003123 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003124 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003125 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3126 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3127 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003128}
3129
pbos8fc7fa72015-07-15 08:02:58 -07003130TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003131 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003132 const std::string kSyncLabel = "AvSyncLabel";
3133
solenbergff976312016-03-30 23:28:51 -07003134 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003135 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3136 sp.sync_label = kSyncLabel;
3137 // Creating two channels to make sure that sync label is set properly for both
3138 // the default voice channel and following ones.
3139 EXPECT_TRUE(channel_->AddRecvStream(sp));
3140 sp.ssrcs[0] += 1;
3141 EXPECT_TRUE(channel_->AddRecvStream(sp));
3142
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003143 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003144 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003145 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003146 << "SyncGroup should be set based on sync_label";
3147 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003148 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003149 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003150}
3151
solenberg3a941542015-11-16 07:34:50 -08003152// TODO(solenberg): Remove, once recv streams are configured through Call.
3153// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003154TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003155 // Test that setting the header extensions results in the expected state
3156 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003157 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003158 ssrcs.push_back(223);
3159 ssrcs.push_back(224);
3160
solenbergff976312016-03-30 23:28:51 -07003161 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003162 cricket::WebRtcVoiceMediaChannel* media_channel =
3163 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003164 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003165 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003166 EXPECT_TRUE(media_channel->AddRecvStream(
3167 cricket::StreamParams::CreateLegacy(ssrc)));
3168 }
3169
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003170 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003171 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003172 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003173 EXPECT_NE(nullptr, s);
3174 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3175 }
3176
3177 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003178 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003179 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003180 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003181 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003182 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003183 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003184 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003185 EXPECT_NE(nullptr, s);
3186 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003187 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3188 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003189 for (const auto& s_ext : s_exts) {
3190 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003191 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003192 }
3193 }
3194 }
3195 }
3196
3197 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003198 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003199 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003200 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003201 EXPECT_NE(nullptr, s);
3202 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3203 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003204}
3205
3206TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3207 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003208 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003209 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003210 static const unsigned char kRtcp[] = {
3211 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3212 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3215 };
jbaucheec21bd2016-03-20 06:15:43 -07003216 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003217
solenbergff976312016-03-30 23:28:51 -07003218 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003219 cricket::WebRtcVoiceMediaChannel* media_channel =
3220 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003221 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003222 EXPECT_TRUE(media_channel->AddRecvStream(
3223 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3224
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003225 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003226 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003227 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003228 EXPECT_EQ(0, s->received_packets());
3229 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3230 EXPECT_EQ(1, s->received_packets());
3231 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3232 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003233}
Minyue2013aec2015-05-13 14:14:42 +02003234
solenberg0a617e22015-10-20 15:49:38 -07003235// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003236// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003237TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003238 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003239 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003240 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003241 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003242 int recv_ch = voe_.GetLastChannel();
3243 EXPECT_NE(recv_ch, default_channel);
3244 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3245 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3246 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003247 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003248 recv_ch = voe_.GetLastChannel();
3249 EXPECT_NE(recv_ch, default_channel);
3250 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003251}
3252
3253TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003254 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003255 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003256
solenberg8189b022016-06-14 12:13:00 -07003257 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003258 int recv_ch = voe_.GetLastChannel();
3259
3260 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3261 int send_ch = voe_.GetLastChannel();
3262
3263 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3264 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3265 // channel of |recv_ch|.This is not a common case, since, normally, only the
3266 // default channel can be associated. However, the default is not deletable.
3267 // So we force the |recv_ch| to associate with a non-default channel.
3268 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3269 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3270
3271 EXPECT_TRUE(channel_->RemoveSendStream(2));
3272 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3273}
stefan658910c2015-09-03 05:48:32 -07003274
deadbeef884f5852016-01-15 09:20:04 -08003275TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003276 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003277 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3278 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003279
3280 // Setting the sink before a recv stream exists should do nothing.
3281 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003282 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003283 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3284
3285 // Now try actually setting the sink.
3286 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3287 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3288
3289 // Now try resetting it.
3290 channel_->SetRawAudioSink(kSsrc1, nullptr);
3291 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3292}
3293
3294TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003295 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003296 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3297 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003298
3299 // Should be able to set a default sink even when no stream exists.
3300 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3301
3302 // Create default channel and ensure it's assigned the default sink.
3303 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3304 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3305
3306 // Try resetting the default sink.
3307 channel_->SetRawAudioSink(0, nullptr);
3308 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3309
3310 // Try setting the default sink while the default stream exists.
3311 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3312 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3313
3314 // If we remove and add a default stream, it should get the same sink.
3315 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3316 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3317 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3318}
3319
skvlad7a43d252016-03-22 15:32:27 -07003320// Test that, just like the video channel, the voice channel communicates the
3321// network state to the call.
3322TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003323 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003324
3325 EXPECT_EQ(webrtc::kNetworkUp,
3326 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3327 EXPECT_EQ(webrtc::kNetworkUp,
3328 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3329
3330 channel_->OnReadyToSend(false);
3331 EXPECT_EQ(webrtc::kNetworkDown,
3332 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3333 EXPECT_EQ(webrtc::kNetworkUp,
3334 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3335
3336 channel_->OnReadyToSend(true);
3337 EXPECT_EQ(webrtc::kNetworkUp,
3338 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3339 EXPECT_EQ(webrtc::kNetworkUp,
3340 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3341}
3342
aleloi18e0b672016-10-04 02:45:47 -07003343// Test that playout is still started after changing parameters
3344TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3345 SetupRecvStream();
3346 channel_->SetPlayout(true);
3347 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3348
3349 // Changing RTP header extensions will recreate the AudioReceiveStream.
3350 cricket::AudioRecvParameters parameters;
3351 parameters.extensions.push_back(
3352 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3353 channel_->SetRecvParameters(parameters);
3354
3355 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3356}
3357
stefan658910c2015-09-03 05:48:32 -07003358// Tests that the library initializes and shuts down properly.
3359TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003360 // If the VoiceEngine wants to gather available codecs early, that's fine but
3361 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003362 cricket::WebRtcVoiceEngine engine(
3363 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003364 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003365 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003366 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3367 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003368 EXPECT_TRUE(channel != nullptr);
3369 delete channel;
solenbergff976312016-03-30 23:28:51 -07003370}
stefan658910c2015-09-03 05:48:32 -07003371
solenbergff976312016-03-30 23:28:51 -07003372// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003373TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3374 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3375 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3376 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003377 {
ossuc54071d2016-08-17 02:45:41 -07003378 cricket::WebRtcVoiceEngine engine(
3379 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
solenbergff976312016-03-30 23:28:51 -07003380 std::unique_ptr<webrtc::Call> call(
3381 webrtc::Call::Create(webrtc::Call::Config()));
3382 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3383 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3384 EXPECT_TRUE(channel != nullptr);
3385 delete channel;
3386 }
stefan658910c2015-09-03 05:48:32 -07003387}
3388
3389// Tests that the library is configured with the codecs we want.
3390TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003391 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3392 // module.
3393
stefan658910c2015-09-03 05:48:32 -07003394 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003395 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003396 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003397 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003398 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003399 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003400 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003401 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003402 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003403 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003404 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003405 cricket::AudioCodec(96, "iLBC", 8000, 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, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003408 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003409 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003410 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003411 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003412 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003413 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003414 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003415 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003416 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003417 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003418 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003419 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003420 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003421 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003422 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003423 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003424 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003425 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003426 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003427 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003428 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003429 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003430 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003431 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003432 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003433 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003434 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003435 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003436 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003437 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003438 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003439 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003440 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003441 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003442 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003443
stefan658910c2015-09-03 05:48:32 -07003444 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003445 // TODO(ossu): Why are the payload types of codecs with non-static payload
3446 // type assignments checked here? It shouldn't really matter.
3447 cricket::WebRtcVoiceEngine engine(
3448 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
stefan658910c2015-09-03 05:48:32 -07003449 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossuc54071d2016-08-17 02:45:41 -07003450 engine.send_codecs().begin();
3451 it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003452 if (it->name == "CN" && it->clockrate == 16000) {
3453 EXPECT_EQ(105, it->id);
3454 } else if (it->name == "CN" && it->clockrate == 32000) {
3455 EXPECT_EQ(106, it->id);
3456 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3457 EXPECT_EQ(103, it->id);
3458 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3459 EXPECT_EQ(104, it->id);
3460 } else if (it->name == "G722" && it->clockrate == 8000) {
3461 EXPECT_EQ(9, it->id);
3462 } else if (it->name == "telephone-event") {
3463 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003464 } else if (it->name == "opus") {
3465 EXPECT_EQ(111, it->id);
3466 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3467 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003468 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3469 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3470 }
3471 }
stefan658910c2015-09-03 05:48:32 -07003472}
3473
3474// Tests that VoE supports at least 32 channels
3475TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003476 cricket::WebRtcVoiceEngine engine(
3477 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003478 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003479 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003480
3481 cricket::VoiceMediaChannel* channels[32];
3482 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003483 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003484 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3485 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003486 if (!channel)
3487 break;
stefan658910c2015-09-03 05:48:32 -07003488 channels[num_channels++] = channel;
3489 }
3490
tfarina5237aaf2015-11-10 23:44:30 -08003491 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003492 EXPECT_EQ(expected, num_channels);
3493
3494 while (num_channels > 0) {
3495 delete channels[--num_channels];
3496 }
stefan658910c2015-09-03 05:48:32 -07003497}
3498
3499// Test that we set our preferred codecs properly.
3500TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003501 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3502 // - Check that our builtin codecs are usable by Channel.
3503 // - The codecs provided by the engine is usable by Channel.
3504 // It does not check that the codecs in the RecvParameters are actually
3505 // what we sent in - though it's probably reasonable to expect so, if
3506 // SetRecvParameters returns true.
3507 // I think it will become clear once audio decoder injection is completed.
3508 cricket::WebRtcVoiceEngine engine(
3509 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
kwiberg686a8ef2016-02-26 03:00:35 -08003510 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003511 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003512 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3513 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003514 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003515 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003516 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003517}