blob: f05254c7c699eef09ec020963cc9cf6c05feaf8b [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));
minyue7a973442016-10-20 03:27:12 -0700244 EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000245 }
246
skvlade0d46372016-04-07 22:59:22 -0700247 // Sets the per-stream maximum bitrate limit for the specified SSRC.
248 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700249 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700250 EXPECT_EQ(1UL, parameters.encodings.size());
251
252 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700253 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700254 }
255
256 bool SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
257 cricket::AudioSendParameters send_parameters;
258 send_parameters.codecs.push_back(codec);
259 send_parameters.max_bandwidth_bps = bitrate;
260 return channel_->SetSendParameters(send_parameters);
261 }
262
minyue7a973442016-10-20 03:27:12 -0700263 void CheckSendCodec(int32_t ssrc,
264 const char expected_name[],
265 int expected_channels,
266 int expected_bitrate) {
267 const auto& codec = GetSendStreamConfig(ssrc).send_codec_spec.codec_inst;
268 EXPECT_STREQ(expected_name, codec.plname);
269 EXPECT_EQ(expected_channels, codec.channels);
270 EXPECT_EQ(expected_bitrate, codec.rate);
271 }
272
273 int GetOpusMaxPlaybackRate(int32_t ssrc) {
274 return GetSendStreamConfig(ssrc).send_codec_spec.opus_max_playback_rate;
275 }
276
277 bool GetOpusDtx(int32_t ssrc) {
278 return GetSendStreamConfig(ssrc).send_codec_spec.enable_opus_dtx;
279 }
280
281 bool GetCodecFec(int32_t ssrc) {
282 return GetSendStreamConfig(ssrc).send_codec_spec.enable_codec_fec;
283 }
284
skvlade0d46372016-04-07 22:59:22 -0700285 int GetCodecBitrate(int32_t ssrc) {
minyue7a973442016-10-20 03:27:12 -0700286 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.rate;
287 }
288
289 int GetCodecPacSize(int32_t ssrc) {
290 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.pacsize;
skvlade0d46372016-04-07 22:59:22 -0700291 }
292
293 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
294 int global_max,
295 int stream_max,
296 bool expected_result,
297 int expected_codec_bitrate) {
298 // Clear the bitrate limit from the previous test case.
299 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
300
301 // Attempt to set the requested bitrate limits.
302 EXPECT_TRUE(SetGlobalMaxBitrate(codec, global_max));
303 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
304
305 // Verify that reading back the parameters gives results
306 // consistent with the Set() result.
307 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700308 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700309 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
310 EXPECT_EQ(expected_result ? stream_max : -1,
311 resulting_parameters.encodings[0].max_bitrate_bps);
312
313 // Verify that the codec settings have the expected bitrate.
314 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
315 }
316
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000317 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700318 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000319
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000320 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800321 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000322
323 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700324 send_parameters_.extensions.push_back(
325 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200326 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800327 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000328
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000329 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200330 send_parameters_.extensions.clear();
331 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800332 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000333
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000334 // Ensure extension is set properly.
335 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700336 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200337 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800338 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700339 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800340 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000341
solenberg7add0582015-11-20 09:59:34 -0800342 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000343 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700344 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800345 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
346 call_.GetAudioSendStream(kSsrc2));
347 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700348 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800349 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000350
351 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200352 send_parameters_.codecs.push_back(kPcmuCodec);
353 send_parameters_.extensions.clear();
354 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800355 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
356 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000357 }
358
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000359 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700360 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000361
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000362 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800363 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000364
365 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700366 recv_parameters_.extensions.push_back(
367 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800368 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
369 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000370
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000371 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800372 recv_parameters_.extensions.clear();
373 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
374 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000375
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000376 // Ensure extension is set properly.
377 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700378 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800379 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
380 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700381 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800382 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000383
solenberg7add0582015-11-20 09:59:34 -0800384 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700385 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800386 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
387 call_.GetAudioReceiveStream(kSsrc2));
388 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700389 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800390 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000391
392 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800393 recv_parameters_.extensions.clear();
394 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
395 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
396 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000397 }
398
solenberg85a04962015-10-27 03:35:21 -0700399 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
400 webrtc::AudioSendStream::Stats stats;
401 stats.local_ssrc = 12;
402 stats.bytes_sent = 345;
403 stats.packets_sent = 678;
404 stats.packets_lost = 9012;
405 stats.fraction_lost = 34.56f;
406 stats.codec_name = "codec_name_send";
407 stats.ext_seqnum = 789;
408 stats.jitter_ms = 12;
409 stats.rtt_ms = 345;
410 stats.audio_level = 678;
411 stats.aec_quality_min = 9.01f;
412 stats.echo_delay_median_ms = 234;
413 stats.echo_delay_std_ms = 567;
414 stats.echo_return_loss = 890;
415 stats.echo_return_loss_enhancement = 1234;
416 stats.typing_noise_detected = true;
417 return stats;
418 }
419 void SetAudioSendStreamStats() {
420 for (auto* s : call_.GetAudioSendStreams()) {
421 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200422 }
solenberg85a04962015-10-27 03:35:21 -0700423 }
solenberg566ef242015-11-06 15:34:49 -0800424 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
425 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700426 const auto stats = GetAudioSendStreamStats();
427 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
428 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
429 EXPECT_EQ(info.packets_sent, stats.packets_sent);
430 EXPECT_EQ(info.packets_lost, stats.packets_lost);
431 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
432 EXPECT_EQ(info.codec_name, stats.codec_name);
433 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
434 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
435 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
436 EXPECT_EQ(info.audio_level, stats.audio_level);
437 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
438 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
439 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
440 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
441 EXPECT_EQ(info.echo_return_loss_enhancement,
442 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800443 EXPECT_EQ(info.typing_noise_detected,
444 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700445 }
446
447 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
448 webrtc::AudioReceiveStream::Stats stats;
449 stats.remote_ssrc = 123;
450 stats.bytes_rcvd = 456;
451 stats.packets_rcvd = 768;
452 stats.packets_lost = 101;
453 stats.fraction_lost = 23.45f;
454 stats.codec_name = "codec_name_recv";
455 stats.ext_seqnum = 678;
456 stats.jitter_ms = 901;
457 stats.jitter_buffer_ms = 234;
458 stats.jitter_buffer_preferred_ms = 567;
459 stats.delay_estimate_ms = 890;
460 stats.audio_level = 1234;
461 stats.expand_rate = 5.67f;
462 stats.speech_expand_rate = 8.90f;
463 stats.secondary_decoded_rate = 1.23f;
464 stats.accelerate_rate = 4.56f;
465 stats.preemptive_expand_rate = 7.89f;
466 stats.decoding_calls_to_silence_generator = 12;
467 stats.decoding_calls_to_neteq = 345;
468 stats.decoding_normal = 67890;
469 stats.decoding_plc = 1234;
470 stats.decoding_cng = 5678;
471 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700472 stats.decoding_muted_output = 3456;
473 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200474 return stats;
475 }
476 void SetAudioReceiveStreamStats() {
477 for (auto* s : call_.GetAudioReceiveStreams()) {
478 s->SetStats(GetAudioReceiveStreamStats());
479 }
480 }
481 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700482 const auto stats = GetAudioReceiveStreamStats();
483 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
484 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
485 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
486 EXPECT_EQ(info.packets_lost, stats.packets_lost);
487 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
488 EXPECT_EQ(info.codec_name, stats.codec_name);
489 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
490 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
491 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200492 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700493 stats.jitter_buffer_preferred_ms);
494 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
495 EXPECT_EQ(info.audio_level, stats.audio_level);
496 EXPECT_EQ(info.expand_rate, stats.expand_rate);
497 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
498 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
499 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
500 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200501 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700502 stats.decoding_calls_to_silence_generator);
503 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
504 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
505 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
506 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
507 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700508 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700509 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200510 }
511
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700513 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700514 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200515 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700517 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700518 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200519 cricket::AudioSendParameters send_parameters_;
520 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800521 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800522 private:
523 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524};
525
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526// Tests that we can create and destroy a channel.
527TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700528 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000529}
530
solenberg31fec402016-05-06 02:13:12 -0700531// Test that we can add a send stream and that it has the correct defaults.
532TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
533 EXPECT_TRUE(SetupChannel());
534 EXPECT_TRUE(
535 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
536 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
537 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
538 EXPECT_EQ("", config.rtp.c_name);
539 EXPECT_EQ(0u, config.rtp.extensions.size());
540 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
541 config.send_transport);
542}
543
544// Test that we can add a receive stream and that it has the correct defaults.
545TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
546 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700547 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700548 const webrtc::AudioReceiveStream::Config& config =
549 GetRecvStreamConfig(kSsrc1);
550 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
551 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
552 EXPECT_FALSE(config.rtp.transport_cc);
553 EXPECT_EQ(0u, config.rtp.extensions.size());
554 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
555 config.rtcp_send_transport);
556 EXPECT_EQ("", config.sync_group);
557}
558
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700560// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700561// TODO(ossu): This test should move into a separate builtin audio codecs
562// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700563TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700564 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000565 ASSERT_FALSE(codecs.empty());
566 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
567 EXPECT_EQ(48000, codecs[0].clockrate);
568 EXPECT_EQ(2, codecs[0].channels);
569 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570}
571
stefanba4c0e42016-02-04 04:12:24 -0800572TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700573 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800574 bool opus_found = false;
575 for (cricket::AudioCodec codec : codecs) {
576 if (codec.name == "opus") {
577 EXPECT_TRUE(HasTransportCc(codec));
578 opus_found = true;
579 }
580 }
581 EXPECT_TRUE(opus_found);
582}
583
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584// Tests that we can find codecs by name or id, and that we interpret the
585// clockrate and bitrate fields properly.
586TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
587 cricket::AudioCodec codec;
588 webrtc::CodecInst codec_inst;
589 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800590 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800592 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000593 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800594 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
595 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 // Find ISAC with a different payload id.
597 codec = kIsacCodec;
598 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800599 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000600 EXPECT_EQ(codec.id, codec_inst.pltype);
601 // Find PCMU with a 0 clockrate.
602 codec = kPcmuCodec;
603 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800604 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 EXPECT_EQ(codec.id, codec_inst.pltype);
606 EXPECT_EQ(8000, codec_inst.plfreq);
607 // Find PCMU with a 0 bitrate.
608 codec = kPcmuCodec;
609 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800610 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 EXPECT_EQ(codec.id, codec_inst.pltype);
612 EXPECT_EQ(64000, codec_inst.rate);
613 // Find ISAC with an explicit bitrate.
614 codec = kIsacCodec;
615 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800616 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 EXPECT_EQ(codec.id, codec_inst.pltype);
618 EXPECT_EQ(32000, codec_inst.rate);
619}
620
621// Test that we set our inbound codecs properly, including changing PT.
622TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700623 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200624 cricket::AudioRecvParameters parameters;
625 parameters.codecs.push_back(kIsacCodec);
626 parameters.codecs.push_back(kPcmuCodec);
627 parameters.codecs.push_back(kTelephoneEventCodec);
628 parameters.codecs[0].id = 106; // collide with existing telephone-event
629 parameters.codecs[2].id = 126;
630 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700631 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700632 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800634 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 gcodec.plfreq = 16000;
636 gcodec.channels = 1;
637 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
638 EXPECT_EQ(106, gcodec.pltype);
639 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800640 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 gcodec.plfreq = 8000;
642 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
643 EXPECT_EQ(126, gcodec.pltype);
644 EXPECT_STREQ("telephone-event", gcodec.plname);
645}
646
647// Test that we fail to set an unknown inbound codec.
648TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700649 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200650 cricket::AudioRecvParameters parameters;
651 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700652 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200653 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654}
655
656// Test that we fail if we have duplicate types in the inbound list.
657TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700658 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200659 cricket::AudioRecvParameters parameters;
660 parameters.codecs.push_back(kIsacCodec);
661 parameters.codecs.push_back(kCn16000Codec);
662 parameters.codecs[1].id = kIsacCodec.id;
663 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664}
665
666// Test that we can decode OPUS without stereo parameters.
667TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700668 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200669 cricket::AudioRecvParameters parameters;
670 parameters.codecs.push_back(kIsacCodec);
671 parameters.codecs.push_back(kPcmuCodec);
672 parameters.codecs.push_back(kOpusCodec);
673 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700674 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700675 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800677 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 // Even without stereo parameters, recv codecs still specify channels = 2.
679 EXPECT_EQ(2, opus.channels);
680 EXPECT_EQ(111, opus.pltype);
681 EXPECT_STREQ("opus", opus.plname);
682 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700683 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 EXPECT_EQ(111, opus.pltype);
685}
686
687// Test that we can decode OPUS with stereo = 0.
688TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700689 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200690 cricket::AudioRecvParameters parameters;
691 parameters.codecs.push_back(kIsacCodec);
692 parameters.codecs.push_back(kPcmuCodec);
693 parameters.codecs.push_back(kOpusCodec);
694 parameters.codecs[2].params["stereo"] = "0";
695 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700696 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 int channel_num2 = voe_.GetLastChannel();
698 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800699 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700 // Even when stereo is off, recv codecs still specify channels = 2.
701 EXPECT_EQ(2, opus.channels);
702 EXPECT_EQ(111, opus.pltype);
703 EXPECT_STREQ("opus", opus.plname);
704 opus.pltype = 0;
705 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
706 EXPECT_EQ(111, opus.pltype);
707}
708
709// Test that we can decode OPUS with stereo = 1.
710TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700711 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200712 cricket::AudioRecvParameters parameters;
713 parameters.codecs.push_back(kIsacCodec);
714 parameters.codecs.push_back(kPcmuCodec);
715 parameters.codecs.push_back(kOpusCodec);
716 parameters.codecs[2].params["stereo"] = "1";
717 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700718 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 int channel_num2 = voe_.GetLastChannel();
720 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800721 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_EQ(2, opus.channels);
723 EXPECT_EQ(111, opus.pltype);
724 EXPECT_STREQ("opus", opus.plname);
725 opus.pltype = 0;
726 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
727 EXPECT_EQ(111, opus.pltype);
728}
729
730// Test that changes to recv codecs are applied to all streams.
731TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700732 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200733 cricket::AudioRecvParameters parameters;
734 parameters.codecs.push_back(kIsacCodec);
735 parameters.codecs.push_back(kPcmuCodec);
736 parameters.codecs.push_back(kTelephoneEventCodec);
737 parameters.codecs[0].id = 106; // collide with existing telephone-event
738 parameters.codecs[2].id = 126;
739 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700740 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741 int channel_num2 = voe_.GetLastChannel();
742 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800743 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 gcodec.plfreq = 16000;
745 gcodec.channels = 1;
746 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
747 EXPECT_EQ(106, gcodec.pltype);
748 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800749 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 gcodec.plfreq = 8000;
751 gcodec.channels = 1;
752 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
753 EXPECT_EQ(126, gcodec.pltype);
754 EXPECT_STREQ("telephone-event", gcodec.plname);
755}
756
757TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700758 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200759 cricket::AudioRecvParameters parameters;
760 parameters.codecs.push_back(kIsacCodec);
761 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200762 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763
764 int channel_num2 = voe_.GetLastChannel();
765 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800766 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 gcodec.plfreq = 16000;
768 gcodec.channels = 1;
769 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
770 EXPECT_EQ(106, gcodec.pltype);
771 EXPECT_STREQ("ISAC", gcodec.plname);
772}
773
774// Test that we can apply the same set of codecs again while playing.
775TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
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);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200782 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783
784 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200785 parameters.codecs[0].id = 127;
786 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700787 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788}
789
790// Test that we can add a codec while playing.
791TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700792 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200793 cricket::AudioRecvParameters parameters;
794 parameters.codecs.push_back(kIsacCodec);
795 parameters.codecs.push_back(kCn16000Codec);
796 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700797 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200799 parameters.codecs.push_back(kOpusCodec);
800 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700801 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800803 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000804 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
805}
806
807TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700808 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000810 // Test that when autobw is enabled, bitrate is kept as the default
811 // value. autobw is enabled for the following tests because the target
812 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000813
814 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700815 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000816
817 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700818 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000819
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700821 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000822}
823
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000824TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700825 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000826
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000827 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828
829 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700830 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
831 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
832 // Rates above the max (56000) should be capped.
833 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700836 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
837 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
838 // Rates above the max (510000) should be capped.
839 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000840}
841
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000842TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700843 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000844
845 // Test that we can only set a maximum bitrate for a fixed-rate codec
846 // if it's bigger than the fixed rate.
847
848 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700849 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
850 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
851 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
852 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
853 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
854 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
855 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000856}
857
858TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700859 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200860 const int kDesiredBitrate = 128000;
861 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700862 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200863 parameters.max_bandwidth_bps = kDesiredBitrate;
864 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000865
866 EXPECT_TRUE(channel_->AddSendStream(
867 cricket::StreamParams::CreateLegacy(kSsrc1)));
868
minyue7a973442016-10-20 03:27:12 -0700869 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000870}
871
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872// Test that bitrate cannot be set for CBR codecs.
873// Bitrate is ignored if it is higher than the fixed bitrate.
874// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000875TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700876 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877
878 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200879 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700880 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200881
882 send_parameters_.max_bandwidth_bps = 128000;
883 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700884 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200885
886 send_parameters_.max_bandwidth_bps = 128;
887 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700888 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000889}
890
skvlade0d46372016-04-07 22:59:22 -0700891// Test that the per-stream bitrate limit and the global
892// bitrate limit both apply.
893TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
894 EXPECT_TRUE(SetupSendStream());
895
896 // opus, default bitrate == 64000.
897 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
898 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
899 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
900 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
901
902 // CBR codecs allow both maximums to exceed the bitrate.
903 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
904 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
905 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
906 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
907
908 // CBR codecs don't allow per stream maximums to be too low.
909 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
910 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
911}
912
913// Test that an attempt to set RtpParameters for a stream that does not exist
914// fails.
915TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
916 EXPECT_TRUE(SetupChannel());
917 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700918 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700919 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
920
921 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700922 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700923}
924
925TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700926 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700927 // This test verifies that setting RtpParameters succeeds only if
928 // the structure contains exactly one encoding.
929 // TODO(skvlad): Update this test when we start supporting setting parameters
930 // for each encoding individually.
931
932 EXPECT_TRUE(SetupSendStream());
933 // Setting RtpParameters with no encoding is expected to fail.
934 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700935 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700936 // Setting RtpParameters with exactly one encoding should succeed.
937 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700938 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700939 // Two or more encodings should result in failure.
940 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700941 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700942}
943
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700944// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700945// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700946TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
947 EXPECT_TRUE(SetupSendStream());
948 SetSend(channel_, true);
949 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
950 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700951 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700952 ASSERT_EQ(1u, parameters.encodings.size());
953 ASSERT_TRUE(parameters.encodings[0].active);
954 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700955 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700956 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
957
958 // Now change it back to active and verify we resume sending.
959 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700960 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700961 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
962}
963
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700964// Test that SetRtpSendParameters configures the correct encoding channel for
965// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700966TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
967 SetupForMultiSendStream();
968 // Create send streams.
969 for (uint32_t ssrc : kSsrcs4) {
970 EXPECT_TRUE(
971 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
972 }
973 // Configure one stream to be limited by the stream config, another to be
974 // limited by the global max, and the third one with no per-stream limit
975 // (still subject to the global limit).
976 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
977 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
978 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
979 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
980
981 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
982 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
983 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
984
985 // Remove the global cap; the streams should switch to their respective
986 // maximums (or remain unchanged if there was no other limit on them.)
987 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
988 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
989 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
990 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
991}
992
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700993// Test that GetRtpSendParameters returns the currently configured codecs.
994TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700995 EXPECT_TRUE(SetupSendStream());
996 cricket::AudioSendParameters parameters;
997 parameters.codecs.push_back(kIsacCodec);
998 parameters.codecs.push_back(kPcmuCodec);
999 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1000
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001001 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001002 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001003 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1004 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001005}
1006
1007// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001008TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001009 EXPECT_TRUE(SetupSendStream());
1010 cricket::AudioSendParameters parameters;
1011 parameters.codecs.push_back(kIsacCodec);
1012 parameters.codecs.push_back(kPcmuCodec);
1013 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1014
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001015 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001016
1017 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001018 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001019
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001020 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1021 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1022 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1023}
1024
1025// Test that GetRtpReceiveParameters returns the currently configured codecs.
1026TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1027 EXPECT_TRUE(SetupRecvStream());
1028 cricket::AudioRecvParameters parameters;
1029 parameters.codecs.push_back(kIsacCodec);
1030 parameters.codecs.push_back(kPcmuCodec);
1031 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1032
1033 webrtc::RtpParameters rtp_parameters =
1034 channel_->GetRtpReceiveParameters(kSsrc1);
1035 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1036 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1037 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1038}
1039
1040// Test that if we set/get parameters multiple times, we get the same results.
1041TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1042 EXPECT_TRUE(SetupRecvStream());
1043 cricket::AudioRecvParameters parameters;
1044 parameters.codecs.push_back(kIsacCodec);
1045 parameters.codecs.push_back(kPcmuCodec);
1046 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1047
1048 webrtc::RtpParameters initial_params =
1049 channel_->GetRtpReceiveParameters(kSsrc1);
1050
1051 // We should be able to set the params we just got.
1052 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1053
1054 // ... And this shouldn't change the params returned by
1055 // GetRtpReceiveParameters.
1056 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1057 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001058}
1059
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060// Test that we apply codecs properly.
1061TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001062 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001063 cricket::AudioSendParameters parameters;
1064 parameters.codecs.push_back(kIsacCodec);
1065 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001066 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001067 parameters.codecs[0].id = 96;
1068 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001069 const int initial_num = call_.GetNumCreatedSendStreams();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001071 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1072 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1073 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1074 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1075 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1076 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1077 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1078 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001079 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080}
1081
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001082// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1083// to apply.
1084TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001085 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001086 cricket::AudioSendParameters parameters;
1087 parameters.codecs.push_back(kIsacCodec);
1088 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001089 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001090 parameters.codecs[0].id = 96;
1091 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001092 const int initial_num = call_.GetNumCreatedSendStreams();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001093 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001094 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001095 // Calling SetSendCodec again with same codec which is already set.
1096 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001097 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001098 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001099}
1100
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001101// Verify that G722 is set with 16000 samples per second to WebRTC.
1102TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001103 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001104 cricket::AudioSendParameters parameters;
1105 parameters.codecs.push_back(kG722CodecSdp);
1106 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001107 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001108 EXPECT_STREQ("G722", gcodec.plname);
1109 EXPECT_EQ(1, gcodec.channels);
1110 EXPECT_EQ(16000, gcodec.plfreq);
1111}
1112
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001113// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001115 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001116 cricket::AudioSendParameters parameters;
1117 parameters.codecs.push_back(kOpusCodec);
1118 parameters.codecs[0].bitrate = 0;
1119 parameters.codecs[0].clockrate = 50000;
1120 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121}
1122
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001123// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001125 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001126 cricket::AudioSendParameters parameters;
1127 parameters.codecs.push_back(kOpusCodec);
1128 parameters.codecs[0].bitrate = 0;
1129 parameters.codecs[0].channels = 0;
1130 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001131}
1132
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001133// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001135 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001136 cricket::AudioSendParameters parameters;
1137 parameters.codecs.push_back(kOpusCodec);
1138 parameters.codecs[0].bitrate = 0;
1139 parameters.codecs[0].channels = 0;
1140 parameters.codecs[0].params["stereo"] = "1";
1141 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142}
1143
1144// Test that if channel is 1 for opus and there's no stereo, we fail.
1145TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001146 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001147 cricket::AudioSendParameters parameters;
1148 parameters.codecs.push_back(kOpusCodec);
1149 parameters.codecs[0].bitrate = 0;
1150 parameters.codecs[0].channels = 1;
1151 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001152}
1153
1154// Test that if channel is 1 for opus and stereo=0, we fail.
1155TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001156 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001157 cricket::AudioSendParameters parameters;
1158 parameters.codecs.push_back(kOpusCodec);
1159 parameters.codecs[0].bitrate = 0;
1160 parameters.codecs[0].channels = 1;
1161 parameters.codecs[0].params["stereo"] = "0";
1162 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163}
1164
1165// Test that if channel is 1 for opus and stereo=1, we fail.
1166TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001167 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 cricket::AudioSendParameters parameters;
1169 parameters.codecs.push_back(kOpusCodec);
1170 parameters.codecs[0].bitrate = 0;
1171 parameters.codecs[0].channels = 1;
1172 parameters.codecs[0].params["stereo"] = "1";
1173 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174}
1175
1176// Test that with bitrate=0 and no stereo,
1177// channels and bitrate are 1 and 32000.
1178TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001179 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001180 cricket::AudioSendParameters parameters;
1181 parameters.codecs.push_back(kOpusCodec);
1182 parameters.codecs[0].bitrate = 0;
1183 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001184 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185}
1186
1187// Test that with bitrate=0 and stereo=0,
1188// channels and bitrate are 1 and 32000.
1189TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001190 EXPECT_TRUE(SetupSendStream());
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));
minyue7a973442016-10-20 03:27:12 -07001196 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001197}
1198
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001199// Test that with bitrate=invalid and stereo=0,
1200// channels and bitrate are 1 and 32000.
1201TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001202 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001203 cricket::AudioSendParameters parameters;
1204 parameters.codecs.push_back(kOpusCodec);
1205 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001206 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001207 parameters.codecs[0].bitrate = 5999;
1208 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001209 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001210
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001211 parameters.codecs[0].bitrate = 510001;
1212 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001213 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001214}
1215
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216// Test that with bitrate=0 and stereo=1,
1217// channels and bitrate are 2 and 64000.
1218TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001219 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001220 cricket::AudioSendParameters parameters;
1221 parameters.codecs.push_back(kOpusCodec);
1222 parameters.codecs[0].bitrate = 0;
1223 parameters.codecs[0].params["stereo"] = "1";
1224 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001225 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001226}
1227
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001228// Test that with bitrate=invalid and stereo=1,
1229// channels and bitrate are 2 and 64000.
1230TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001231 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001232 cricket::AudioSendParameters parameters;
1233 parameters.codecs.push_back(kOpusCodec);
1234 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001235 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001236 parameters.codecs[0].bitrate = 5999;
1237 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001238 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001239
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001240 parameters.codecs[0].bitrate = 510001;
1241 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001242 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001243}
1244
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001245// Test that with bitrate=N and stereo unset,
1246// channels and bitrate are 1 and N.
1247TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001248 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001249 cricket::AudioSendParameters parameters;
1250 parameters.codecs.push_back(kOpusCodec);
1251 parameters.codecs[0].bitrate = 96000;
1252 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001253 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001254 EXPECT_EQ(111, gcodec.pltype);
1255 EXPECT_EQ(96000, gcodec.rate);
1256 EXPECT_STREQ("opus", gcodec.plname);
1257 EXPECT_EQ(1, gcodec.channels);
1258 EXPECT_EQ(48000, gcodec.plfreq);
1259}
1260
1261// Test that with bitrate=N and stereo=0,
1262// channels and bitrate are 1 and N.
1263TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001264 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001265 cricket::AudioSendParameters parameters;
1266 parameters.codecs.push_back(kOpusCodec);
1267 parameters.codecs[0].bitrate = 30000;
1268 parameters.codecs[0].params["stereo"] = "0";
1269 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001270 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271}
1272
1273// Test that with bitrate=N and without any parameters,
1274// channels and bitrate are 1 and N.
1275TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001276 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 cricket::AudioSendParameters parameters;
1278 parameters.codecs.push_back(kOpusCodec);
1279 parameters.codecs[0].bitrate = 30000;
1280 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001281 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001282}
1283
1284// Test that with bitrate=N and stereo=1,
1285// channels and bitrate are 2 and N.
1286TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001287 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001288 cricket::AudioSendParameters parameters;
1289 parameters.codecs.push_back(kOpusCodec);
1290 parameters.codecs[0].bitrate = 30000;
1291 parameters.codecs[0].params["stereo"] = "1";
1292 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001293 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001294}
1295
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001296// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1297// Also test that the "maxaveragebitrate" can't be set to values outside the
1298// range of 6000 and 510000
1299TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001300 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001301 cricket::AudioSendParameters parameters;
1302 parameters.codecs.push_back(kOpusCodec);
1303 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001304 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001305 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1306 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001307 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001308
1309 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001310 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1311 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001312 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001313
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001314 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1315 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001316 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001317}
1318
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001319// Test that we can enable NACK with opus as caller.
1320TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001321 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001322 cricket::AudioSendParameters parameters;
1323 parameters.codecs.push_back(kOpusCodec);
1324 parameters.codecs[0].AddFeedbackParam(
1325 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1326 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001327 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001328 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001329 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001330}
1331
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001332// Test that we can enable NACK with opus as callee.
1333TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001334 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 cricket::AudioSendParameters parameters;
1336 parameters.codecs.push_back(kOpusCodec);
1337 parameters.codecs[0].AddFeedbackParam(
1338 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1339 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001340 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001342 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001343 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001344
1345 EXPECT_TRUE(channel_->AddSendStream(
1346 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001347 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001348}
1349
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001350// Test that we can enable NACK on receive streams.
1351TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001352 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001353 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001354 cricket::AudioSendParameters parameters;
1355 parameters.codecs.push_back(kOpusCodec);
1356 parameters.codecs[0].AddFeedbackParam(
1357 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1358 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001359 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001360 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001361 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001362 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001363 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364}
1365
1366// Test that we can disable NACK.
1367TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001368 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001369 cricket::AudioSendParameters parameters;
1370 parameters.codecs.push_back(kOpusCodec);
1371 parameters.codecs[0].AddFeedbackParam(
1372 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1373 cricket::kParamValueEmpty));
1374 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001375 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001377 parameters.codecs.clear();
1378 parameters.codecs.push_back(kOpusCodec);
1379 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001380 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001381}
1382
1383// Test that we can disable NACK on receive streams.
1384TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001385 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001386 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001387 cricket::AudioSendParameters parameters;
1388 parameters.codecs.push_back(kOpusCodec);
1389 parameters.codecs[0].AddFeedbackParam(
1390 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1391 cricket::kParamValueEmpty));
1392 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001393 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001394 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001395
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001396 parameters.codecs.clear();
1397 parameters.codecs.push_back(kOpusCodec);
1398 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001399 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001400 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001401}
1402
1403// Test that NACK is enabled on a new receive stream.
1404TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001405 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001406 cricket::AudioSendParameters parameters;
1407 parameters.codecs.push_back(kIsacCodec);
1408 parameters.codecs.push_back(kCn16000Codec);
1409 parameters.codecs[0].AddFeedbackParam(
1410 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1411 cricket::kParamValueEmpty));
1412 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001413 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414
solenberg8189b022016-06-14 12:13:00 -07001415 EXPECT_TRUE(AddRecvStream(kSsrc2));
1416 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1417 EXPECT_TRUE(AddRecvStream(kSsrc3));
1418 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001419}
1420
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001421// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001422TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001423 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001424 cricket::AudioSendParameters parameters;
1425 parameters.codecs.push_back(kOpusCodec);
1426 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001427 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001428}
1429
1430// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001431TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001432 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 cricket::AudioSendParameters parameters;
1434 parameters.codecs.push_back(kOpusCodec);
1435 parameters.codecs[0].bitrate = 0;
1436 parameters.codecs[0].params["useinbandfec"] = "0";
1437 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001438 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001439}
1440
1441// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001442TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001443 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001444 cricket::AudioSendParameters parameters;
1445 parameters.codecs.push_back(kOpusCodec);
1446 parameters.codecs[0].bitrate = 0;
1447 parameters.codecs[0].params["useinbandfec"] = "1";
1448 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001449 EXPECT_TRUE(GetCodecFec(kSsrc1));
1450 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001451}
1452
1453// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001454TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
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(kOpusCodec);
1458 parameters.codecs[0].bitrate = 0;
1459 parameters.codecs[0].params["stereo"] = "1";
1460 parameters.codecs[0].params["useinbandfec"] = "1";
1461 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001462 EXPECT_TRUE(GetCodecFec(kSsrc1));
1463 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001464}
1465
1466// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001467TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001468 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001469 cricket::AudioSendParameters parameters;
1470 parameters.codecs.push_back(kIsacCodec);
1471 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001472 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001473}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001474
1475// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1476TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001477 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001478 cricket::AudioSendParameters parameters;
1479 parameters.codecs.push_back(kIsacCodec);
1480 parameters.codecs[0].params["useinbandfec"] = "1";
1481 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001482 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001483}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001484
1485// Test that Opus FEC status can be changed.
1486TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001487 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 cricket::AudioSendParameters parameters;
1489 parameters.codecs.push_back(kOpusCodec);
1490 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001491 EXPECT_FALSE(GetCodecFec(kSsrc1));
1492
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001493 parameters.codecs[0].params["useinbandfec"] = "1";
1494 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001495 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001496}
1497
stefanba4c0e42016-02-04 04:12:24 -08001498TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001499 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001500 cricket::AudioSendParameters send_parameters;
1501 send_parameters.codecs.push_back(kOpusCodec);
1502 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1503 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1504
1505 cricket::AudioRecvParameters recv_parameters;
1506 recv_parameters.codecs.push_back(kIsacCodec);
1507 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001508 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001509 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1510 EXPECT_FALSE(
1511 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1512
ossudedfd282016-06-14 07:12:39 -07001513 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001514 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1515 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1516 EXPECT_TRUE(
1517 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1518}
1519
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001520// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1521TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001522 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001523 cricket::AudioSendParameters parameters;
1524 parameters.codecs.push_back(kOpusCodec);
1525 parameters.codecs[0].bitrate = 0;
1526 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1527 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001528 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1529 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001530
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001531 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1532 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001533 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001534}
1535
1536// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1537TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001538 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001539 cricket::AudioSendParameters parameters;
1540 parameters.codecs.push_back(kOpusCodec);
1541 parameters.codecs[0].bitrate = 0;
1542 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1543 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001544 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1545 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001546
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001547 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1548 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001549 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001550}
1551
1552// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1553TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001554 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001555 cricket::AudioSendParameters parameters;
1556 parameters.codecs.push_back(kOpusCodec);
1557 parameters.codecs[0].bitrate = 0;
1558 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001560 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1561 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001562
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001563 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1564 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001565 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001566}
1567
1568// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1569TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001570 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001571 cricket::AudioSendParameters parameters;
1572 parameters.codecs.push_back(kOpusCodec);
1573 parameters.codecs[0].bitrate = 0;
1574 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1575 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001576 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1577 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001578
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001579 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1580 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001581 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001582}
1583
1584// Test 24000 < maxplaybackrate triggers Opus full band mode.
1585TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001586 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001587 cricket::AudioSendParameters parameters;
1588 parameters.codecs.push_back(kOpusCodec);
1589 parameters.codecs[0].bitrate = 0;
1590 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1591 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001592 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1593 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001594
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001595 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1596 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001597 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598}
1599
1600// Test Opus that without maxplaybackrate, default playback rate is used.
1601TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001602 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001603 cricket::AudioSendParameters parameters;
1604 parameters.codecs.push_back(kOpusCodec);
1605 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001606 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001607}
1608
1609// Test the with non-Opus, maxplaybackrate has no effect.
1610TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001611 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001612 cricket::AudioSendParameters parameters;
1613 parameters.codecs.push_back(kIsacCodec);
1614 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1615 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001616 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001617}
1618
1619// Test maxplaybackrate can be set on two streams.
1620TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001621 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001622 cricket::AudioSendParameters parameters;
1623 parameters.codecs.push_back(kOpusCodec);
1624 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001625 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001626
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001627 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001628 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001629 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001630
1631 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001632 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001633}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001634
Minyue Li7100dcd2015-03-27 05:05:59 +01001635// Test that with usedtx=0, Opus DTX is off.
1636TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001637 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001638 cricket::AudioSendParameters parameters;
1639 parameters.codecs.push_back(kOpusCodec);
1640 parameters.codecs[0].params["usedtx"] = "0";
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001642 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001643}
1644
1645// Test that with usedtx=1, Opus DTX is on.
1646TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001647 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001648 cricket::AudioSendParameters parameters;
1649 parameters.codecs.push_back(kOpusCodec);
1650 parameters.codecs[0].params["usedtx"] = "1";
1651 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001652 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001653}
1654
1655// Test that usedtx=1 works with stereo Opus.
1656TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001657 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001658 cricket::AudioSendParameters parameters;
1659 parameters.codecs.push_back(kOpusCodec);
1660 parameters.codecs[0].params["usedtx"] = "1";
1661 parameters.codecs[0].params["stereo"] = "1";
1662 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001663 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001664}
1665
1666// Test that usedtx=1 does not work with non Opus.
1667TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001668 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 cricket::AudioSendParameters parameters;
1670 parameters.codecs.push_back(kIsacCodec);
1671 parameters.codecs[0].params["usedtx"] = "1";
1672 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001673 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001674}
1675
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001676// Test that we can switch back and forth between Opus and ISAC with CN.
1677TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001678 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001679
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001680 cricket::AudioSendParameters opus_parameters;
1681 opus_parameters.codecs.push_back(kOpusCodec);
1682 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
minyue7a973442016-10-20 03:27:12 -07001683 {
1684 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1685 EXPECT_EQ(111, gcodec.pltype);
1686 EXPECT_STREQ("opus", gcodec.plname);
1687 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001688
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001689 cricket::AudioSendParameters isac_parameters;
1690 isac_parameters.codecs.push_back(kIsacCodec);
1691 isac_parameters.codecs.push_back(kCn16000Codec);
1692 isac_parameters.codecs.push_back(kOpusCodec);
1693 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
minyue7a973442016-10-20 03:27:12 -07001694 {
1695 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1696 EXPECT_EQ(103, gcodec.pltype);
1697 EXPECT_STREQ("ISAC", gcodec.plname);
1698 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001700 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
minyue7a973442016-10-20 03:27:12 -07001701 {
1702 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1703 EXPECT_EQ(111, gcodec.pltype);
1704 EXPECT_STREQ("opus", gcodec.plname);
1705 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706}
1707
1708// Test that we handle various ways of specifying bitrate.
1709TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001710 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 cricket::AudioSendParameters parameters;
1712 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1713 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001714 {
1715 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1716 EXPECT_EQ(103, gcodec.pltype);
1717 EXPECT_STREQ("ISAC", gcodec.plname);
1718 EXPECT_EQ(32000, gcodec.rate);
1719 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001721 parameters.codecs[0].bitrate = 0; // bitrate == default
1722 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001723 {
1724 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1725 EXPECT_EQ(103, gcodec.pltype);
1726 EXPECT_STREQ("ISAC", gcodec.plname);
1727 EXPECT_EQ(-1, gcodec.rate);
1728 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001729 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1730 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001731 {
1732 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1733 EXPECT_EQ(103, gcodec.pltype);
1734 EXPECT_STREQ("ISAC", gcodec.plname);
1735 EXPECT_EQ(28000, gcodec.rate);
1736 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001738 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1739 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001740 {
1741 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1742 EXPECT_EQ(0, gcodec.pltype);
1743 EXPECT_STREQ("PCMU", gcodec.plname);
1744 EXPECT_EQ(64000, gcodec.rate);
1745 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001747 parameters.codecs[0].bitrate = 0; // bitrate == default
1748 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001749 {
1750 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1751 EXPECT_EQ(0, gcodec.pltype);
1752 EXPECT_STREQ("PCMU", gcodec.plname);
1753 EXPECT_EQ(64000, gcodec.rate);
1754 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001756 parameters.codecs[0] = kOpusCodec;
1757 parameters.codecs[0].bitrate = 0; // bitrate == default
1758 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001759 {
1760 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1761 EXPECT_EQ(111, gcodec.pltype);
1762 EXPECT_STREQ("opus", gcodec.plname);
1763 EXPECT_EQ(32000, gcodec.rate);
1764 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765}
1766
Brave Yao5225dd82015-03-26 07:39:19 +08001767// Test that we could set packet size specified in kCodecParamPTime.
1768TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001769 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001770 cricket::AudioSendParameters parameters;
1771 parameters.codecs.push_back(kOpusCodec);
1772 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1773 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001774 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001775
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001776 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1777 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001778 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001779
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001780 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1781 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001782 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001783
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001784 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1785 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1786 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001787 EXPECT_EQ(480, GetCodecPacSize(
1788 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001789
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001790 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1791 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1792 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001793 EXPECT_EQ(640, GetCodecPacSize(
1794 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001795}
1796
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001797// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001799 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001800 cricket::AudioSendParameters parameters;
1801 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001802}
1803
1804// Test that we can set send codecs even with telephone-event codec as the first
1805// one on the list.
1806TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001807 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001808 cricket::AudioSendParameters parameters;
1809 parameters.codecs.push_back(kTelephoneEventCodec);
1810 parameters.codecs.push_back(kIsacCodec);
1811 parameters.codecs.push_back(kPcmuCodec);
1812 parameters.codecs[0].id = 98; // DTMF
1813 parameters.codecs[1].id = 96;
1814 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001815 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001816 EXPECT_EQ(96, gcodec.pltype);
1817 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001818 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001819}
1820
solenberg31642aa2016-03-14 08:00:37 -07001821// Test that payload type range is limited for telephone-event codec.
1822TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001823 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001824 cricket::AudioSendParameters parameters;
1825 parameters.codecs.push_back(kTelephoneEventCodec);
1826 parameters.codecs.push_back(kIsacCodec);
1827 parameters.codecs[0].id = 0; // DTMF
1828 parameters.codecs[1].id = 96;
1829 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1830 EXPECT_TRUE(channel_->CanInsertDtmf());
1831 parameters.codecs[0].id = 128; // DTMF
1832 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1833 EXPECT_FALSE(channel_->CanInsertDtmf());
1834 parameters.codecs[0].id = 127;
1835 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1836 EXPECT_TRUE(channel_->CanInsertDtmf());
1837 parameters.codecs[0].id = -1; // DTMF
1838 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1839 EXPECT_FALSE(channel_->CanInsertDtmf());
1840}
1841
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001842// Test that we can set send codecs even with CN codec as the first
1843// one on the list.
1844TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001845 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001846 cricket::AudioSendParameters parameters;
1847 parameters.codecs.push_back(kCn16000Codec);
1848 parameters.codecs.push_back(kIsacCodec);
1849 parameters.codecs.push_back(kPcmuCodec);
1850 parameters.codecs[0].id = 98; // wideband CN
1851 parameters.codecs[1].id = 96;
1852 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001853 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1854 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1855 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1856 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1857 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858}
1859
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001860// Test that we set VAD and DTMF types correctly as caller.
1861TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001862 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001863 cricket::AudioSendParameters parameters;
1864 parameters.codecs.push_back(kIsacCodec);
1865 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001866 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001867 parameters.codecs.push_back(kCn16000Codec);
1868 parameters.codecs.push_back(kCn8000Codec);
1869 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001870 parameters.codecs[0].id = 96;
1871 parameters.codecs[2].id = 97; // wideband CN
1872 parameters.codecs[4].id = 98; // DTMF
1873 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001874 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1875 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1876 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1877 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1878 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1879 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1880 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001881 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001882}
1883
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001884// Test that we set VAD and DTMF types correctly as callee.
1885TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001886 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001887 cricket::AudioSendParameters parameters;
1888 parameters.codecs.push_back(kIsacCodec);
1889 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001890 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001891 parameters.codecs.push_back(kCn16000Codec);
1892 parameters.codecs.push_back(kCn8000Codec);
1893 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001894 parameters.codecs[0].id = 96;
1895 parameters.codecs[2].id = 97; // wideband CN
1896 parameters.codecs[4].id = 98; // DTMF
1897 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001898 EXPECT_TRUE(channel_->AddSendStream(
1899 cricket::StreamParams::CreateLegacy(kSsrc1)));
1900
minyue7a973442016-10-20 03:27:12 -07001901 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1902 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1903 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1904 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1905 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1906 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1907 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001908 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001909}
1910
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911// Test that we only apply VAD if we have a CN codec that matches the
1912// send codec clockrate.
1913TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001914 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001915 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001917 parameters.codecs.push_back(kIsacCodec);
1918 parameters.codecs.push_back(kCn16000Codec);
1919 parameters.codecs[1].id = 97;
1920 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001921 {
1922 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1923 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1924 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1925 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1926 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1927 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
1928 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001930 parameters.codecs[0] = kPcmuCodec;
1931 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001932 {
1933 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1934 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1935 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1936 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001938 parameters.codecs[1] = kCn8000Codec;
1939 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001940 {
1941 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1942 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1943 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1944 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1945 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1946 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
1947 }
Brave Yao5225dd82015-03-26 07:39:19 +08001948 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001949 parameters.codecs[0] = kIsacCodec;
1950 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001951 {
1952 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1953 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1954 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1955 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956}
1957
1958// Test that we perform case-insensitive matching of codec names.
1959TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001960 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001961 cricket::AudioSendParameters parameters;
1962 parameters.codecs.push_back(kIsacCodec);
1963 parameters.codecs.push_back(kPcmuCodec);
1964 parameters.codecs.push_back(kCn16000Codec);
1965 parameters.codecs.push_back(kCn8000Codec);
1966 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001967 parameters.codecs[0].name = "iSaC";
1968 parameters.codecs[0].id = 96;
1969 parameters.codecs[2].id = 97; // wideband CN
1970 parameters.codecs[4].id = 98; // DTMF
1971 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001972 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1973 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1974 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1975 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1976 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1977 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1978 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001979 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980}
1981
stefanba4c0e42016-02-04 04:12:24 -08001982class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1983 public:
1984 WebRtcVoiceEngineWithSendSideBweTest()
1985 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1986};
1987
1988TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1989 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07001990 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08001991 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07001992 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
1993 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
1994 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08001995 extension.id);
1996 return;
1997 }
1998 }
1999 FAIL() << "Transport sequence number extension not in header-extension list.";
2000}
2001
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002002// Test support for audio level header extension.
2003TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002004 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002005}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002006TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002007 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002008}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002009
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002010// Test support for absolute send time header extension.
2011TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002012 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002013}
2014TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002015 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002016}
2017
solenberg1ac56142015-10-13 03:58:19 -07002018// Test that we can create a channel and start sending on it.
2019TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002020 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002021 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002022 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002023 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002024 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002025 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2026}
2027
2028// Test that a channel will send if and only if it has a source and is enabled
2029// for sending.
2030TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002031 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002032 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2033 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002034 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002035 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2036 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2037 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2038 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2039 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002040}
2041
solenberg94218532016-06-16 10:53:22 -07002042// Test that a channel is muted/unmuted.
2043TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2044 EXPECT_TRUE(SetupSendStream());
2045 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2046 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2047 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2048 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2049 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2050 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2051}
2052
solenberg6d6e7c52016-04-13 09:07:30 -07002053// Test that SetSendParameters() does not alter a stream's send state.
2054TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2055 EXPECT_TRUE(SetupSendStream());
2056 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2057
2058 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002059 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002060 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2061
2062 // Changing RTP header extensions will recreate the AudioSendStream.
2063 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002064 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002065 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2066 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2067
2068 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002069 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002070 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2071
2072 // Changing RTP header extensions will recreate the AudioSendStream.
2073 send_parameters_.extensions.clear();
2074 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2075 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2076}
2077
solenberg1ac56142015-10-13 03:58:19 -07002078// Test that we can create a channel and start playing out on it.
2079TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002080 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002081 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002082 channel_->SetPlayout(true);
2083 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2084 channel_->SetPlayout(false);
2085 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086}
2087
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002088// Test that we can add and remove send streams.
2089TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2090 SetupForMultiSendStream();
2091
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002092 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002093 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002094
solenbergc96df772015-10-21 13:01:53 -07002095 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002096 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002097 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002098 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002099 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002100 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002101 }
tfarina5237aaf2015-11-10 23:44:30 -08002102 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002103
solenbergc96df772015-10-21 13:01:53 -07002104 // Delete the send streams.
2105 for (uint32_t ssrc : kSsrcs4) {
2106 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002107 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002108 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002109 }
solenbergc96df772015-10-21 13:01:53 -07002110 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002111}
2112
2113// Test SetSendCodecs correctly configure the codecs in all send streams.
2114TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2115 SetupForMultiSendStream();
2116
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002117 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002118 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002119 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002120 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002121 }
2122
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002123 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002124 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002125 parameters.codecs.push_back(kIsacCodec);
2126 parameters.codecs.push_back(kCn16000Codec);
2127 parameters.codecs[1].id = 97;
2128 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002129
2130 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002131 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002132 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2133 const auto& send_codec_spec =
2134 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2135 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2136 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2137 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2138 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2139 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002140 }
2141
minyue7a973442016-10-20 03:27:12 -07002142 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002143 parameters.codecs[0] = kPcmuCodec;
2144 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002145 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002146 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2147 const auto& send_codec_spec =
2148 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2149 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2150 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2151 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2152 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002153 }
2154}
2155
2156// Test we can SetSend on all send streams correctly.
2157TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2158 SetupForMultiSendStream();
2159
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002160 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002161 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002162 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002163 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002164 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2165 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002166 }
2167
2168 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002169 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002170 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002171 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002172 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002173 }
2174
2175 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002176 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002177 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002178 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002179 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002180 }
2181}
2182
2183// Test we can set the correct statistics on all send streams.
2184TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2185 SetupForMultiSendStream();
2186
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002187 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002188 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002189 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002190 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002191 }
solenberg85a04962015-10-27 03:35:21 -07002192
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002193 // Create a receive stream to check that none of the send streams end up in
2194 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002195 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002196
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002197 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002198 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2199 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002200 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002201
solenberg85a04962015-10-27 03:35:21 -07002202 // Check stats for the added streams.
2203 {
2204 cricket::VoiceMediaInfo info;
2205 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002206
solenberg85a04962015-10-27 03:35:21 -07002207 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002208 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002209 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002210 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002211 }
2212
2213 // We have added one receive stream. We should see empty stats.
2214 EXPECT_EQ(info.receivers.size(), 1u);
2215 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002216 }
solenberg1ac56142015-10-13 03:58:19 -07002217
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002218 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002219 {
2220 cricket::VoiceMediaInfo info;
2221 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2222 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002223 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002224 EXPECT_EQ(0u, info.receivers.size());
2225 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002226
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002227 // Deliver a new packet - a default receive stream should be created and we
2228 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002229 {
2230 cricket::VoiceMediaInfo info;
2231 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2232 SetAudioReceiveStreamStats();
2233 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002234 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002235 EXPECT_EQ(1u, info.receivers.size());
2236 VerifyVoiceReceiverInfo(info.receivers[0]);
2237 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002238}
2239
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002240// Test that we can add and remove receive streams, and do proper send/playout.
2241// We can receive on multiple streams while sending one stream.
2242TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002243 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244
solenberg1ac56142015-10-13 03:58:19 -07002245 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002246 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002247 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002248
solenberg1ac56142015-10-13 03:58:19 -07002249 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002250 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenbergd53a3f92016-04-14 13:56:37 -07002251 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002252 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253
solenberg1ac56142015-10-13 03:58:19 -07002254 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002255 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256
2257 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002258 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002259 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2260 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261
2262 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002263 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002264 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002265
2266 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002267 channel_->SetPlayout(false);
2268 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2269 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270
aleloi84ef6152016-08-04 05:28:21 -07002271 // Restart playout and make sure recv streams are played out.
2272 channel_->SetPlayout(true);
2273 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2274 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002275
aleloi84ef6152016-08-04 05:28:21 -07002276 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2278 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002279}
2280
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002282// and start sending on it.
2283TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002284 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002285 cricket::AudioOptions options_adjust_agc;
2286 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002287 webrtc::AgcConfig agc_config;
2288 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2289 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002290 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002291 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002292 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002293 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002294 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2295 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002296 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002297 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002299}
2300
wu@webrtc.org97077a32013-10-25 21:18:33 +00002301TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002302 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002303 EXPECT_CALL(adm_,
2304 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002305 webrtc::AgcConfig agc_config;
2306 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2307 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002308 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2309 send_parameters_.options.tx_agc_digital_compression_gain =
2310 rtc::Optional<uint16_t>(9);
2311 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2312 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2313 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002314 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2315 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2316 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2317 EXPECT_TRUE(agc_config.limiterEnable);
2318
2319 // Check interaction with adjust_agc_delta. Both should be respected, for
2320 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002321 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2322 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002323 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2324 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2325}
2326
wu@webrtc.org97077a32013-10-25 21:18:33 +00002327TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002328 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002329 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2330 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002331 send_parameters_.options.recording_sample_rate =
2332 rtc::Optional<uint32_t>(48000);
2333 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2334 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002335}
2336
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002338// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002340 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002341 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342}
2343
2344TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2345 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002346 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002347 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002348 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002349 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002350 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2351 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002352 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353
solenberg85a04962015-10-27 03:35:21 -07002354 // Check stats for the added streams.
2355 {
2356 cricket::VoiceMediaInfo info;
2357 EXPECT_EQ(true, channel_->GetStats(&info));
2358
2359 // We have added one send stream. We should see the stats we've set.
2360 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002361 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002362 // We have added one receive stream. We should see empty stats.
2363 EXPECT_EQ(info.receivers.size(), 1u);
2364 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2365 }
solenberg1ac56142015-10-13 03:58:19 -07002366
solenberg566ef242015-11-06 15:34:49 -08002367 // Start sending - this affects some reported stats.
2368 {
2369 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002370 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002371 EXPECT_EQ(true, channel_->GetStats(&info));
2372 VerifyVoiceSenderInfo(info.senders[0], true);
2373 }
2374
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002375 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002376 {
2377 cricket::VoiceMediaInfo info;
2378 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2379 EXPECT_EQ(true, channel_->GetStats(&info));
2380 EXPECT_EQ(1u, info.senders.size());
2381 EXPECT_EQ(0u, info.receivers.size());
2382 }
solenberg1ac56142015-10-13 03:58:19 -07002383
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002384 // Deliver a new packet - a default receive stream should be created and we
2385 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002386 {
2387 cricket::VoiceMediaInfo info;
2388 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2389 SetAudioReceiveStreamStats();
2390 EXPECT_EQ(true, channel_->GetStats(&info));
2391 EXPECT_EQ(1u, info.senders.size());
2392 EXPECT_EQ(1u, info.receivers.size());
2393 VerifyVoiceReceiverInfo(info.receivers[0]);
2394 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395}
2396
2397// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002398// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002400 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002401 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002402 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002403 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404}
2405
2406// Test that the local SSRC is the same on sending and receiving channels if the
2407// receive channel is created before the send channel.
2408TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002409 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002410 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002412 cricket::StreamParams::CreateLegacy(kSsrc1)));
2413 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2414 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002415}
2416
2417// Test that we can properly receive packets.
2418TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002419 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002420 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002422
2423 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2424 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425}
2426
2427// Test that we can properly receive packets on multiple streams.
2428TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002429 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002430 const uint32_t ssrc1 = 1;
2431 const uint32_t ssrc2 = 2;
2432 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002433 EXPECT_TRUE(AddRecvStream(ssrc1));
2434 EXPECT_TRUE(AddRecvStream(ssrc2));
2435 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002437 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002438 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002440 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441 }
mflodman3d7db262016-04-29 00:57:13 -07002442
2443 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2444 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2445 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2446
2447 EXPECT_EQ(s1.received_packets(), 0);
2448 EXPECT_EQ(s2.received_packets(), 0);
2449 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002450
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002451 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002452 EXPECT_EQ(s1.received_packets(), 0);
2453 EXPECT_EQ(s2.received_packets(), 0);
2454 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002455
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002456 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002457 EXPECT_EQ(s1.received_packets(), 1);
2458 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2459 EXPECT_EQ(s2.received_packets(), 0);
2460 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002461
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002463 EXPECT_EQ(s1.received_packets(), 1);
2464 EXPECT_EQ(s2.received_packets(), 1);
2465 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2466 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002467
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002468 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002469 EXPECT_EQ(s1.received_packets(), 1);
2470 EXPECT_EQ(s2.received_packets(), 1);
2471 EXPECT_EQ(s3.received_packets(), 1);
2472 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002473
mflodman3d7db262016-04-29 00:57:13 -07002474 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2475 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2476 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477}
2478
solenberg7e63ef02015-11-20 00:19:43 -08002479// Test that receiving on an unsignalled stream works (default channel will be
2480// created).
2481TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002482 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002483 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2484
solenberg7e63ef02015-11-20 00:19:43 -08002485 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002486
2487 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2488 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2489 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002490}
2491
2492// Test that receiving on an unsignalled stream works (default channel will be
2493// created), and that packets will be forwarded to the default channel
2494// regardless of their SSRCs.
2495TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002496 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002497 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002498 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2499
mflodman3d7db262016-04-29 00:57:13 -07002500 // Note that ssrc = 0 is not supported.
2501 uint32_t ssrc = 1;
2502 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002503 rtc::SetBE32(&packet[8], ssrc);
2504 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002505
2506 // Verify we only have one default stream.
2507 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2508 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2509 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002510 }
mflodman3d7db262016-04-29 00:57:13 -07002511
2512 // Sending the same ssrc again should not create a new stream.
2513 --ssrc;
2514 DeliverPacket(packet, sizeof(packet));
2515 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2516 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2517 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002518}
2519
2520// Test that a default channel is created even after a signalled stream has been
2521// added, and that this stream will get any packets for unknown SSRCs.
2522TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002523 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002524 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002525 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2526
2527 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002528 const uint32_t signaled_ssrc = 1;
2529 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002530 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002531 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002532 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2533 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002534
2535 // Note that the first unknown SSRC cannot be 0, because we only support
2536 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002537 const uint32_t unsignaled_ssrc = 7011;
2538 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002539 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002540 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2541 packet, sizeof(packet)));
2542 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2543
2544 DeliverPacket(packet, sizeof(packet));
2545 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2546
2547 rtc::SetBE32(&packet[8], signaled_ssrc);
2548 DeliverPacket(packet, sizeof(packet));
2549 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2550 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002551}
2552
solenberg0a617e22015-10-20 15:49:38 -07002553// Test that we properly handle failures to add a receive stream.
2554TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002555 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002557 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002558}
2559
solenberg0a617e22015-10-20 15:49:38 -07002560// Test that we properly handle failures to add a send stream.
2561TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002562 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002563 voe_.set_fail_create_channel(true);
2564 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2565}
2566
solenberg1ac56142015-10-13 03:58:19 -07002567// Test that AddRecvStream creates new stream.
2568TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002569 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002571 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002572 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573}
2574
2575// Test that after adding a recv stream, we do not decode more codecs than
2576// those previously passed into SetRecvCodecs.
2577TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002578 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002579 cricket::AudioRecvParameters parameters;
2580 parameters.codecs.push_back(kIsacCodec);
2581 parameters.codecs.push_back(kPcmuCodec);
2582 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002583 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002584 int channel_num2 = voe_.GetLastChannel();
2585 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002586 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002587 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588 gcodec.channels = 2;
2589 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2590}
2591
2592// Test that we properly clean up any streams that were added, even if
2593// not explicitly removed.
2594TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002595 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002596 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8189b022016-06-14 12:13:00 -07002597 EXPECT_TRUE(AddRecvStream(1));
2598 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002599 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2600 delete channel_;
2601 channel_ = NULL;
2602 EXPECT_EQ(0, voe_.GetNumChannels());
2603}
2604
wu@webrtc.org78187522013-10-07 23:32:02 +00002605TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002606 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002607 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002608}
2609
2610TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002611 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002612 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002613 // Manually delete channel to simulate a failure.
2614 int channel = voe_.GetLastChannel();
2615 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2616 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002617 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002618 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002619 EXPECT_NE(channel, new_channel);
2620 // The last created channel is deleted too.
2621 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002622}
2623
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002624// Test the InsertDtmf on default send stream as caller.
2625TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2626 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627}
2628
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002629// Test the InsertDtmf on default send stream as callee
2630TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2631 TestInsertDtmf(0, false);
2632}
2633
2634// Test the InsertDtmf on specified send stream as caller.
2635TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2636 TestInsertDtmf(kSsrc1, true);
2637}
2638
2639// Test the InsertDtmf on specified send stream as callee.
2640TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2641 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002642}
2643
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002645 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002646 EXPECT_CALL(adm_,
2647 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2648 EXPECT_CALL(adm_,
2649 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2650 EXPECT_CALL(adm_,
2651 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002652 bool ec_enabled;
2653 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002654 webrtc::AecmModes aecm_mode;
2655 bool cng_enabled;
2656 bool agc_enabled;
2657 webrtc::AgcModes agc_mode;
2658 webrtc::AgcConfig agc_config;
2659 bool ns_enabled;
2660 webrtc::NsModes ns_mode;
2661 bool highpass_filter_enabled;
2662 bool stereo_swapping_enabled;
2663 bool typing_detection_enabled;
2664 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002665 voe_.GetAecmMode(aecm_mode, cng_enabled);
2666 voe_.GetAgcStatus(agc_enabled, agc_mode);
2667 voe_.GetAgcConfig(agc_config);
2668 voe_.GetNsStatus(ns_enabled, ns_mode);
2669 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2670 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2671 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2672 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002673 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674 EXPECT_FALSE(cng_enabled);
2675 EXPECT_TRUE(agc_enabled);
2676 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2677 EXPECT_TRUE(ns_enabled);
2678 EXPECT_TRUE(highpass_filter_enabled);
2679 EXPECT_FALSE(stereo_swapping_enabled);
2680 EXPECT_TRUE(typing_detection_enabled);
2681 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2682 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002683 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2684 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685
solenberg246b8172015-12-08 09:50:23 -08002686 // Nothing set in AudioOptions, so everything should be as default.
2687 send_parameters_.options = cricket::AudioOptions();
2688 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002690 voe_.GetAecmMode(aecm_mode, cng_enabled);
2691 voe_.GetAgcStatus(agc_enabled, agc_mode);
2692 voe_.GetAgcConfig(agc_config);
2693 voe_.GetNsStatus(ns_enabled, ns_mode);
2694 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2695 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2696 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2697 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002698 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002699 EXPECT_FALSE(cng_enabled);
2700 EXPECT_TRUE(agc_enabled);
2701 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2702 EXPECT_TRUE(ns_enabled);
2703 EXPECT_TRUE(highpass_filter_enabled);
2704 EXPECT_FALSE(stereo_swapping_enabled);
2705 EXPECT_TRUE(typing_detection_enabled);
2706 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2707 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002708 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2709 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002710
2711 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002712 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2713 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002714 voe_.GetEcStatus(ec_enabled, ec_mode);
2715 EXPECT_FALSE(ec_enabled);
2716
2717 // Turn echo cancellation back on, with settings, and make sure
2718 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002719 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2720 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002721 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002722 voe_.GetAecmMode(aecm_mode, cng_enabled);
2723 voe_.GetAgcStatus(agc_enabled, agc_mode);
2724 voe_.GetAgcConfig(agc_config);
2725 voe_.GetNsStatus(ns_enabled, ns_mode);
2726 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2727 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2728 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2729 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002730 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731 EXPECT_TRUE(agc_enabled);
2732 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2733 EXPECT_TRUE(ns_enabled);
2734 EXPECT_TRUE(highpass_filter_enabled);
2735 EXPECT_FALSE(stereo_swapping_enabled);
2736 EXPECT_TRUE(typing_detection_enabled);
2737 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2738 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2739
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002740 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2741 // control.
solenberg246b8172015-12-08 09:50:23 -08002742 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2743 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002744 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002745 voe_.GetAecmMode(aecm_mode, cng_enabled);
2746 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002747 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002748 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2749
2750 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002751 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2752 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2753 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2754 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002755 voe_.GetEcStatus(ec_enabled, ec_mode);
2756 EXPECT_FALSE(ec_enabled);
2757 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002758 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2759 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002760 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002761 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002762 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002763 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2764
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002766 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2767 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768 voe_.GetAgcStatus(agc_enabled, agc_mode);
2769 EXPECT_FALSE(agc_enabled);
2770
2771 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002772 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2773 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2774 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002775 voe_.GetAgcStatus(agc_enabled, agc_mode);
2776 EXPECT_TRUE(agc_enabled);
2777 voe_.GetAgcConfig(agc_config);
2778 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2779
2780 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002781 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2782 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2783 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2784 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2785 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002786 voe_.GetNsStatus(ns_enabled, ns_mode);
2787 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2788 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2789 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2790 EXPECT_FALSE(ns_enabled);
2791 EXPECT_FALSE(highpass_filter_enabled);
2792 EXPECT_FALSE(typing_detection_enabled);
2793 EXPECT_TRUE(stereo_swapping_enabled);
2794
solenberg1ac56142015-10-13 03:58:19 -07002795 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002796 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002797 voe_.GetEcStatus(ec_enabled, ec_mode);
2798 voe_.GetNsStatus(ns_enabled, ns_mode);
2799 EXPECT_TRUE(ec_enabled);
2800 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2801 EXPECT_FALSE(ns_enabled);
2802 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2803}
2804
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002805TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002806 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807
2808 bool ec_enabled;
2809 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002810 bool agc_enabled;
2811 webrtc::AgcModes agc_mode;
2812 bool ns_enabled;
2813 webrtc::NsModes ns_mode;
2814 bool highpass_filter_enabled;
2815 bool stereo_swapping_enabled;
2816 bool typing_detection_enabled;
2817
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_.GetAgcStatus(agc_enabled, agc_mode);
2820 voe_.GetNsStatus(ns_enabled, ns_mode);
2821 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2822 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2823 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2824 EXPECT_TRUE(ec_enabled);
2825 EXPECT_TRUE(agc_enabled);
2826 EXPECT_TRUE(ns_enabled);
2827 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002828 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002829 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002830}
2831
2832TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2833 webrtc::AgcConfig set_config = {0};
2834 set_config.targetLeveldBOv = 3;
2835 set_config.digitalCompressionGaindB = 9;
2836 set_config.limiterEnable = true;
2837 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002838
2839 webrtc::AgcConfig config = {0};
2840 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2841 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2842 EXPECT_EQ(set_config.digitalCompressionGaindB,
2843 config.digitalCompressionGaindB);
2844 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2845}
2846
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002848 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002849 EXPECT_CALL(adm_,
2850 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2851 EXPECT_CALL(adm_,
2852 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2853 EXPECT_CALL(adm_,
2854 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2855
kwiberg686a8ef2016-02-26 03:00:35 -08002856 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002857 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002858 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002859 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002860 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002861 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002862
2863 // Have to add a stream to make SetSend work.
2864 cricket::StreamParams stream1;
2865 stream1.ssrcs.push_back(1);
2866 channel1->AddSendStream(stream1);
2867 cricket::StreamParams stream2;
2868 stream2.ssrcs.push_back(2);
2869 channel2->AddSendStream(stream2);
2870
2871 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002872 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002873 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2874 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2875 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002876 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2877 EXPECT_EQ(parameters_options_all.options, channel1->options());
2878 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2879 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002880
2881 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002882 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002883 parameters_options_no_ns.options.noise_suppression =
2884 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002885 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2886 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002887 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2888 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2889 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002890 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002891
2892 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002893 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002894 parameters_options_no_agc.options.auto_gain_control =
2895 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002896 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002897 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2898 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2899 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002900 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002901
solenberg246b8172015-12-08 09:50:23 -08002902 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903 bool ec_enabled;
2904 webrtc::EcModes ec_mode;
2905 bool agc_enabled;
2906 webrtc::AgcModes agc_mode;
2907 bool ns_enabled;
2908 webrtc::NsModes ns_mode;
2909 voe_.GetEcStatus(ec_enabled, ec_mode);
2910 voe_.GetAgcStatus(agc_enabled, agc_mode);
2911 voe_.GetNsStatus(ns_enabled, ns_mode);
2912 EXPECT_TRUE(ec_enabled);
2913 EXPECT_TRUE(agc_enabled);
2914 EXPECT_TRUE(ns_enabled);
2915
solenbergd53a3f92016-04-14 13:56:37 -07002916 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 voe_.GetEcStatus(ec_enabled, ec_mode);
2918 voe_.GetAgcStatus(agc_enabled, agc_mode);
2919 voe_.GetNsStatus(ns_enabled, ns_mode);
2920 EXPECT_TRUE(ec_enabled);
2921 EXPECT_TRUE(agc_enabled);
2922 EXPECT_FALSE(ns_enabled);
2923
solenbergd53a3f92016-04-14 13:56:37 -07002924 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002925 voe_.GetEcStatus(ec_enabled, ec_mode);
2926 voe_.GetAgcStatus(agc_enabled, agc_mode);
2927 voe_.GetNsStatus(ns_enabled, ns_mode);
2928 EXPECT_TRUE(ec_enabled);
2929 EXPECT_FALSE(agc_enabled);
2930 EXPECT_TRUE(ns_enabled);
2931
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002932 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002933 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002934 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2935 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002936 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002937 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002938 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002939 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002940 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002941 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002942 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2943 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2944 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002945 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 voe_.GetEcStatus(ec_enabled, ec_mode);
2947 voe_.GetAgcStatus(agc_enabled, agc_mode);
2948 voe_.GetNsStatus(ns_enabled, ns_mode);
2949 EXPECT_TRUE(ec_enabled);
2950 EXPECT_FALSE(agc_enabled);
2951 EXPECT_FALSE(ns_enabled);
2952}
2953
wu@webrtc.orgde305012013-10-31 15:40:38 +00002954// This test verifies DSCP settings are properly applied on voice media channel.
2955TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07002956 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08002957 cricket::FakeNetworkInterface network_interface;
2958 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08002959 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08002960
solenbergbc37fc82016-04-04 09:54:44 -07002961 channel.reset(
2962 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002963 channel->SetInterface(&network_interface);
2964 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2965 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2966
2967 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07002968 channel.reset(
2969 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002970 channel->SetInterface(&network_interface);
2971 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
2972
2973 // Verify that setting the option to false resets the
2974 // DiffServCodePoint.
2975 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07002976 channel.reset(
2977 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002978 channel->SetInterface(&network_interface);
2979 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2980 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2981
2982 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00002983}
2984
solenberg1ac56142015-10-13 03:58:19 -07002985TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07002986 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002987 cricket::WebRtcVoiceMediaChannel* media_channel =
2988 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002989 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07002990 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07002991 int channel_id = voe_.GetLastChannel();
2992 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2993 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07002994 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07002995 int channel_id2 = voe_.GetLastChannel();
2996 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002997}
2998
solenberg1ac56142015-10-13 03:58:19 -07002999TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003000 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003001 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003002 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3003 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3004 EXPECT_TRUE(channel_->AddSendStream(
3005 cricket::StreamParams::CreateLegacy(kSsrc1)));
3006 int channel_id = voe_.GetLastChannel();
3007 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3008 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3009 EXPECT_TRUE(channel_->AddSendStream(
3010 cricket::StreamParams::CreateLegacy(kSsrc2)));
3011 int channel_id2 = voe_.GetLastChannel();
3012 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013}
3014
solenberg4bac9c52015-10-09 02:32:53 -07003015TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003016 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003017 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018 cricket::StreamParams stream;
3019 stream.ssrcs.push_back(kSsrc2);
3020 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003021 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003022 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003023 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003024}
3025
3026TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003027 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003028 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3029 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003030 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003031 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003032 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3033 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3034 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003035}
3036
pbos8fc7fa72015-07-15 08:02:58 -07003037TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003038 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003039 const std::string kSyncLabel = "AvSyncLabel";
3040
solenbergff976312016-03-30 23:28:51 -07003041 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003042 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3043 sp.sync_label = kSyncLabel;
3044 // Creating two channels to make sure that sync label is set properly for both
3045 // the default voice channel and following ones.
3046 EXPECT_TRUE(channel_->AddRecvStream(sp));
3047 sp.ssrcs[0] += 1;
3048 EXPECT_TRUE(channel_->AddRecvStream(sp));
3049
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003050 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003051 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003052 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003053 << "SyncGroup should be set based on sync_label";
3054 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003055 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003056 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003057}
3058
solenberg3a941542015-11-16 07:34:50 -08003059// TODO(solenberg): Remove, once recv streams are configured through Call.
3060// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003061TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003062 // Test that setting the header extensions results in the expected state
3063 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003064 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003065 ssrcs.push_back(223);
3066 ssrcs.push_back(224);
3067
solenbergff976312016-03-30 23:28:51 -07003068 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003069 cricket::WebRtcVoiceMediaChannel* media_channel =
3070 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003071 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003072 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003073 EXPECT_TRUE(media_channel->AddRecvStream(
3074 cricket::StreamParams::CreateLegacy(ssrc)));
3075 }
3076
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003077 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003078 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003079 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003080 EXPECT_NE(nullptr, s);
3081 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3082 }
3083
3084 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003085 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003086 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003087 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003088 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003089 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003090 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003091 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003092 EXPECT_NE(nullptr, s);
3093 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003094 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3095 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003096 for (const auto& s_ext : s_exts) {
3097 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003098 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003099 }
3100 }
3101 }
3102 }
3103
3104 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003105 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003106 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003107 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003108 EXPECT_NE(nullptr, s);
3109 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3110 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003111}
3112
3113TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3114 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003115 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003116 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003117 static const unsigned char kRtcp[] = {
3118 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3119 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3122 };
jbaucheec21bd2016-03-20 06:15:43 -07003123 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003124
solenbergff976312016-03-30 23:28:51 -07003125 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003126 cricket::WebRtcVoiceMediaChannel* media_channel =
3127 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003128 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003129 EXPECT_TRUE(media_channel->AddRecvStream(
3130 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3131
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003132 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003133 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003134 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003135 EXPECT_EQ(0, s->received_packets());
3136 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3137 EXPECT_EQ(1, s->received_packets());
3138 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3139 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003140}
Minyue2013aec2015-05-13 14:14:42 +02003141
solenberg0a617e22015-10-20 15:49:38 -07003142// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003143// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003144TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003145 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003146 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003147 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003148 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003149 int recv_ch = voe_.GetLastChannel();
3150 EXPECT_NE(recv_ch, default_channel);
3151 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3152 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3153 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003154 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003155 recv_ch = voe_.GetLastChannel();
3156 EXPECT_NE(recv_ch, default_channel);
3157 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003158}
3159
3160TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003161 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003162 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003163
solenberg8189b022016-06-14 12:13:00 -07003164 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003165 int recv_ch = voe_.GetLastChannel();
3166
3167 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3168 int send_ch = voe_.GetLastChannel();
3169
3170 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3171 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3172 // channel of |recv_ch|.This is not a common case, since, normally, only the
3173 // default channel can be associated. However, the default is not deletable.
3174 // So we force the |recv_ch| to associate with a non-default channel.
3175 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3176 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3177
3178 EXPECT_TRUE(channel_->RemoveSendStream(2));
3179 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3180}
stefan658910c2015-09-03 05:48:32 -07003181
deadbeef884f5852016-01-15 09:20:04 -08003182TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003183 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003184 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3185 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003186
3187 // Setting the sink before a recv stream exists should do nothing.
3188 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003189 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003190 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3191
3192 // Now try actually setting the sink.
3193 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3194 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3195
3196 // Now try resetting it.
3197 channel_->SetRawAudioSink(kSsrc1, nullptr);
3198 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3199}
3200
3201TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003202 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003203 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3204 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003205
3206 // Should be able to set a default sink even when no stream exists.
3207 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3208
3209 // Create default channel and ensure it's assigned the default sink.
3210 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3211 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3212
3213 // Try resetting the default sink.
3214 channel_->SetRawAudioSink(0, nullptr);
3215 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3216
3217 // Try setting the default sink while the default stream exists.
3218 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3219 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3220
3221 // If we remove and add a default stream, it should get the same sink.
3222 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3223 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3224 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3225}
3226
skvlad7a43d252016-03-22 15:32:27 -07003227// Test that, just like the video channel, the voice channel communicates the
3228// network state to the call.
3229TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003230 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003231
3232 EXPECT_EQ(webrtc::kNetworkUp,
3233 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3234 EXPECT_EQ(webrtc::kNetworkUp,
3235 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3236
3237 channel_->OnReadyToSend(false);
3238 EXPECT_EQ(webrtc::kNetworkDown,
3239 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3240 EXPECT_EQ(webrtc::kNetworkUp,
3241 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3242
3243 channel_->OnReadyToSend(true);
3244 EXPECT_EQ(webrtc::kNetworkUp,
3245 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3246 EXPECT_EQ(webrtc::kNetworkUp,
3247 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3248}
3249
aleloi18e0b672016-10-04 02:45:47 -07003250// Test that playout is still started after changing parameters
3251TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3252 SetupRecvStream();
3253 channel_->SetPlayout(true);
3254 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3255
3256 // Changing RTP header extensions will recreate the AudioReceiveStream.
3257 cricket::AudioRecvParameters parameters;
3258 parameters.extensions.push_back(
3259 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3260 channel_->SetRecvParameters(parameters);
3261
3262 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3263}
3264
stefan658910c2015-09-03 05:48:32 -07003265// Tests that the library initializes and shuts down properly.
3266TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003267 // If the VoiceEngine wants to gather available codecs early, that's fine but
3268 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003269 cricket::WebRtcVoiceEngine engine(
3270 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003271 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003272 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003273 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003274 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3275 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003276 EXPECT_TRUE(channel != nullptr);
3277 delete channel;
solenbergff976312016-03-30 23:28:51 -07003278}
stefan658910c2015-09-03 05:48:32 -07003279
solenbergff976312016-03-30 23:28:51 -07003280// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003281TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3282 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3283 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3284 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003285 {
ossuc54071d2016-08-17 02:45:41 -07003286 cricket::WebRtcVoiceEngine engine(
3287 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003288 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003289 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003290 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003291 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3292 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3293 EXPECT_TRUE(channel != nullptr);
3294 delete channel;
3295 }
stefan658910c2015-09-03 05:48:32 -07003296}
3297
3298// Tests that the library is configured with the codecs we want.
3299TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003300 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3301 // module.
3302
stefan658910c2015-09-03 05:48:32 -07003303 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003304 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003305 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003306 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003307 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003308 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003309 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003310 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003311 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003312 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003313 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003314 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003315 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003316 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003317 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003318 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003319 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003320 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003321 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003322 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003323 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003324 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003325 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003326 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003327 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003328 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003329 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003330 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003331 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003332 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003333 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003334 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003335 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003336 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003337 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003338 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003339 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003340 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003341 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003342 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003343 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003344 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003345 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003346 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003347 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003348 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003349 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003350 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003351 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003352
stefan658910c2015-09-03 05:48:32 -07003353 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003354 // TODO(ossu): Why are the payload types of codecs with non-static payload
3355 // type assignments checked here? It shouldn't really matter.
3356 cricket::WebRtcVoiceEngine engine(
3357 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
stefan658910c2015-09-03 05:48:32 -07003358 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossuc54071d2016-08-17 02:45:41 -07003359 engine.send_codecs().begin();
3360 it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003361 if (it->name == "CN" && it->clockrate == 16000) {
3362 EXPECT_EQ(105, it->id);
3363 } else if (it->name == "CN" && it->clockrate == 32000) {
3364 EXPECT_EQ(106, it->id);
3365 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3366 EXPECT_EQ(103, it->id);
3367 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3368 EXPECT_EQ(104, it->id);
3369 } else if (it->name == "G722" && it->clockrate == 8000) {
3370 EXPECT_EQ(9, it->id);
3371 } else if (it->name == "telephone-event") {
3372 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003373 } else if (it->name == "opus") {
3374 EXPECT_EQ(111, it->id);
3375 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3376 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003377 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3378 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3379 }
3380 }
stefan658910c2015-09-03 05:48:32 -07003381}
3382
3383// Tests that VoE supports at least 32 channels
3384TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003385 cricket::WebRtcVoiceEngine engine(
3386 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003387 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003388 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003389 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003390
3391 cricket::VoiceMediaChannel* channels[32];
3392 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003393 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003394 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3395 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003396 if (!channel)
3397 break;
stefan658910c2015-09-03 05:48:32 -07003398 channels[num_channels++] = channel;
3399 }
3400
tfarina5237aaf2015-11-10 23:44:30 -08003401 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003402 EXPECT_EQ(expected, num_channels);
3403
3404 while (num_channels > 0) {
3405 delete channels[--num_channels];
3406 }
stefan658910c2015-09-03 05:48:32 -07003407}
3408
3409// Test that we set our preferred codecs properly.
3410TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003411 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3412 // - Check that our builtin codecs are usable by Channel.
3413 // - The codecs provided by the engine is usable by Channel.
3414 // It does not check that the codecs in the RecvParameters are actually
3415 // what we sent in - though it's probably reasonable to expect so, if
3416 // SetRecvParameters returns true.
3417 // I think it will become clear once audio decoder injection is completed.
3418 cricket::WebRtcVoiceEngine engine(
3419 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003420 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003421 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003422 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003423 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3424 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003425 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003426 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003427 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003428}