blob: 80c3fda2716cacac7f197c957214b8755a538895 [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"
skvlad11a9cbf2016-10-07 11:53:05 -070020#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
kjellandera96e2d72016-02-04 23:52:28 -080021#include "webrtc/media/base/fakemediaengine.h"
22#include "webrtc/media/base/fakenetworkinterface.h"
23#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080024#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010025#include "webrtc/media/engine/fakewebrtccall.h"
26#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
27#include "webrtc/media/engine/webrtcvoiceengine.h"
ossu29b1a8d2016-06-13 07:34:51 -070028#include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
29#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h"
solenbergbc37fc82016-04-04 09:54:44 -070030#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031
solenbergbc37fc82016-04-04 09:54:44 -070032using testing::Return;
33using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000034
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020035namespace {
36
deadbeef67cf2c12016-04-13 10:07:16 -070037const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
38const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
39const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
40const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
41const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
deadbeef67cf2c12016-04-13 10:07:16 -070042const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
44const cricket::AudioCodec kTelephoneEventCodec(106,
45 "telephone-event",
46 8000,
47 0,
48 1);
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080050const uint32_t kSsrc2 = 2;
51const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070052const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053
solenberg971cab02016-06-14 10:02:41 -070054constexpr int kRtpHistoryMs = 5000;
55
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056class FakeVoEWrapper : public cricket::VoEWrapper {
57 public:
58 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
59 : cricket::VoEWrapper(engine, // processing
60 engine, // base
61 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 engine) { // volume
64 }
65};
skvlad11a9cbf2016-10-07 11:53:05 -070066
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020067} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068
solenbergff976312016-03-30 23:28:51 -070069// Tests that our stub library "works".
70TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070071 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
72 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
73 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070074 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
75 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
76 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenbergff976312016-03-30 23:28:51 -070077 cricket::FakeWebRtcVoiceEngine voe;
78 EXPECT_FALSE(voe.IsInited());
79 {
ossuc54071d2016-08-17 02:45:41 -070080 cricket::WebRtcVoiceEngine engine(
81 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(),
82 new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070083 EXPECT_TRUE(voe.IsInited());
84 }
85 EXPECT_FALSE(voe.IsInited());
86}
87
deadbeef884f5852016-01-15 09:20:04 -080088class FakeAudioSink : public webrtc::AudioSinkInterface {
89 public:
90 void OnData(const Data& audio) override {}
91};
92
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080093class FakeAudioSource : public cricket::AudioSource {
94 void SetSink(Sink* sink) override {}
95};
96
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097class WebRtcVoiceEngineTestFake : public testing::Test {
98 public:
stefanba4c0e42016-02-04 04:12:24 -080099 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
100
101 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
skvlad11a9cbf2016-10-07 11:53:05 -0700102 : call_(webrtc::Call::Config(&event_log_)),
103 override_field_trials_(field_trials) {
ossuc54071d2016-08-17 02:45:41 -0700104 auto factory = webrtc::MockAudioDecoderFactory::CreateUnusedFactory();
solenbergbc37fc82016-04-04 09:54:44 -0700105 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
106 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700107 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
108 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
109 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
ossuc54071d2016-08-17 02:45:41 -0700110 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory,
solenbergbc37fc82016-04-04 09:54:44 -0700111 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200112 send_parameters_.codecs.push_back(kPcmuCodec);
113 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114 }
solenberg8189b022016-06-14 12:13:00 -0700115
solenbergff976312016-03-30 23:28:51 -0700116 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700117 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
118 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200119 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000120 }
solenberg8189b022016-06-14 12:13:00 -0700121
solenbergff976312016-03-30 23:28:51 -0700122 bool SetupRecvStream() {
123 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700124 return false;
125 }
solenberg8189b022016-06-14 12:13:00 -0700126 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700127 }
solenberg8189b022016-06-14 12:13:00 -0700128
solenbergff976312016-03-30 23:28:51 -0700129 bool SetupSendStream() {
130 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000131 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800133 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
134 return false;
135 }
136 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137 }
solenberg8189b022016-06-14 12:13:00 -0700138
139 bool AddRecvStream(uint32_t ssrc) {
140 EXPECT_TRUE(channel_);
141 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
142 }
143
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000144 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700145 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700146 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800147 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700148 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700149 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800150 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000151 }
solenberg8189b022016-06-14 12:13:00 -0700152
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700154 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000155 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 }
solenberg8189b022016-06-14 12:13:00 -0700157
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200158 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000160 }
161
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100162 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
163 const auto* send_stream = call_.GetAudioSendStream(ssrc);
164 EXPECT_TRUE(send_stream);
165 return *send_stream;
166 }
167
deadbeef884f5852016-01-15 09:20:04 -0800168 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
169 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
170 EXPECT_TRUE(recv_stream);
171 return *recv_stream;
172 }
173
solenberg3a941542015-11-16 07:34:50 -0800174 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800175 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800176 }
177
solenberg7add0582015-11-20 09:59:34 -0800178 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800179 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800180 }
181
solenbergd53a3f92016-04-14 13:56:37 -0700182 void SetSend(cricket::VoiceMediaChannel* channel, bool enable) {
183 ASSERT_TRUE(channel);
184 if (enable) {
185 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
186 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
187 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
188 }
189 channel->SetSend(enable);
190 }
191
Peter Boström0c4e06b2015-10-07 12:23:21 +0200192 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700193 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000194 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700195 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000196 // send stream.
197 EXPECT_TRUE(channel_->AddSendStream(
198 cricket::StreamParams::CreateLegacy(kSsrc1)));
199 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000200
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200202 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -0700203 SetSend(channel_, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800205 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200206 send_parameters_.codecs.push_back(kTelephoneEventCodec);
207 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000209
210 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700211 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800212 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000213 EXPECT_TRUE(channel_->AddSendStream(
214 cricket::StreamParams::CreateLegacy(kSsrc1)));
215 }
216
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000217 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800218 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000219
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100220 // Test send.
221 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
222 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
223 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800224 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100225 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
226 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
227 EXPECT_EQ(2, telephone_event.event_code);
228 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 }
230
231 // Test that send bandwidth is set correctly.
232 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000233 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
234 // |expected_result| is the expected result from SetMaxSendBandwidth().
235 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700236 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
237 int max_bitrate,
238 bool expected_result,
239 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200240 cricket::AudioSendParameters parameters;
241 parameters.codecs.push_back(codec);
242 parameters.max_bandwidth_bps = max_bitrate;
243 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
244
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000245 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000246 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000247 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000248 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000249 }
250
skvlade0d46372016-04-07 22:59:22 -0700251 // Sets the per-stream maximum bitrate limit for the specified SSRC.
252 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700253 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700254 EXPECT_EQ(1UL, parameters.encodings.size());
255
256 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700257 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700258 }
259
260 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
261 cricket::AudioSendParameters send_parameters;
262 send_parameters.codecs.push_back(codec);
263 send_parameters.max_bandwidth_bps = bitrate;
264 return channel_->SetSendParameters(send_parameters);
265 }
266
267 int GetCodecBitrate(int32_t ssrc) {
268 cricket::WebRtcVoiceMediaChannel* media_channel =
269 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
270 int channel = media_channel->GetSendChannelId(ssrc);
271 EXPECT_NE(-1, channel);
272 webrtc::CodecInst codec;
273 EXPECT_FALSE(voe_.GetSendCodec(channel, codec));
274 return codec.rate;
275 }
276
277 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
278 int global_max,
279 int stream_max,
280 bool expected_result,
281 int expected_codec_bitrate) {
282 // Clear the bitrate limit from the previous test case.
283 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
284
285 // Attempt to set the requested bitrate limits.
286 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
287 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
288
289 // Verify that reading back the parameters gives results
290 // consistent with the Set() result.
291 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700292 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700293 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
294 EXPECT_EQ(expected_result ? stream_max : -1,
295 resulting_parameters.encodings[0].max_bitrate_bps);
296
297 // Verify that the codec settings have the expected bitrate.
298 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
299 }
300
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000301 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700302 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000303
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000304 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800305 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000306
307 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700308 send_parameters_.extensions.push_back(
309 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200310 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800311 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000312
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000313 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200314 send_parameters_.extensions.clear();
315 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800316 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000317
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000318 // Ensure extension is set properly.
319 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700320 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200321 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800322 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700323 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800324 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000325
solenberg7add0582015-11-20 09:59:34 -0800326 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000327 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700328 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800329 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
330 call_.GetAudioSendStream(kSsrc2));
331 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700332 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800333 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000334
335 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200336 send_parameters_.codecs.push_back(kPcmuCodec);
337 send_parameters_.extensions.clear();
338 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800339 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
340 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000341 }
342
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000343 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700344 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000345
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000346 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800347 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000348
349 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700350 recv_parameters_.extensions.push_back(
351 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800352 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
353 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000354
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000355 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800356 recv_parameters_.extensions.clear();
357 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
358 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000359
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000360 // Ensure extension is set properly.
361 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700362 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800363 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
364 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700365 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800366 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000367
solenberg7add0582015-11-20 09:59:34 -0800368 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700369 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800370 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
371 call_.GetAudioReceiveStream(kSsrc2));
372 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700373 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800374 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000375
376 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800377 recv_parameters_.extensions.clear();
378 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
379 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
380 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000381 }
382
solenberg85a04962015-10-27 03:35:21 -0700383 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
384 webrtc::AudioSendStream::Stats stats;
385 stats.local_ssrc = 12;
386 stats.bytes_sent = 345;
387 stats.packets_sent = 678;
388 stats.packets_lost = 9012;
389 stats.fraction_lost = 34.56f;
390 stats.codec_name = "codec_name_send";
391 stats.ext_seqnum = 789;
392 stats.jitter_ms = 12;
393 stats.rtt_ms = 345;
394 stats.audio_level = 678;
395 stats.aec_quality_min = 9.01f;
396 stats.echo_delay_median_ms = 234;
397 stats.echo_delay_std_ms = 567;
398 stats.echo_return_loss = 890;
399 stats.echo_return_loss_enhancement = 1234;
400 stats.typing_noise_detected = true;
401 return stats;
402 }
403 void SetAudioSendStreamStats() {
404 for (auto* s : call_.GetAudioSendStreams()) {
405 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200406 }
solenberg85a04962015-10-27 03:35:21 -0700407 }
solenberg566ef242015-11-06 15:34:49 -0800408 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
409 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700410 const auto stats = GetAudioSendStreamStats();
411 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
412 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
413 EXPECT_EQ(info.packets_sent, stats.packets_sent);
414 EXPECT_EQ(info.packets_lost, stats.packets_lost);
415 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
416 EXPECT_EQ(info.codec_name, stats.codec_name);
417 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
418 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
419 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
420 EXPECT_EQ(info.audio_level, stats.audio_level);
421 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
422 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
423 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
424 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
425 EXPECT_EQ(info.echo_return_loss_enhancement,
426 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800427 EXPECT_EQ(info.typing_noise_detected,
428 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700429 }
430
431 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
432 webrtc::AudioReceiveStream::Stats stats;
433 stats.remote_ssrc = 123;
434 stats.bytes_rcvd = 456;
435 stats.packets_rcvd = 768;
436 stats.packets_lost = 101;
437 stats.fraction_lost = 23.45f;
438 stats.codec_name = "codec_name_recv";
439 stats.ext_seqnum = 678;
440 stats.jitter_ms = 901;
441 stats.jitter_buffer_ms = 234;
442 stats.jitter_buffer_preferred_ms = 567;
443 stats.delay_estimate_ms = 890;
444 stats.audio_level = 1234;
445 stats.expand_rate = 5.67f;
446 stats.speech_expand_rate = 8.90f;
447 stats.secondary_decoded_rate = 1.23f;
448 stats.accelerate_rate = 4.56f;
449 stats.preemptive_expand_rate = 7.89f;
450 stats.decoding_calls_to_silence_generator = 12;
451 stats.decoding_calls_to_neteq = 345;
452 stats.decoding_normal = 67890;
453 stats.decoding_plc = 1234;
454 stats.decoding_cng = 5678;
455 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700456 stats.decoding_muted_output = 3456;
457 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200458 return stats;
459 }
460 void SetAudioReceiveStreamStats() {
461 for (auto* s : call_.GetAudioReceiveStreams()) {
462 s->SetStats(GetAudioReceiveStreamStats());
463 }
464 }
465 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700466 const auto stats = GetAudioReceiveStreamStats();
467 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
468 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
469 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
470 EXPECT_EQ(info.packets_lost, stats.packets_lost);
471 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
472 EXPECT_EQ(info.codec_name, stats.codec_name);
473 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
474 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
475 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200476 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700477 stats.jitter_buffer_preferred_ms);
478 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
479 EXPECT_EQ(info.audio_level, stats.audio_level);
480 EXPECT_EQ(info.expand_rate, stats.expand_rate);
481 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
482 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
483 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
484 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200485 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700486 stats.decoding_calls_to_silence_generator);
487 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
488 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
489 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
490 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
491 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700492 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700493 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200494 }
495
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700497 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700498 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200499 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700501 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700502 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200503 cricket::AudioSendParameters send_parameters_;
504 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800505 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800506 private:
507 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508};
509
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510// Tests that we can create and destroy a channel.
511TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700512 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513}
514
solenberg31fec402016-05-06 02:13:12 -0700515// Test that we can add a send stream and that it has the correct defaults.
516TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
517 EXPECT_TRUE(SetupChannel());
518 EXPECT_TRUE(
519 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
520 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
521 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
522 EXPECT_EQ("", config.rtp.c_name);
523 EXPECT_EQ(0u, config.rtp.extensions.size());
524 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
525 config.send_transport);
526}
527
528// Test that we can add a receive stream and that it has the correct defaults.
529TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
530 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700531 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700532 const webrtc::AudioReceiveStream::Config& config =
533 GetRecvStreamConfig(kSsrc1);
534 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
535 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
536 EXPECT_FALSE(config.rtp.transport_cc);
537 EXPECT_EQ(0u, config.rtp.extensions.size());
538 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
539 config.rtcp_send_transport);
540 EXPECT_EQ("", config.sync_group);
541}
542
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700544// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700545// TODO(ossu): This test should move into a separate builtin audio codecs
546// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700547TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700548 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 ASSERT_FALSE(codecs.empty());
550 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
551 EXPECT_EQ(48000, codecs[0].clockrate);
552 EXPECT_EQ(2, codecs[0].channels);
553 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554}
555
stefanba4c0e42016-02-04 04:12:24 -0800556TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700557 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800558 bool opus_found = false;
559 for (cricket::AudioCodec codec : codecs) {
560 if (codec.name == "opus") {
561 EXPECT_TRUE(HasTransportCc(codec));
562 opus_found = true;
563 }
564 }
565 EXPECT_TRUE(opus_found);
566}
567
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568// Tests that we can find codecs by name or id, and that we interpret the
569// clockrate and bitrate fields properly.
570TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
571 cricket::AudioCodec codec;
572 webrtc::CodecInst codec_inst;
573 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800574 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000575 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800576 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800578 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
579 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 // Find ISAC with a different payload id.
581 codec = kIsacCodec;
582 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800583 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 EXPECT_EQ(codec.id, codec_inst.pltype);
585 // Find PCMU with a 0 clockrate.
586 codec = kPcmuCodec;
587 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800588 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 EXPECT_EQ(codec.id, codec_inst.pltype);
590 EXPECT_EQ(8000, codec_inst.plfreq);
591 // Find PCMU with a 0 bitrate.
592 codec = kPcmuCodec;
593 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800594 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 EXPECT_EQ(codec.id, codec_inst.pltype);
596 EXPECT_EQ(64000, codec_inst.rate);
597 // Find ISAC with an explicit bitrate.
598 codec = kIsacCodec;
599 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800600 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 EXPECT_EQ(codec.id, codec_inst.pltype);
602 EXPECT_EQ(32000, codec_inst.rate);
603}
604
605// Test that we set our inbound codecs properly, including changing PT.
606TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700607 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200608 cricket::AudioRecvParameters parameters;
609 parameters.codecs.push_back(kIsacCodec);
610 parameters.codecs.push_back(kPcmuCodec);
611 parameters.codecs.push_back(kTelephoneEventCodec);
612 parameters.codecs[0].id = 106; // collide with existing telephone-event
613 parameters.codecs[2].id = 126;
614 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700615 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700616 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800618 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 gcodec.plfreq = 16000;
620 gcodec.channels = 1;
621 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
622 EXPECT_EQ(106, gcodec.pltype);
623 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800624 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 gcodec.plfreq = 8000;
626 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
627 EXPECT_EQ(126, gcodec.pltype);
628 EXPECT_STREQ("telephone-event", gcodec.plname);
629}
630
631// Test that we fail to set an unknown inbound codec.
632TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700633 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200634 cricket::AudioRecvParameters parameters;
635 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700636 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200637 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638}
639
640// Test that we fail if we have duplicate types in the inbound list.
641TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700642 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200643 cricket::AudioRecvParameters parameters;
644 parameters.codecs.push_back(kIsacCodec);
645 parameters.codecs.push_back(kCn16000Codec);
646 parameters.codecs[1].id = kIsacCodec.id;
647 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648}
649
650// Test that we can decode OPUS without stereo parameters.
651TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700652 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200653 cricket::AudioRecvParameters parameters;
654 parameters.codecs.push_back(kIsacCodec);
655 parameters.codecs.push_back(kPcmuCodec);
656 parameters.codecs.push_back(kOpusCodec);
657 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700658 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700659 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800661 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 // Even without stereo parameters, recv codecs still specify channels = 2.
663 EXPECT_EQ(2, opus.channels);
664 EXPECT_EQ(111, opus.pltype);
665 EXPECT_STREQ("opus", opus.plname);
666 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700667 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 EXPECT_EQ(111, opus.pltype);
669}
670
671// Test that we can decode OPUS with stereo = 0.
672TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700673 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200674 cricket::AudioRecvParameters parameters;
675 parameters.codecs.push_back(kIsacCodec);
676 parameters.codecs.push_back(kPcmuCodec);
677 parameters.codecs.push_back(kOpusCodec);
678 parameters.codecs[2].params["stereo"] = "0";
679 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700680 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 int channel_num2 = voe_.GetLastChannel();
682 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800683 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 // Even when stereo is off, recv codecs still specify channels = 2.
685 EXPECT_EQ(2, opus.channels);
686 EXPECT_EQ(111, opus.pltype);
687 EXPECT_STREQ("opus", opus.plname);
688 opus.pltype = 0;
689 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
690 EXPECT_EQ(111, opus.pltype);
691}
692
693// Test that we can decode OPUS with stereo = 1.
694TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700695 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200696 cricket::AudioRecvParameters parameters;
697 parameters.codecs.push_back(kIsacCodec);
698 parameters.codecs.push_back(kPcmuCodec);
699 parameters.codecs.push_back(kOpusCodec);
700 parameters.codecs[2].params["stereo"] = "1";
701 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700702 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 int channel_num2 = voe_.GetLastChannel();
704 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800705 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706 EXPECT_EQ(2, opus.channels);
707 EXPECT_EQ(111, opus.pltype);
708 EXPECT_STREQ("opus", opus.plname);
709 opus.pltype = 0;
710 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
711 EXPECT_EQ(111, opus.pltype);
712}
713
714// Test that changes to recv codecs are applied to all streams.
715TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700716 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200717 cricket::AudioRecvParameters parameters;
718 parameters.codecs.push_back(kIsacCodec);
719 parameters.codecs.push_back(kPcmuCodec);
720 parameters.codecs.push_back(kTelephoneEventCodec);
721 parameters.codecs[0].id = 106; // collide with existing telephone-event
722 parameters.codecs[2].id = 126;
723 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700724 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725 int channel_num2 = voe_.GetLastChannel();
726 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800727 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 gcodec.plfreq = 16000;
729 gcodec.channels = 1;
730 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
731 EXPECT_EQ(106, gcodec.pltype);
732 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800733 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734 gcodec.plfreq = 8000;
735 gcodec.channels = 1;
736 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
737 EXPECT_EQ(126, gcodec.pltype);
738 EXPECT_STREQ("telephone-event", gcodec.plname);
739}
740
741TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700742 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200743 cricket::AudioRecvParameters parameters;
744 parameters.codecs.push_back(kIsacCodec);
745 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200746 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747
748 int channel_num2 = voe_.GetLastChannel();
749 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800750 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751 gcodec.plfreq = 16000;
752 gcodec.channels = 1;
753 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
754 EXPECT_EQ(106, gcodec.pltype);
755 EXPECT_STREQ("ISAC", gcodec.plname);
756}
757
758// Test that we can apply the same set of codecs again while playing.
759TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700760 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200761 cricket::AudioRecvParameters parameters;
762 parameters.codecs.push_back(kIsacCodec);
763 parameters.codecs.push_back(kCn16000Codec);
764 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700765 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200766 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767
768 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200769 parameters.codecs[0].id = 127;
770 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700771 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772}
773
774// Test that we can add a codec while playing.
775TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700776 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200777 cricket::AudioRecvParameters parameters;
778 parameters.codecs.push_back(kIsacCodec);
779 parameters.codecs.push_back(kCn16000Codec);
780 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700781 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200783 parameters.codecs.push_back(kOpusCodec);
784 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700785 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800787 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
789}
790
791TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700792 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000794 // Test that when autobw is enabled, bitrate is kept as the default
795 // value. autobw is enabled for the following tests because the target
796 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797
798 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700799 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
801 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700802 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000804 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700805 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806}
807
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000808TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700809 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000811 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812
813 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700814 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
815 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
816 // Rates above the max (56000) should be capped.
817 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000819 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700820 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
821 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
822 // Rates above the max (510000) should be capped.
823 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824}
825
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000826TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700827 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000828
829 // Test that we can only set a maximum bitrate for a fixed-rate codec
830 // if it's bigger than the fixed rate.
831
832 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700833 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
834 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
835 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
836 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
837 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
838 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
839 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000840}
841
842TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700843 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 const int kDesiredBitrate = 128000;
845 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700846 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200847 parameters.max_bandwidth_bps = kDesiredBitrate;
848 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000849
850 EXPECT_TRUE(channel_->AddSendStream(
851 cricket::StreamParams::CreateLegacy(kSsrc1)));
852
853 int channel_num = voe_.GetLastChannel();
854 webrtc::CodecInst codec;
855 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200856 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000857}
858
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859// Test that bitrate cannot be set for CBR codecs.
860// Bitrate is ignored if it is higher than the fixed bitrate.
861// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000862TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700863 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864
865 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200866 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
867 int channel_num = voe_.GetLastChannel();
868 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
870 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200871
872 send_parameters_.max_bandwidth_bps = 128000;
873 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000874 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
875 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200876
877 send_parameters_.max_bandwidth_bps = 128;
878 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
880 EXPECT_EQ(64000, codec.rate);
881}
882
skvlade0d46372016-04-07 22:59:22 -0700883// Test that the per-stream bitrate limit and the global
884// bitrate limit both apply.
885TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
886 EXPECT_TRUE(SetupSendStream());
887
888 // opus, default bitrate == 64000.
889 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
890 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
891 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
892 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
893
894 // CBR codecs allow both maximums to exceed the bitrate.
895 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
896 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
897 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
898 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
899
900 // CBR codecs don't allow per stream maximums to be too low.
901 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
902 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
903}
904
905// Test that an attempt to set RtpParameters for a stream that does not exist
906// fails.
907TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
908 EXPECT_TRUE(SetupChannel());
909 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700910 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700911 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
912
913 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700914 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700915}
916
917TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700918 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700919 // This test verifies that setting RtpParameters succeeds only if
920 // the structure contains exactly one encoding.
921 // TODO(skvlad): Update this test when we start supporting setting parameters
922 // for each encoding individually.
923
924 EXPECT_TRUE(SetupSendStream());
925 // Setting RtpParameters with no encoding is expected to fail.
926 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700927 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700928 // Setting RtpParameters with exactly one encoding should succeed.
929 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700930 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700931 // Two or more encodings should result in failure.
932 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700933 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700934}
935
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700936// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700937// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700938TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
939 EXPECT_TRUE(SetupSendStream());
940 SetSend(channel_, true);
941 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
942 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700943 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700944 ASSERT_EQ(1u, parameters.encodings.size());
945 ASSERT_TRUE(parameters.encodings[0].active);
946 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700947 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700948 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
949
950 // Now change it back to active and verify we resume sending.
951 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700952 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700953 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
954}
955
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700956// Test that SetRtpSendParameters configures the correct encoding channel for
957// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700958TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
959 SetupForMultiSendStream();
960 // Create send streams.
961 for (uint32_t ssrc : kSsrcs4) {
962 EXPECT_TRUE(
963 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
964 }
965 // Configure one stream to be limited by the stream config, another to be
966 // limited by the global max, and the third one with no per-stream limit
967 // (still subject to the global limit).
968 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
969 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
970 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
971 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
972
973 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
974 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
975 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
976
977 // Remove the global cap; the streams should switch to their respective
978 // maximums (or remain unchanged if there was no other limit on them.)
979 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
980 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
981 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
982 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
983}
984
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700985// Test that GetRtpSendParameters returns the currently configured codecs.
986TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700987 EXPECT_TRUE(SetupSendStream());
988 cricket::AudioSendParameters parameters;
989 parameters.codecs.push_back(kIsacCodec);
990 parameters.codecs.push_back(kPcmuCodec);
991 EXPECT_TRUE(channel_->SetSendParameters(parameters));
992
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700993 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700994 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700995 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
996 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700997}
998
999// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001000TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001001 EXPECT_TRUE(SetupSendStream());
1002 cricket::AudioSendParameters parameters;
1003 parameters.codecs.push_back(kIsacCodec);
1004 parameters.codecs.push_back(kPcmuCodec);
1005 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1006
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001007 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001008
1009 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001010 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001011
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001012 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1013 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1014 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1015}
1016
1017// Test that GetRtpReceiveParameters returns the currently configured codecs.
1018TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1019 EXPECT_TRUE(SetupRecvStream());
1020 cricket::AudioRecvParameters parameters;
1021 parameters.codecs.push_back(kIsacCodec);
1022 parameters.codecs.push_back(kPcmuCodec);
1023 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1024
1025 webrtc::RtpParameters rtp_parameters =
1026 channel_->GetRtpReceiveParameters(kSsrc1);
1027 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1028 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1029 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1030}
1031
1032// Test that if we set/get parameters multiple times, we get the same results.
1033TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1034 EXPECT_TRUE(SetupRecvStream());
1035 cricket::AudioRecvParameters parameters;
1036 parameters.codecs.push_back(kIsacCodec);
1037 parameters.codecs.push_back(kPcmuCodec);
1038 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1039
1040 webrtc::RtpParameters initial_params =
1041 channel_->GetRtpReceiveParameters(kSsrc1);
1042
1043 // We should be able to set the params we just got.
1044 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1045
1046 // ... And this shouldn't change the params returned by
1047 // GetRtpReceiveParameters.
1048 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1049 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001050}
1051
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052// Test that we apply codecs properly.
1053TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001054 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001055 cricket::AudioSendParameters parameters;
1056 parameters.codecs.push_back(kIsacCodec);
1057 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001058 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001059 parameters.codecs[0].id = 96;
1060 parameters.codecs[0].bitrate = 48000;
1061 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001062 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001063 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001064 webrtc::CodecInst gcodec;
1065 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1066 EXPECT_EQ(96, gcodec.pltype);
1067 EXPECT_EQ(48000, gcodec.rate);
1068 EXPECT_STREQ("ISAC", gcodec.plname);
1069 EXPECT_FALSE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001070 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1071 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001072 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001073}
1074
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001075// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1076// to apply.
1077TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001078 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 cricket::AudioSendParameters parameters;
1080 parameters.codecs.push_back(kIsacCodec);
1081 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001082 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001083 parameters.codecs[0].id = 96;
1084 parameters.codecs[0].bitrate = 48000;
1085 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001086 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1087 // Calling SetSendCodec again with same codec which is already set.
1088 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001089 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001090 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
1091}
1092
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001093// Verify that G722 is set with 16000 samples per second to WebRTC.
1094TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001095 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001096 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001097 cricket::AudioSendParameters parameters;
1098 parameters.codecs.push_back(kG722CodecSdp);
1099 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001100 webrtc::CodecInst gcodec;
1101 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1102 EXPECT_STREQ("G722", gcodec.plname);
1103 EXPECT_EQ(1, gcodec.channels);
1104 EXPECT_EQ(16000, gcodec.plfreq);
1105}
1106
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001107// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001109 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001110 cricket::AudioSendParameters parameters;
1111 parameters.codecs.push_back(kOpusCodec);
1112 parameters.codecs[0].bitrate = 0;
1113 parameters.codecs[0].clockrate = 50000;
1114 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115}
1116
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001117// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001119 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001120 cricket::AudioSendParameters parameters;
1121 parameters.codecs.push_back(kOpusCodec);
1122 parameters.codecs[0].bitrate = 0;
1123 parameters.codecs[0].channels = 0;
1124 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125}
1126
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001127// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001129 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001130 cricket::AudioSendParameters parameters;
1131 parameters.codecs.push_back(kOpusCodec);
1132 parameters.codecs[0].bitrate = 0;
1133 parameters.codecs[0].channels = 0;
1134 parameters.codecs[0].params["stereo"] = "1";
1135 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136}
1137
1138// Test that if channel is 1 for opus and there's no stereo, we fail.
1139TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001140 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001141 cricket::AudioSendParameters parameters;
1142 parameters.codecs.push_back(kOpusCodec);
1143 parameters.codecs[0].bitrate = 0;
1144 parameters.codecs[0].channels = 1;
1145 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146}
1147
1148// Test that if channel is 1 for opus and stereo=0, we fail.
1149TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001150 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001151 cricket::AudioSendParameters parameters;
1152 parameters.codecs.push_back(kOpusCodec);
1153 parameters.codecs[0].bitrate = 0;
1154 parameters.codecs[0].channels = 1;
1155 parameters.codecs[0].params["stereo"] = "0";
1156 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157}
1158
1159// Test that if channel is 1 for opus and stereo=1, we fail.
1160TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001161 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001162 cricket::AudioSendParameters parameters;
1163 parameters.codecs.push_back(kOpusCodec);
1164 parameters.codecs[0].bitrate = 0;
1165 parameters.codecs[0].channels = 1;
1166 parameters.codecs[0].params["stereo"] = "1";
1167 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168}
1169
1170// Test that with bitrate=0 and no stereo,
1171// channels and bitrate are 1 and 32000.
1172TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001173 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001175 cricket::AudioSendParameters parameters;
1176 parameters.codecs.push_back(kOpusCodec);
1177 parameters.codecs[0].bitrate = 0;
1178 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 webrtc::CodecInst gcodec;
1180 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1181 EXPECT_STREQ("opus", gcodec.plname);
1182 EXPECT_EQ(1, gcodec.channels);
1183 EXPECT_EQ(32000, gcodec.rate);
1184}
1185
1186// Test that with bitrate=0 and stereo=0,
1187// channels and bitrate are 1 and 32000.
1188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001189 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001190 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001191 cricket::AudioSendParameters parameters;
1192 parameters.codecs.push_back(kOpusCodec);
1193 parameters.codecs[0].bitrate = 0;
1194 parameters.codecs[0].params["stereo"] = "0";
1195 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001196 webrtc::CodecInst gcodec;
1197 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1198 EXPECT_STREQ("opus", gcodec.plname);
1199 EXPECT_EQ(1, gcodec.channels);
1200 EXPECT_EQ(32000, gcodec.rate);
1201}
1202
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001203// Test that with bitrate=invalid and stereo=0,
1204// channels and bitrate are 1 and 32000.
1205TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001206 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001207 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001211 webrtc::CodecInst gcodec;
1212
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001213 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001214 parameters.codecs[0].bitrate = 5999;
1215 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1217 EXPECT_STREQ("opus", gcodec.plname);
1218 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001219 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001220
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001221 parameters.codecs[0].bitrate = 510001;
1222 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001223 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1224 EXPECT_STREQ("opus", gcodec.plname);
1225 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001226 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001227}
1228
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001229// Test that with bitrate=0 and stereo=1,
1230// channels and bitrate are 2 and 64000.
1231TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001232 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001233 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001234 cricket::AudioSendParameters parameters;
1235 parameters.codecs.push_back(kOpusCodec);
1236 parameters.codecs[0].bitrate = 0;
1237 parameters.codecs[0].params["stereo"] = "1";
1238 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239 webrtc::CodecInst gcodec;
1240 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1241 EXPECT_STREQ("opus", gcodec.plname);
1242 EXPECT_EQ(2, gcodec.channels);
1243 EXPECT_EQ(64000, gcodec.rate);
1244}
1245
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001246// Test that with bitrate=invalid and stereo=1,
1247// channels and bitrate are 2 and 64000.
1248TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001249 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001250 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001251 cricket::AudioSendParameters parameters;
1252 parameters.codecs.push_back(kOpusCodec);
1253 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001254 webrtc::CodecInst gcodec;
1255
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001256 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001257 parameters.codecs[0].bitrate = 5999;
1258 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001259 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1260 EXPECT_STREQ("opus", gcodec.plname);
1261 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001262 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001263
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001264 parameters.codecs[0].bitrate = 510001;
1265 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001266 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1267 EXPECT_STREQ("opus", gcodec.plname);
1268 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001269 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001270}
1271
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272// Test that with bitrate=N and stereo unset,
1273// channels and bitrate are 1 and N.
1274TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001275 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001276 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 cricket::AudioSendParameters parameters;
1278 parameters.codecs.push_back(kOpusCodec);
1279 parameters.codecs[0].bitrate = 96000;
1280 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001281 webrtc::CodecInst gcodec;
1282 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1283 EXPECT_EQ(111, gcodec.pltype);
1284 EXPECT_EQ(96000, gcodec.rate);
1285 EXPECT_STREQ("opus", gcodec.plname);
1286 EXPECT_EQ(1, gcodec.channels);
1287 EXPECT_EQ(48000, gcodec.plfreq);
1288}
1289
1290// Test that with bitrate=N and stereo=0,
1291// channels and bitrate are 1 and N.
1292TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001293 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001294 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001295 cricket::AudioSendParameters parameters;
1296 parameters.codecs.push_back(kOpusCodec);
1297 parameters.codecs[0].bitrate = 30000;
1298 parameters.codecs[0].params["stereo"] = "0";
1299 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300 webrtc::CodecInst gcodec;
1301 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1302 EXPECT_EQ(1, gcodec.channels);
1303 EXPECT_EQ(30000, gcodec.rate);
1304 EXPECT_STREQ("opus", gcodec.plname);
1305}
1306
1307// Test that with bitrate=N and without any parameters,
1308// channels and bitrate are 1 and N.
1309TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001310 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001311 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001312 cricket::AudioSendParameters parameters;
1313 parameters.codecs.push_back(kOpusCodec);
1314 parameters.codecs[0].bitrate = 30000;
1315 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001316 webrtc::CodecInst gcodec;
1317 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1318 EXPECT_EQ(1, gcodec.channels);
1319 EXPECT_EQ(30000, gcodec.rate);
1320 EXPECT_STREQ("opus", gcodec.plname);
1321}
1322
1323// Test that with bitrate=N and stereo=1,
1324// channels and bitrate are 2 and N.
1325TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001326 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001328 cricket::AudioSendParameters parameters;
1329 parameters.codecs.push_back(kOpusCodec);
1330 parameters.codecs[0].bitrate = 30000;
1331 parameters.codecs[0].params["stereo"] = "1";
1332 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001333 webrtc::CodecInst gcodec;
1334 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1335 EXPECT_EQ(2, gcodec.channels);
1336 EXPECT_EQ(30000, gcodec.rate);
1337 EXPECT_STREQ("opus", gcodec.plname);
1338}
1339
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001340// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1341// Also test that the "maxaveragebitrate" can't be set to values outside the
1342// range of 6000 and 510000
1343TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001344 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001346 cricket::AudioSendParameters parameters;
1347 parameters.codecs.push_back(kOpusCodec);
1348 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001349 webrtc::CodecInst gcodec;
1350
1351 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1353 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001354 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001355 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001356
1357 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001358 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1359 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001360 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001361 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001362
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1364 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001365 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1366 EXPECT_EQ(200000, gcodec.rate);
1367}
1368
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001369// Test that we can enable NACK with opus as caller.
1370TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001371 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001372 cricket::AudioSendParameters parameters;
1373 parameters.codecs.push_back(kOpusCodec);
1374 parameters.codecs[0].AddFeedbackParam(
1375 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1376 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001377 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001378 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001379 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001380}
1381
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001382// Test that we can enable NACK with opus as callee.
1383TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001384 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001385 cricket::AudioSendParameters parameters;
1386 parameters.codecs.push_back(kOpusCodec);
1387 parameters.codecs[0].AddFeedbackParam(
1388 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1389 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001390 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001391 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001392 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001393 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001394
1395 EXPECT_TRUE(channel_->AddSendStream(
1396 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001397 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001398}
1399
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001400// Test that we can enable NACK on receive streams.
1401TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001402 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001403 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 cricket::AudioSendParameters parameters;
1405 parameters.codecs.push_back(kOpusCodec);
1406 parameters.codecs[0].AddFeedbackParam(
1407 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1408 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001409 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001410 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001411 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001412 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001413 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414}
1415
1416// Test that we can disable NACK.
1417TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001418 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001419 cricket::AudioSendParameters parameters;
1420 parameters.codecs.push_back(kOpusCodec);
1421 parameters.codecs[0].AddFeedbackParam(
1422 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1423 cricket::kParamValueEmpty));
1424 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001425 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001426
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001427 parameters.codecs.clear();
1428 parameters.codecs.push_back(kOpusCodec);
1429 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001430 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001431}
1432
1433// Test that we can disable NACK on receive streams.
1434TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001435 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001436 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001437 cricket::AudioSendParameters parameters;
1438 parameters.codecs.push_back(kOpusCodec);
1439 parameters.codecs[0].AddFeedbackParam(
1440 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1441 cricket::kParamValueEmpty));
1442 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001443 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001444 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001446 parameters.codecs.clear();
1447 parameters.codecs.push_back(kOpusCodec);
1448 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001449 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001450 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001451}
1452
1453// Test that NACK is enabled on a new receive stream.
1454TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001455 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001456 cricket::AudioSendParameters parameters;
1457 parameters.codecs.push_back(kIsacCodec);
1458 parameters.codecs.push_back(kCn16000Codec);
1459 parameters.codecs[0].AddFeedbackParam(
1460 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1461 cricket::kParamValueEmpty));
1462 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001463 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001464
solenberg8189b022016-06-14 12:13:00 -07001465 EXPECT_TRUE(AddRecvStream(kSsrc2));
1466 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1467 EXPECT_TRUE(AddRecvStream(kSsrc3));
1468 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469}
1470
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001471// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001472TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001473 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001474 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001475 cricket::AudioSendParameters parameters;
1476 parameters.codecs.push_back(kOpusCodec);
1477 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001478 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1479}
1480
1481// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001482TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001483 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001484 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters parameters;
1486 parameters.codecs.push_back(kOpusCodec);
1487 parameters.codecs[0].bitrate = 0;
1488 parameters.codecs[0].params["useinbandfec"] = "0";
1489 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001490 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1491 webrtc::CodecInst gcodec;
1492 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1493 EXPECT_STREQ("opus", gcodec.plname);
1494 EXPECT_EQ(1, gcodec.channels);
1495 EXPECT_EQ(32000, gcodec.rate);
1496}
1497
1498// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001499TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001500 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001501 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001502 cricket::AudioSendParameters parameters;
1503 parameters.codecs.push_back(kOpusCodec);
1504 parameters.codecs[0].bitrate = 0;
1505 parameters.codecs[0].params["useinbandfec"] = "1";
1506 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001507 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1508 webrtc::CodecInst gcodec;
1509 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1510 EXPECT_STREQ("opus", gcodec.plname);
1511 EXPECT_EQ(1, gcodec.channels);
1512 EXPECT_EQ(32000, gcodec.rate);
1513}
1514
1515// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001516TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001517 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001518 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001519 cricket::AudioSendParameters parameters;
1520 parameters.codecs.push_back(kOpusCodec);
1521 parameters.codecs[0].bitrate = 0;
1522 parameters.codecs[0].params["stereo"] = "1";
1523 parameters.codecs[0].params["useinbandfec"] = "1";
1524 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001525 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1526 webrtc::CodecInst gcodec;
1527 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1528 EXPECT_STREQ("opus", gcodec.plname);
1529 EXPECT_EQ(2, gcodec.channels);
1530 EXPECT_EQ(64000, gcodec.rate);
1531}
1532
1533// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001534TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001535 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001536 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001537 cricket::AudioSendParameters parameters;
1538 parameters.codecs.push_back(kIsacCodec);
1539 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001540 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1541}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001542
1543// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1544TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001545 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001546 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001547 cricket::AudioSendParameters parameters;
1548 parameters.codecs.push_back(kIsacCodec);
1549 parameters.codecs[0].params["useinbandfec"] = "1";
1550 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001551 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1552}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001553
1554// Test that Opus FEC status can be changed.
1555TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001556 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001557 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001558 cricket::AudioSendParameters parameters;
1559 parameters.codecs.push_back(kOpusCodec);
1560 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001561 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001562 parameters.codecs[0].params["useinbandfec"] = "1";
1563 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001564 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1565}
1566
stefanba4c0e42016-02-04 04:12:24 -08001567TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001568 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001569 cricket::AudioSendParameters send_parameters;
1570 send_parameters.codecs.push_back(kOpusCodec);
1571 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1572 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1573
1574 cricket::AudioRecvParameters recv_parameters;
1575 recv_parameters.codecs.push_back(kIsacCodec);
1576 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001577 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001578 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1579 EXPECT_FALSE(
1580 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1581
ossudedfd282016-06-14 07:12:39 -07001582 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001583 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1584 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1585 EXPECT_TRUE(
1586 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1587}
1588
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001589// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1590TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001591 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001592 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001593 cricket::AudioSendParameters parameters;
1594 parameters.codecs.push_back(kOpusCodec);
1595 parameters.codecs[0].bitrate = 0;
1596 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1597 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598 EXPECT_EQ(cricket::kOpusBandwidthNb,
1599 voe_.GetMaxEncodingBandwidth(channel_num));
1600 webrtc::CodecInst gcodec;
1601 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1602 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001603
1604 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1606 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001607 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1608 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001609}
1610
1611// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1612TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001613 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001614 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 cricket::AudioSendParameters parameters;
1616 parameters.codecs.push_back(kOpusCodec);
1617 parameters.codecs[0].bitrate = 0;
1618 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1619 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001620 EXPECT_EQ(cricket::kOpusBandwidthMb,
1621 voe_.GetMaxEncodingBandwidth(channel_num));
1622 webrtc::CodecInst gcodec;
1623 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1624 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001625
1626 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001627 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1628 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001629 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1630 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001631}
1632
1633// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1634TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001635 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001636 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001637 cricket::AudioSendParameters parameters;
1638 parameters.codecs.push_back(kOpusCodec);
1639 parameters.codecs[0].bitrate = 0;
1640 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001642 EXPECT_EQ(cricket::kOpusBandwidthWb,
1643 voe_.GetMaxEncodingBandwidth(channel_num));
1644 webrtc::CodecInst gcodec;
1645 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1646 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001647
1648 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1650 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001651 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1652 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001653}
1654
1655// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1656TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001657 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001658 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001659 cricket::AudioSendParameters parameters;
1660 parameters.codecs.push_back(kOpusCodec);
1661 parameters.codecs[0].bitrate = 0;
1662 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001664 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1665 voe_.GetMaxEncodingBandwidth(channel_num));
1666 webrtc::CodecInst gcodec;
1667 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1668 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001669
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001670 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001671 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1672 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001673 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1674 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001675}
1676
1677// Test 24000 < maxplaybackrate triggers Opus full band mode.
1678TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001679 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001680 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kOpusCodec);
1683 parameters.codecs[0].bitrate = 0;
1684 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1685 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001686 EXPECT_EQ(cricket::kOpusBandwidthFb,
1687 voe_.GetMaxEncodingBandwidth(channel_num));
1688 webrtc::CodecInst gcodec;
1689 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1690 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001691
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001692 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001693 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1694 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001695 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1696 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001697}
1698
1699// Test Opus that without maxplaybackrate, default playback rate is used.
1700TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001701 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001702 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 cricket::AudioSendParameters parameters;
1704 parameters.codecs.push_back(kOpusCodec);
1705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001706 EXPECT_EQ(cricket::kOpusBandwidthFb,
1707 voe_.GetMaxEncodingBandwidth(channel_num));
1708}
1709
1710// Test the with non-Opus, maxplaybackrate has no effect.
1711TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001712 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001713 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001714 cricket::AudioSendParameters parameters;
1715 parameters.codecs.push_back(kIsacCodec);
1716 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1717 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001718 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1719}
1720
1721// Test maxplaybackrate can be set on two streams.
1722TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001723 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001724 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 cricket::AudioSendParameters parameters;
1726 parameters.codecs.push_back(kOpusCodec);
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001728 // Default bandwidth is 24000.
1729 EXPECT_EQ(cricket::kOpusBandwidthFb,
1730 voe_.GetMaxEncodingBandwidth(channel_num));
1731
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001733
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001734 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001735 EXPECT_EQ(cricket::kOpusBandwidthNb,
1736 voe_.GetMaxEncodingBandwidth(channel_num));
1737
1738 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1739 channel_num = voe_.GetLastChannel();
1740 EXPECT_EQ(cricket::kOpusBandwidthNb,
1741 voe_.GetMaxEncodingBandwidth(channel_num));
1742}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001743
Minyue Li7100dcd2015-03-27 05:05:59 +01001744// Test that with usedtx=0, Opus DTX is off.
1745TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001746 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001747 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001748 cricket::AudioSendParameters parameters;
1749 parameters.codecs.push_back(kOpusCodec);
1750 parameters.codecs[0].params["usedtx"] = "0";
1751 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001752 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1753}
1754
1755// Test that with usedtx=1, Opus DTX is on.
1756TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001757 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001758 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001759 cricket::AudioSendParameters parameters;
1760 parameters.codecs.push_back(kOpusCodec);
1761 parameters.codecs[0].params["usedtx"] = "1";
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001763 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1764 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1765}
1766
1767// Test that usedtx=1 works with stereo Opus.
1768TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001769 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001770 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001771 cricket::AudioSendParameters parameters;
1772 parameters.codecs.push_back(kOpusCodec);
1773 parameters.codecs[0].params["usedtx"] = "1";
1774 parameters.codecs[0].params["stereo"] = "1";
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001776 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1777 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1778}
1779
1780// Test that usedtx=1 does not work with non Opus.
1781TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001782 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001783 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001784 cricket::AudioSendParameters parameters;
1785 parameters.codecs.push_back(kIsacCodec);
1786 parameters.codecs[0].params["usedtx"] = "1";
1787 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001788 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1789}
1790
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001791// Test that we can switch back and forth between Opus and ISAC with CN.
1792TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001793 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001795 cricket::AudioSendParameters opus_parameters;
1796 opus_parameters.codecs.push_back(kOpusCodec);
1797 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 webrtc::CodecInst gcodec;
1799 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001800 EXPECT_EQ(111, gcodec.pltype);
1801 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001803 cricket::AudioSendParameters isac_parameters;
1804 isac_parameters.codecs.push_back(kIsacCodec);
1805 isac_parameters.codecs.push_back(kCn16000Codec);
1806 isac_parameters.codecs.push_back(kOpusCodec);
1807 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1809 EXPECT_EQ(103, gcodec.pltype);
1810 EXPECT_STREQ("ISAC", gcodec.plname);
1811
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001812 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001814 EXPECT_EQ(111, gcodec.pltype);
1815 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816}
1817
1818// Test that we handle various ways of specifying bitrate.
1819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001820 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 cricket::AudioSendParameters parameters;
1823 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1824 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 webrtc::CodecInst gcodec;
1826 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1827 EXPECT_EQ(103, gcodec.pltype);
1828 EXPECT_STREQ("ISAC", gcodec.plname);
1829 EXPECT_EQ(32000, gcodec.rate);
1830
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001831 parameters.codecs[0].bitrate = 0; // bitrate == default
1832 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1834 EXPECT_EQ(103, gcodec.pltype);
1835 EXPECT_STREQ("ISAC", gcodec.plname);
1836 EXPECT_EQ(-1, gcodec.rate);
1837
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001838 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1839 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1841 EXPECT_EQ(103, gcodec.pltype);
1842 EXPECT_STREQ("ISAC", gcodec.plname);
1843 EXPECT_EQ(28000, gcodec.rate);
1844
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001845 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1846 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1848 EXPECT_EQ(0, gcodec.pltype);
1849 EXPECT_STREQ("PCMU", gcodec.plname);
1850 EXPECT_EQ(64000, gcodec.rate);
1851
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 parameters.codecs[0].bitrate = 0; // bitrate == default
1853 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001854 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1855 EXPECT_EQ(0, gcodec.pltype);
1856 EXPECT_STREQ("PCMU", gcodec.plname);
1857 EXPECT_EQ(64000, gcodec.rate);
1858
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001859 parameters.codecs[0] = kOpusCodec;
1860 parameters.codecs[0].bitrate = 0; // bitrate == default
1861 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1863 EXPECT_EQ(111, gcodec.pltype);
1864 EXPECT_STREQ("opus", gcodec.plname);
1865 EXPECT_EQ(32000, gcodec.rate);
1866}
1867
Brave Yao5225dd82015-03-26 07:39:19 +08001868// Test that we could set packet size specified in kCodecParamPTime.
1869TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001870 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001871 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001872 cricket::AudioSendParameters parameters;
1873 parameters.codecs.push_back(kOpusCodec);
1874 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1875 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001876 webrtc::CodecInst gcodec;
1877 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1878 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1879
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001880 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1881 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1883 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1884
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001885 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1886 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001887 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1888 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1889
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001890 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1891 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001893 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1894 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1895
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1897 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1898 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001899 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1900 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1901}
1902
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001903// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001905 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001906 cricket::AudioSendParameters parameters;
1907 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001908}
1909
1910// Test that we can set send codecs even with telephone-event codec as the first
1911// one on the list.
1912TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001913 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001915 cricket::AudioSendParameters parameters;
1916 parameters.codecs.push_back(kTelephoneEventCodec);
1917 parameters.codecs.push_back(kIsacCodec);
1918 parameters.codecs.push_back(kPcmuCodec);
1919 parameters.codecs[0].id = 98; // DTMF
1920 parameters.codecs[1].id = 96;
1921 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 webrtc::CodecInst gcodec;
1923 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001924 EXPECT_EQ(96, gcodec.pltype);
1925 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001926 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001927}
1928
solenberg31642aa2016-03-14 08:00:37 -07001929// Test that payload type range is limited for telephone-event codec.
1930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001931 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001932 cricket::AudioSendParameters parameters;
1933 parameters.codecs.push_back(kTelephoneEventCodec);
1934 parameters.codecs.push_back(kIsacCodec);
1935 parameters.codecs[0].id = 0; // DTMF
1936 parameters.codecs[1].id = 96;
1937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1938 EXPECT_TRUE(channel_->CanInsertDtmf());
1939 parameters.codecs[0].id = 128; // DTMF
1940 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1941 EXPECT_FALSE(channel_->CanInsertDtmf());
1942 parameters.codecs[0].id = 127;
1943 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1944 EXPECT_TRUE(channel_->CanInsertDtmf());
1945 parameters.codecs[0].id = -1; // DTMF
1946 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1947 EXPECT_FALSE(channel_->CanInsertDtmf());
1948}
1949
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001950// Test that we can set send codecs even with CN codec as the first
1951// one on the list.
1952TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001953 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001954 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001955 cricket::AudioSendParameters parameters;
1956 parameters.codecs.push_back(kCn16000Codec);
1957 parameters.codecs.push_back(kIsacCodec);
1958 parameters.codecs.push_back(kPcmuCodec);
1959 parameters.codecs[0].id = 98; // wideband CN
1960 parameters.codecs[1].id = 96;
1961 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001962 webrtc::CodecInst gcodec;
1963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1964 EXPECT_EQ(96, gcodec.pltype);
1965 EXPECT_STREQ("ISAC", gcodec.plname);
1966 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967}
1968
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001969// Test that we set VAD and DTMF types correctly as caller.
1970TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001971 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 cricket::AudioSendParameters parameters;
1974 parameters.codecs.push_back(kIsacCodec);
1975 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001976 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001977 parameters.codecs.push_back(kCn16000Codec);
1978 parameters.codecs.push_back(kCn8000Codec);
1979 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001980 parameters.codecs[0].id = 96;
1981 parameters.codecs[2].id = 97; // wideband CN
1982 parameters.codecs[4].id = 98; // DTMF
1983 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001984 webrtc::CodecInst gcodec;
1985 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1986 EXPECT_EQ(96, gcodec.pltype);
1987 EXPECT_STREQ("ISAC", gcodec.plname);
1988 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001989 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1990 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001991 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992}
1993
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001994// Test that we set VAD and DTMF types correctly as callee.
1995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001996 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001997 cricket::AudioSendParameters parameters;
1998 parameters.codecs.push_back(kIsacCodec);
1999 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002000 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002001 parameters.codecs.push_back(kCn16000Codec);
2002 parameters.codecs.push_back(kCn8000Codec);
2003 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002004 parameters.codecs[0].id = 96;
2005 parameters.codecs[2].id = 97; // wideband CN
2006 parameters.codecs[4].id = 98; // DTMF
2007 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002008 EXPECT_TRUE(channel_->AddSendStream(
2009 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07002010 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002011
2012 webrtc::CodecInst gcodec;
2013 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2014 EXPECT_EQ(96, gcodec.pltype);
2015 EXPECT_STREQ("ISAC", gcodec.plname);
2016 EXPECT_TRUE(voe_.GetVAD(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002017 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2018 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002019 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002020}
2021
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022// Test that we only apply VAD if we have a CN codec that matches the
2023// send codec clockrate.
2024TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002025 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002026 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002027 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002028 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002029 parameters.codecs.push_back(kIsacCodec);
2030 parameters.codecs.push_back(kCn16000Codec);
2031 parameters.codecs[1].id = 97;
2032 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002033 webrtc::CodecInst gcodec;
2034 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2035 EXPECT_STREQ("ISAC", gcodec.plname);
2036 EXPECT_TRUE(voe_.GetVAD(channel_num));
2037 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2038 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002039 parameters.codecs[0] = kPcmuCodec;
2040 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002041 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2042 EXPECT_STREQ("PCMU", gcodec.plname);
2043 EXPECT_FALSE(voe_.GetVAD(channel_num));
2044 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002045 parameters.codecs[1] = kCn8000Codec;
2046 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002047 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2048 EXPECT_STREQ("PCMU", gcodec.plname);
2049 EXPECT_TRUE(voe_.GetVAD(channel_num));
2050 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08002051 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002052 parameters.codecs[0] = kIsacCodec;
2053 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002054 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2055 EXPECT_STREQ("ISAC", gcodec.plname);
2056 EXPECT_FALSE(voe_.GetVAD(channel_num));
2057}
2058
2059// Test that we perform case-insensitive matching of codec names.
2060TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002061 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002063 cricket::AudioSendParameters parameters;
2064 parameters.codecs.push_back(kIsacCodec);
2065 parameters.codecs.push_back(kPcmuCodec);
2066 parameters.codecs.push_back(kCn16000Codec);
2067 parameters.codecs.push_back(kCn8000Codec);
2068 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002069 parameters.codecs[0].name = "iSaC";
2070 parameters.codecs[0].id = 96;
2071 parameters.codecs[2].id = 97; // wideband CN
2072 parameters.codecs[4].id = 98; // DTMF
2073 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002074 webrtc::CodecInst gcodec;
2075 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2076 EXPECT_EQ(96, gcodec.pltype);
2077 EXPECT_STREQ("ISAC", gcodec.plname);
2078 EXPECT_TRUE(voe_.GetVAD(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
2080 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002081 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002082}
2083
stefanba4c0e42016-02-04 04:12:24 -08002084class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2085 public:
2086 WebRtcVoiceEngineWithSendSideBweTest()
2087 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2088};
2089
2090TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2091 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002092 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002093 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002094 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2095 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2096 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002097 extension.id);
2098 return;
2099 }
2100 }
2101 FAIL() << "Transport sequence number extension not in header-extension list.";
2102}
2103
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002104// Test support for audio level header extension.
2105TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002106 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002107}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002108TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002109 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002110}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002111
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002112// Test support for absolute send time header extension.
2113TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002114 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002115}
2116TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002117 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118}
2119
solenberg1ac56142015-10-13 03:58:19 -07002120// Test that we can create a channel and start sending on it.
2121TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002122 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002123 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002124 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002125 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002126 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002127 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2128}
2129
2130// Test that a channel will send if and only if it has a source and is enabled
2131// for sending.
2132TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002133 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002134 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2135 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002136 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002137 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2138 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2139 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2140 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2141 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002142}
2143
solenberg94218532016-06-16 10:53:22 -07002144// Test that a channel is muted/unmuted.
2145TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2146 EXPECT_TRUE(SetupSendStream());
2147 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2148 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2149 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2150 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2151 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2152 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2153}
2154
solenberg6d6e7c52016-04-13 09:07:30 -07002155// Test that SetSendParameters() does not alter a stream's send state.
2156TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2157 EXPECT_TRUE(SetupSendStream());
2158 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2159
2160 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002161 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002162 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2163
2164 // Changing RTP header extensions will recreate the AudioSendStream.
2165 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002166 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002167 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2168 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2169
2170 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002171 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002172 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2173
2174 // Changing RTP header extensions will recreate the AudioSendStream.
2175 send_parameters_.extensions.clear();
2176 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2177 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2178}
2179
solenberg1ac56142015-10-13 03:58:19 -07002180// Test that we can create a channel and start playing out on it.
2181TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002182 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002183 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002184 channel_->SetPlayout(true);
2185 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2186 channel_->SetPlayout(false);
2187 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002188}
2189
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002190// Test that we can add and remove send streams.
2191TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2192 SetupForMultiSendStream();
2193
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002194 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002195 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002196
solenbergc96df772015-10-21 13:01:53 -07002197 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002198 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002199 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002200 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002201 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002202 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002203 }
tfarina5237aaf2015-11-10 23:44:30 -08002204 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002205
solenbergc96df772015-10-21 13:01:53 -07002206 // Delete the send streams.
2207 for (uint32_t ssrc : kSsrcs4) {
2208 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002209 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002210 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002211 }
solenbergc96df772015-10-21 13:01:53 -07002212 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213}
2214
2215// Test SetSendCodecs correctly configure the codecs in all send streams.
2216TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2217 SetupForMultiSendStream();
2218
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002219 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002220 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002221 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002222 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002223 }
2224
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002225 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002226 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002227 parameters.codecs.push_back(kIsacCodec);
2228 parameters.codecs.push_back(kCn16000Codec);
2229 parameters.codecs[1].id = 97;
2230 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002231
2232 // Verify ISAC and VAD are corrected configured on all send channels.
2233 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002234 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002235 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002236 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2237 EXPECT_STREQ("ISAC", gcodec.plname);
2238 EXPECT_TRUE(voe_.GetVAD(channel_num));
2239 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2240 }
2241
2242 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002243 parameters.codecs[0] = kPcmuCodec;
2244 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002245 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002246 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002247 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2248 EXPECT_STREQ("PCMU", gcodec.plname);
2249 EXPECT_FALSE(voe_.GetVAD(channel_num));
2250 }
2251}
2252
2253// Test we can SetSend on all send streams correctly.
2254TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2255 SetupForMultiSendStream();
2256
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002257 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002258 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002260 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002261 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2262 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002263 }
2264
2265 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002266 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002267 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002268 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002269 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002270 }
2271
2272 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002273 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002274 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002275 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002276 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002277 }
2278}
2279
2280// Test we can set the correct statistics on all send streams.
2281TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2282 SetupForMultiSendStream();
2283
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002284 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002285 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002286 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002287 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002288 }
solenberg85a04962015-10-27 03:35:21 -07002289
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002290 // Create a receive stream to check that none of the send streams end up in
2291 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002292 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002293
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002294 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002295 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2296 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002297 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002298
solenberg85a04962015-10-27 03:35:21 -07002299 // Check stats for the added streams.
2300 {
2301 cricket::VoiceMediaInfo info;
2302 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002303
solenberg85a04962015-10-27 03:35:21 -07002304 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002305 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002306 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002307 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002308 }
2309
2310 // We have added one receive stream. We should see empty stats.
2311 EXPECT_EQ(info.receivers.size(), 1u);
2312 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002313 }
solenberg1ac56142015-10-13 03:58:19 -07002314
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002315 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002316 {
2317 cricket::VoiceMediaInfo info;
2318 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2319 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002320 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002321 EXPECT_EQ(0u, info.receivers.size());
2322 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002323
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002324 // Deliver a new packet - a default receive stream should be created and we
2325 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002326 {
2327 cricket::VoiceMediaInfo info;
2328 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2329 SetAudioReceiveStreamStats();
2330 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002331 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002332 EXPECT_EQ(1u, info.receivers.size());
2333 VerifyVoiceReceiverInfo(info.receivers[0]);
2334 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002335}
2336
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002337// Test that we can add and remove receive streams, and do proper send/playout.
2338// We can receive on multiple streams while sending one stream.
2339TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002340 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341
solenberg1ac56142015-10-13 03:58:19 -07002342 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002343 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002344 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002345
solenberg1ac56142015-10-13 03:58:19 -07002346 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002347 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenbergd53a3f92016-04-14 13:56:37 -07002348 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002349 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350
solenberg1ac56142015-10-13 03:58:19 -07002351 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002352 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353
2354 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002355 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002356 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2357 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358
2359 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002360 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002361 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362
2363 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002364 channel_->SetPlayout(false);
2365 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2366 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367
aleloi84ef6152016-08-04 05:28:21 -07002368 // Restart playout and make sure recv streams are played out.
2369 channel_->SetPlayout(true);
2370 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2371 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372
aleloi84ef6152016-08-04 05:28:21 -07002373 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2375 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376}
2377
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002379// and start sending on it.
2380TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002381 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002382 cricket::AudioOptions options_adjust_agc;
2383 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 webrtc::AgcConfig agc_config;
2385 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2386 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002387 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002388 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002389 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002390 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2392 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002393 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002394 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396}
2397
wu@webrtc.org97077a32013-10-25 21:18:33 +00002398TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002399 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002400 EXPECT_CALL(adm_,
2401 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002402 webrtc::AgcConfig agc_config;
2403 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2404 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002405 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2406 send_parameters_.options.tx_agc_digital_compression_gain =
2407 rtc::Optional<uint16_t>(9);
2408 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2409 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2410 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002411 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2412 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2413 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2414 EXPECT_TRUE(agc_config.limiterEnable);
2415
2416 // Check interaction with adjust_agc_delta. Both should be respected, for
2417 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002418 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2419 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002420 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2421 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2422}
2423
wu@webrtc.org97077a32013-10-25 21:18:33 +00002424TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002425 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002426 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2427 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002428 send_parameters_.options.recording_sample_rate =
2429 rtc::Optional<uint32_t>(48000);
2430 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2431 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002432}
2433
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002434// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002435// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002437 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002438 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439}
2440
2441TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2442 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002443 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002444 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002445 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002446 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002447 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2448 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002449 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450
solenberg85a04962015-10-27 03:35:21 -07002451 // Check stats for the added streams.
2452 {
2453 cricket::VoiceMediaInfo info;
2454 EXPECT_EQ(true, channel_->GetStats(&info));
2455
2456 // We have added one send stream. We should see the stats we've set.
2457 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002458 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002459 // We have added one receive stream. We should see empty stats.
2460 EXPECT_EQ(info.receivers.size(), 1u);
2461 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2462 }
solenberg1ac56142015-10-13 03:58:19 -07002463
solenberg566ef242015-11-06 15:34:49 -08002464 // Start sending - this affects some reported stats.
2465 {
2466 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002467 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002468 EXPECT_EQ(true, channel_->GetStats(&info));
2469 VerifyVoiceSenderInfo(info.senders[0], true);
2470 }
2471
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002472 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002473 {
2474 cricket::VoiceMediaInfo info;
2475 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2476 EXPECT_EQ(true, channel_->GetStats(&info));
2477 EXPECT_EQ(1u, info.senders.size());
2478 EXPECT_EQ(0u, info.receivers.size());
2479 }
solenberg1ac56142015-10-13 03:58:19 -07002480
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002481 // Deliver a new packet - a default receive stream should be created and we
2482 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002483 {
2484 cricket::VoiceMediaInfo info;
2485 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2486 SetAudioReceiveStreamStats();
2487 EXPECT_EQ(true, channel_->GetStats(&info));
2488 EXPECT_EQ(1u, info.senders.size());
2489 EXPECT_EQ(1u, info.receivers.size());
2490 VerifyVoiceReceiverInfo(info.receivers[0]);
2491 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492}
2493
2494// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002495// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002497 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002498 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002499 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002500 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501}
2502
2503// Test that the local SSRC is the same on sending and receiving channels if the
2504// receive channel is created before the send channel.
2505TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002506 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002507 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002509 cricket::StreamParams::CreateLegacy(kSsrc1)));
2510 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2511 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512}
2513
2514// Test that we can properly receive packets.
2515TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002516 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002517 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002519
2520 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2521 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002522}
2523
2524// Test that we can properly receive packets on multiple streams.
2525TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002526 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002527 const uint32_t ssrc1 = 1;
2528 const uint32_t ssrc2 = 2;
2529 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002530 EXPECT_TRUE(AddRecvStream(ssrc1));
2531 EXPECT_TRUE(AddRecvStream(ssrc2));
2532 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002533 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002534 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002535 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002537 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002538 }
mflodman3d7db262016-04-29 00:57:13 -07002539
2540 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2541 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2542 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2543
2544 EXPECT_EQ(s1.received_packets(), 0);
2545 EXPECT_EQ(s2.received_packets(), 0);
2546 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002547
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002549 EXPECT_EQ(s1.received_packets(), 0);
2550 EXPECT_EQ(s2.received_packets(), 0);
2551 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002552
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002553 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002554 EXPECT_EQ(s1.received_packets(), 1);
2555 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2556 EXPECT_EQ(s2.received_packets(), 0);
2557 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002558
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002560 EXPECT_EQ(s1.received_packets(), 1);
2561 EXPECT_EQ(s2.received_packets(), 1);
2562 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2563 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002564
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002565 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002566 EXPECT_EQ(s1.received_packets(), 1);
2567 EXPECT_EQ(s2.received_packets(), 1);
2568 EXPECT_EQ(s3.received_packets(), 1);
2569 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002570
mflodman3d7db262016-04-29 00:57:13 -07002571 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2572 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2573 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002574}
2575
solenberg7e63ef02015-11-20 00:19:43 -08002576// Test that receiving on an unsignalled stream works (default channel will be
2577// created).
2578TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002579 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002580 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2581
solenberg7e63ef02015-11-20 00:19:43 -08002582 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002583
2584 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2585 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2586 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002587}
2588
2589// Test that receiving on an unsignalled stream works (default channel will be
2590// created), and that packets will be forwarded to the default channel
2591// regardless of their SSRCs.
2592TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002593 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002594 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002595 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2596
mflodman3d7db262016-04-29 00:57:13 -07002597 // Note that ssrc = 0 is not supported.
2598 uint32_t ssrc = 1;
2599 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002600 rtc::SetBE32(&packet[8], ssrc);
2601 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002602
2603 // Verify we only have one default stream.
2604 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2605 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2606 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002607 }
mflodman3d7db262016-04-29 00:57:13 -07002608
2609 // Sending the same ssrc again should not create a new stream.
2610 --ssrc;
2611 DeliverPacket(packet, sizeof(packet));
2612 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2613 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2614 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002615}
2616
2617// Test that a default channel is created even after a signalled stream has been
2618// added, and that this stream will get any packets for unknown SSRCs.
2619TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002620 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002621 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002622 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2623
2624 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002625 const uint32_t signaled_ssrc = 1;
2626 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002627 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002628 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002629 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2630 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002631
2632 // Note that the first unknown SSRC cannot be 0, because we only support
2633 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002634 const uint32_t unsignaled_ssrc = 7011;
2635 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002636 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002637 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2638 packet, sizeof(packet)));
2639 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2640
2641 DeliverPacket(packet, sizeof(packet));
2642 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2643
2644 rtc::SetBE32(&packet[8], signaled_ssrc);
2645 DeliverPacket(packet, sizeof(packet));
2646 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2647 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002648}
2649
solenberg0a617e22015-10-20 15:49:38 -07002650// Test that we properly handle failures to add a receive stream.
2651TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002652 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002653 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002654 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002655}
2656
solenberg0a617e22015-10-20 15:49:38 -07002657// Test that we properly handle failures to add a send stream.
2658TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002659 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002660 voe_.set_fail_create_channel(true);
2661 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2662}
2663
solenberg1ac56142015-10-13 03:58:19 -07002664// Test that AddRecvStream creates new stream.
2665TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002666 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002668 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002669 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670}
2671
2672// Test that after adding a recv stream, we do not decode more codecs than
2673// those previously passed into SetRecvCodecs.
2674TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002675 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002676 cricket::AudioRecvParameters parameters;
2677 parameters.codecs.push_back(kIsacCodec);
2678 parameters.codecs.push_back(kPcmuCodec);
2679 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002680 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681 int channel_num2 = voe_.GetLastChannel();
2682 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002683 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002684 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 gcodec.channels = 2;
2686 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2687}
2688
2689// Test that we properly clean up any streams that were added, even if
2690// not explicitly removed.
2691TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002692 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002693 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8189b022016-06-14 12:13:00 -07002694 EXPECT_TRUE(AddRecvStream(1));
2695 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002696 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2697 delete channel_;
2698 channel_ = NULL;
2699 EXPECT_EQ(0, voe_.GetNumChannels());
2700}
2701
wu@webrtc.org78187522013-10-07 23:32:02 +00002702TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002703 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002704 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002705}
2706
2707TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002708 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002709 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002710 // Manually delete channel to simulate a failure.
2711 int channel = voe_.GetLastChannel();
2712 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2713 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002714 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002715 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002716 EXPECT_NE(channel, new_channel);
2717 // The last created channel is deleted too.
2718 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002719}
2720
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002721// Test the InsertDtmf on default send stream as caller.
2722TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2723 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002724}
2725
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002726// Test the InsertDtmf on default send stream as callee
2727TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2728 TestInsertDtmf(0, false);
2729}
2730
2731// Test the InsertDtmf on specified send stream as caller.
2732TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2733 TestInsertDtmf(kSsrc1, true);
2734}
2735
2736// Test the InsertDtmf on specified send stream as callee.
2737TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2738 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002739}
2740
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002741TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002742 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002743 EXPECT_CALL(adm_,
2744 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2745 EXPECT_CALL(adm_,
2746 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2747 EXPECT_CALL(adm_,
2748 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002749 bool ec_enabled;
2750 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002751 webrtc::AecmModes aecm_mode;
2752 bool cng_enabled;
2753 bool agc_enabled;
2754 webrtc::AgcModes agc_mode;
2755 webrtc::AgcConfig agc_config;
2756 bool ns_enabled;
2757 webrtc::NsModes ns_mode;
2758 bool highpass_filter_enabled;
2759 bool stereo_swapping_enabled;
2760 bool typing_detection_enabled;
2761 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002762 voe_.GetAecmMode(aecm_mode, cng_enabled);
2763 voe_.GetAgcStatus(agc_enabled, agc_mode);
2764 voe_.GetAgcConfig(agc_config);
2765 voe_.GetNsStatus(ns_enabled, ns_mode);
2766 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2767 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2768 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2769 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002770 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002771 EXPECT_FALSE(cng_enabled);
2772 EXPECT_TRUE(agc_enabled);
2773 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2774 EXPECT_TRUE(ns_enabled);
2775 EXPECT_TRUE(highpass_filter_enabled);
2776 EXPECT_FALSE(stereo_swapping_enabled);
2777 EXPECT_TRUE(typing_detection_enabled);
2778 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2779 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002780 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2781 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002782
solenberg246b8172015-12-08 09:50:23 -08002783 // Nothing set in AudioOptions, so everything should be as default.
2784 send_parameters_.options = cricket::AudioOptions();
2785 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002786 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002787 voe_.GetAecmMode(aecm_mode, cng_enabled);
2788 voe_.GetAgcStatus(agc_enabled, agc_mode);
2789 voe_.GetAgcConfig(agc_config);
2790 voe_.GetNsStatus(ns_enabled, ns_mode);
2791 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2792 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2793 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2794 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002795 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796 EXPECT_FALSE(cng_enabled);
2797 EXPECT_TRUE(agc_enabled);
2798 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2799 EXPECT_TRUE(ns_enabled);
2800 EXPECT_TRUE(highpass_filter_enabled);
2801 EXPECT_FALSE(stereo_swapping_enabled);
2802 EXPECT_TRUE(typing_detection_enabled);
2803 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2804 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002805 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2806 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807
2808 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002809 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2810 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811 voe_.GetEcStatus(ec_enabled, ec_mode);
2812 EXPECT_FALSE(ec_enabled);
2813
2814 // Turn echo cancellation back on, with settings, and make sure
2815 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002816 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2817 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002818 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002819 voe_.GetAecmMode(aecm_mode, cng_enabled);
2820 voe_.GetAgcStatus(agc_enabled, agc_mode);
2821 voe_.GetAgcConfig(agc_config);
2822 voe_.GetNsStatus(ns_enabled, ns_mode);
2823 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2824 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2825 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2826 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002827 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002828 EXPECT_TRUE(agc_enabled);
2829 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2830 EXPECT_TRUE(ns_enabled);
2831 EXPECT_TRUE(highpass_filter_enabled);
2832 EXPECT_FALSE(stereo_swapping_enabled);
2833 EXPECT_TRUE(typing_detection_enabled);
2834 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2835 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2836
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002837 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2838 // control.
solenberg246b8172015-12-08 09:50:23 -08002839 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2840 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002841 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002842 voe_.GetAecmMode(aecm_mode, cng_enabled);
2843 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002844 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002845 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2846
2847 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002848 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2849 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2850 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2851 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002852 voe_.GetEcStatus(ec_enabled, ec_mode);
2853 EXPECT_FALSE(ec_enabled);
2854 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002855 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2856 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002857 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002858 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002859 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002860 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2861
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002862 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002863 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2864 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002865 voe_.GetAgcStatus(agc_enabled, agc_mode);
2866 EXPECT_FALSE(agc_enabled);
2867
2868 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002869 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2870 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2871 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002872 voe_.GetAgcStatus(agc_enabled, agc_mode);
2873 EXPECT_TRUE(agc_enabled);
2874 voe_.GetAgcConfig(agc_config);
2875 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2876
2877 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002878 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2879 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2880 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2881 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2882 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002883 voe_.GetNsStatus(ns_enabled, ns_mode);
2884 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2885 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2886 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2887 EXPECT_FALSE(ns_enabled);
2888 EXPECT_FALSE(highpass_filter_enabled);
2889 EXPECT_FALSE(typing_detection_enabled);
2890 EXPECT_TRUE(stereo_swapping_enabled);
2891
solenberg1ac56142015-10-13 03:58:19 -07002892 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002893 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002894 voe_.GetEcStatus(ec_enabled, ec_mode);
2895 voe_.GetNsStatus(ns_enabled, ns_mode);
2896 EXPECT_TRUE(ec_enabled);
2897 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2898 EXPECT_FALSE(ns_enabled);
2899 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2900}
2901
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002902TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002903 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002904
2905 bool ec_enabled;
2906 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907 bool agc_enabled;
2908 webrtc::AgcModes agc_mode;
2909 bool ns_enabled;
2910 webrtc::NsModes ns_mode;
2911 bool highpass_filter_enabled;
2912 bool stereo_swapping_enabled;
2913 bool typing_detection_enabled;
2914
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002916 voe_.GetAgcStatus(agc_enabled, agc_mode);
2917 voe_.GetNsStatus(ns_enabled, ns_mode);
2918 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2919 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2920 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2921 EXPECT_TRUE(ec_enabled);
2922 EXPECT_TRUE(agc_enabled);
2923 EXPECT_TRUE(ns_enabled);
2924 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002925 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927}
2928
2929TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2930 webrtc::AgcConfig set_config = {0};
2931 set_config.targetLeveldBOv = 3;
2932 set_config.digitalCompressionGaindB = 9;
2933 set_config.limiterEnable = true;
2934 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935
2936 webrtc::AgcConfig config = {0};
2937 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2938 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2939 EXPECT_EQ(set_config.digitalCompressionGaindB,
2940 config.digitalCompressionGaindB);
2941 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2942}
2943
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002945 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002946 EXPECT_CALL(adm_,
2947 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2948 EXPECT_CALL(adm_,
2949 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2950 EXPECT_CALL(adm_,
2951 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2952
kwiberg686a8ef2016-02-26 03:00:35 -08002953 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002954 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002955 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002956 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002957 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002958 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002959
2960 // Have to add a stream to make SetSend work.
2961 cricket::StreamParams stream1;
2962 stream1.ssrcs.push_back(1);
2963 channel1->AddSendStream(stream1);
2964 cricket::StreamParams stream2;
2965 stream2.ssrcs.push_back(2);
2966 channel2->AddSendStream(stream2);
2967
2968 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002969 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002970 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2971 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2972 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002973 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2974 EXPECT_EQ(parameters_options_all.options, channel1->options());
2975 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2976 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002977
2978 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002979 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002980 parameters_options_no_ns.options.noise_suppression =
2981 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002982 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2983 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002984 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2985 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2986 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002987 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002988
2989 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002990 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002991 parameters_options_no_agc.options.auto_gain_control =
2992 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002993 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002994 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2995 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2996 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002997 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998
solenberg246b8172015-12-08 09:50:23 -08002999 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003000 bool ec_enabled;
3001 webrtc::EcModes ec_mode;
3002 bool agc_enabled;
3003 webrtc::AgcModes agc_mode;
3004 bool ns_enabled;
3005 webrtc::NsModes ns_mode;
3006 voe_.GetEcStatus(ec_enabled, ec_mode);
3007 voe_.GetAgcStatus(agc_enabled, agc_mode);
3008 voe_.GetNsStatus(ns_enabled, ns_mode);
3009 EXPECT_TRUE(ec_enabled);
3010 EXPECT_TRUE(agc_enabled);
3011 EXPECT_TRUE(ns_enabled);
3012
solenbergd53a3f92016-04-14 13:56:37 -07003013 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003014 voe_.GetEcStatus(ec_enabled, ec_mode);
3015 voe_.GetAgcStatus(agc_enabled, agc_mode);
3016 voe_.GetNsStatus(ns_enabled, ns_mode);
3017 EXPECT_TRUE(ec_enabled);
3018 EXPECT_TRUE(agc_enabled);
3019 EXPECT_FALSE(ns_enabled);
3020
solenbergd53a3f92016-04-14 13:56:37 -07003021 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003022 voe_.GetEcStatus(ec_enabled, ec_mode);
3023 voe_.GetAgcStatus(agc_enabled, agc_mode);
3024 voe_.GetNsStatus(ns_enabled, ns_mode);
3025 EXPECT_TRUE(ec_enabled);
3026 EXPECT_FALSE(agc_enabled);
3027 EXPECT_TRUE(ns_enabled);
3028
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003029 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08003030 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003031 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3032 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003033 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003034 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003035 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003036 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003037 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003038 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01003039 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3040 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3041 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003042 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003043 voe_.GetEcStatus(ec_enabled, ec_mode);
3044 voe_.GetAgcStatus(agc_enabled, agc_mode);
3045 voe_.GetNsStatus(ns_enabled, ns_mode);
3046 EXPECT_TRUE(ec_enabled);
3047 EXPECT_FALSE(agc_enabled);
3048 EXPECT_FALSE(ns_enabled);
3049}
3050
wu@webrtc.orgde305012013-10-31 15:40:38 +00003051// This test verifies DSCP settings are properly applied on voice media channel.
3052TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003053 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003054 cricket::FakeNetworkInterface network_interface;
3055 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003056 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003057
solenbergbc37fc82016-04-04 09:54:44 -07003058 channel.reset(
3059 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003060 channel->SetInterface(&network_interface);
3061 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3062 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3063
3064 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003065 channel.reset(
3066 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003067 channel->SetInterface(&network_interface);
3068 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3069
3070 // Verify that setting the option to false resets the
3071 // DiffServCodePoint.
3072 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003073 channel.reset(
3074 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003075 channel->SetInterface(&network_interface);
3076 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3077 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3078
3079 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003080}
3081
solenberg1ac56142015-10-13 03:58:19 -07003082TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003083 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003084 cricket::WebRtcVoiceMediaChannel* media_channel =
3085 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003086 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003087 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003088 int channel_id = voe_.GetLastChannel();
3089 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3090 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003091 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003092 int channel_id2 = voe_.GetLastChannel();
3093 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003094}
3095
solenberg1ac56142015-10-13 03:58:19 -07003096TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003097 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003098 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003099 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3100 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3101 EXPECT_TRUE(channel_->AddSendStream(
3102 cricket::StreamParams::CreateLegacy(kSsrc1)));
3103 int channel_id = voe_.GetLastChannel();
3104 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3105 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3106 EXPECT_TRUE(channel_->AddSendStream(
3107 cricket::StreamParams::CreateLegacy(kSsrc2)));
3108 int channel_id2 = voe_.GetLastChannel();
3109 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003110}
3111
solenberg4bac9c52015-10-09 02:32:53 -07003112TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003113 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003114 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003115 cricket::StreamParams stream;
3116 stream.ssrcs.push_back(kSsrc2);
3117 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003118 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003119 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003120 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003121}
3122
3123TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003124 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003125 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3126 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003127 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003128 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003129 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3130 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3131 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003132}
3133
pbos8fc7fa72015-07-15 08:02:58 -07003134TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003135 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003136 const std::string kSyncLabel = "AvSyncLabel";
3137
solenbergff976312016-03-30 23:28:51 -07003138 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003139 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3140 sp.sync_label = kSyncLabel;
3141 // Creating two channels to make sure that sync label is set properly for both
3142 // the default voice channel and following ones.
3143 EXPECT_TRUE(channel_->AddRecvStream(sp));
3144 sp.ssrcs[0] += 1;
3145 EXPECT_TRUE(channel_->AddRecvStream(sp));
3146
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003147 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003148 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003149 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003150 << "SyncGroup should be set based on sync_label";
3151 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003152 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003153 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003154}
3155
solenberg3a941542015-11-16 07:34:50 -08003156// TODO(solenberg): Remove, once recv streams are configured through Call.
3157// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003158TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003159 // Test that setting the header extensions results in the expected state
3160 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003161 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003162 ssrcs.push_back(223);
3163 ssrcs.push_back(224);
3164
solenbergff976312016-03-30 23:28:51 -07003165 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003166 cricket::WebRtcVoiceMediaChannel* media_channel =
3167 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003168 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003169 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003170 EXPECT_TRUE(media_channel->AddRecvStream(
3171 cricket::StreamParams::CreateLegacy(ssrc)));
3172 }
3173
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003174 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003175 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003176 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003177 EXPECT_NE(nullptr, s);
3178 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3179 }
3180
3181 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003182 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003183 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003184 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003185 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003186 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003187 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003188 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003189 EXPECT_NE(nullptr, s);
3190 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003191 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3192 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003193 for (const auto& s_ext : s_exts) {
3194 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003195 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003196 }
3197 }
3198 }
3199 }
3200
3201 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003202 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003203 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003204 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003205 EXPECT_NE(nullptr, s);
3206 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3207 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003208}
3209
3210TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3211 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003212 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003213 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003214 static const unsigned char kRtcp[] = {
3215 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3216 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3218 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3219 };
jbaucheec21bd2016-03-20 06:15:43 -07003220 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003221
solenbergff976312016-03-30 23:28:51 -07003222 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003223 cricket::WebRtcVoiceMediaChannel* media_channel =
3224 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003225 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003226 EXPECT_TRUE(media_channel->AddRecvStream(
3227 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3228
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003229 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003230 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003231 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003232 EXPECT_EQ(0, s->received_packets());
3233 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3234 EXPECT_EQ(1, s->received_packets());
3235 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3236 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003237}
Minyue2013aec2015-05-13 14:14:42 +02003238
solenberg0a617e22015-10-20 15:49:38 -07003239// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003240// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003241TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003242 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003243 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003244 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003245 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003246 int recv_ch = voe_.GetLastChannel();
3247 EXPECT_NE(recv_ch, default_channel);
3248 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3249 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3250 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003251 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003252 recv_ch = voe_.GetLastChannel();
3253 EXPECT_NE(recv_ch, default_channel);
3254 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003255}
3256
3257TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003258 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003259 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003260
solenberg8189b022016-06-14 12:13:00 -07003261 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003262 int recv_ch = voe_.GetLastChannel();
3263
3264 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3265 int send_ch = voe_.GetLastChannel();
3266
3267 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3268 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3269 // channel of |recv_ch|.This is not a common case, since, normally, only the
3270 // default channel can be associated. However, the default is not deletable.
3271 // So we force the |recv_ch| to associate with a non-default channel.
3272 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3273 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3274
3275 EXPECT_TRUE(channel_->RemoveSendStream(2));
3276 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3277}
stefan658910c2015-09-03 05:48:32 -07003278
deadbeef884f5852016-01-15 09:20:04 -08003279TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003280 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003281 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3282 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003283
3284 // Setting the sink before a recv stream exists should do nothing.
3285 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003286 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003287 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3288
3289 // Now try actually setting the sink.
3290 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3291 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3292
3293 // Now try resetting it.
3294 channel_->SetRawAudioSink(kSsrc1, nullptr);
3295 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3296}
3297
3298TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003299 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003300 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3301 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003302
3303 // Should be able to set a default sink even when no stream exists.
3304 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3305
3306 // Create default channel and ensure it's assigned the default sink.
3307 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3308 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3309
3310 // Try resetting the default sink.
3311 channel_->SetRawAudioSink(0, nullptr);
3312 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3313
3314 // Try setting the default sink while the default stream exists.
3315 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3316 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3317
3318 // If we remove and add a default stream, it should get the same sink.
3319 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3320 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3321 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3322}
3323
skvlad7a43d252016-03-22 15:32:27 -07003324// Test that, just like the video channel, the voice channel communicates the
3325// network state to the call.
3326TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003327 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003328
3329 EXPECT_EQ(webrtc::kNetworkUp,
3330 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3331 EXPECT_EQ(webrtc::kNetworkUp,
3332 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3333
3334 channel_->OnReadyToSend(false);
3335 EXPECT_EQ(webrtc::kNetworkDown,
3336 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3337 EXPECT_EQ(webrtc::kNetworkUp,
3338 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3339
3340 channel_->OnReadyToSend(true);
3341 EXPECT_EQ(webrtc::kNetworkUp,
3342 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3343 EXPECT_EQ(webrtc::kNetworkUp,
3344 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3345}
3346
aleloi18e0b672016-10-04 02:45:47 -07003347// Test that playout is still started after changing parameters
3348TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3349 SetupRecvStream();
3350 channel_->SetPlayout(true);
3351 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3352
3353 // Changing RTP header extensions will recreate the AudioReceiveStream.
3354 cricket::AudioRecvParameters parameters;
3355 parameters.extensions.push_back(
3356 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3357 channel_->SetRecvParameters(parameters);
3358
3359 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3360}
3361
stefan658910c2015-09-03 05:48:32 -07003362// Tests that the library initializes and shuts down properly.
3363TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003364 // If the VoiceEngine wants to gather available codecs early, that's fine but
3365 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003366 cricket::WebRtcVoiceEngine engine(
3367 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003368 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003369 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003370 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003371 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3372 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003373 EXPECT_TRUE(channel != nullptr);
3374 delete channel;
solenbergff976312016-03-30 23:28:51 -07003375}
stefan658910c2015-09-03 05:48:32 -07003376
solenbergff976312016-03-30 23:28:51 -07003377// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003378TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3379 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3380 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3381 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003382 {
ossuc54071d2016-08-17 02:45:41 -07003383 cricket::WebRtcVoiceEngine engine(
3384 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003385 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003386 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003387 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003388 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3389 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3390 EXPECT_TRUE(channel != nullptr);
3391 delete channel;
3392 }
stefan658910c2015-09-03 05:48:32 -07003393}
3394
3395// Tests that the library is configured with the codecs we want.
3396TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003397 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3398 // module.
3399
stefan658910c2015-09-03 05:48:32 -07003400 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003401 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003402 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003403 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003404 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003405 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003406 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003407 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003408 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003409 cricket::AudioCodec(96, "ILBC", 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, "iLBC", 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, "PCMU", 8000, 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, "PCMA", 8000, 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, "G722", 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, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003420 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003421 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003422 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003423 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003424 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003425 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003426 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003427 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003428 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003429 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003430 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003431 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003432 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003433 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003434 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003435 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003436 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003437 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003438 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003439 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003440 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003441 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003442 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003443 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003444 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003445 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003446 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003447 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003448 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003449
stefan658910c2015-09-03 05:48:32 -07003450 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003451 // TODO(ossu): Why are the payload types of codecs with non-static payload
3452 // type assignments checked here? It shouldn't really matter.
3453 cricket::WebRtcVoiceEngine engine(
3454 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
stefan658910c2015-09-03 05:48:32 -07003455 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossuc54071d2016-08-17 02:45:41 -07003456 engine.send_codecs().begin();
3457 it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003458 if (it->name == "CN" && it->clockrate == 16000) {
3459 EXPECT_EQ(105, it->id);
3460 } else if (it->name == "CN" && it->clockrate == 32000) {
3461 EXPECT_EQ(106, it->id);
3462 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3463 EXPECT_EQ(103, it->id);
3464 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3465 EXPECT_EQ(104, it->id);
3466 } else if (it->name == "G722" && it->clockrate == 8000) {
3467 EXPECT_EQ(9, it->id);
3468 } else if (it->name == "telephone-event") {
3469 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003470 } else if (it->name == "opus") {
3471 EXPECT_EQ(111, it->id);
3472 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3473 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003474 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3475 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3476 }
3477 }
stefan658910c2015-09-03 05:48:32 -07003478}
3479
3480// Tests that VoE supports at least 32 channels
3481TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003482 cricket::WebRtcVoiceEngine engine(
3483 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003484 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003485 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003486 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003487
3488 cricket::VoiceMediaChannel* channels[32];
3489 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003490 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003491 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3492 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003493 if (!channel)
3494 break;
stefan658910c2015-09-03 05:48:32 -07003495 channels[num_channels++] = channel;
3496 }
3497
tfarina5237aaf2015-11-10 23:44:30 -08003498 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003499 EXPECT_EQ(expected, num_channels);
3500
3501 while (num_channels > 0) {
3502 delete channels[--num_channels];
3503 }
stefan658910c2015-09-03 05:48:32 -07003504}
3505
3506// Test that we set our preferred codecs properly.
3507TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003508 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3509 // - Check that our builtin codecs are usable by Channel.
3510 // - The codecs provided by the engine is usable by Channel.
3511 // It does not check that the codecs in the RecvParameters are actually
3512 // what we sent in - though it's probably reasonable to expect so, if
3513 // SetRecvParameters returns true.
3514 // I think it will become clear once audio decoder injection is completed.
3515 cricket::WebRtcVoiceEngine engine(
3516 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003517 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003518 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003519 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003520 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3521 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003522 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003523 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003524 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003525}