blob: b6f3eae0a2457daa855d2089c0a70b8b5c13aec4 [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;
ivoc8c63a822016-10-21 04:10:03 -0700416 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700417 stats.typing_noise_detected = true;
418 return stats;
419 }
420 void SetAudioSendStreamStats() {
421 for (auto* s : call_.GetAudioSendStreams()) {
422 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200423 }
solenberg85a04962015-10-27 03:35:21 -0700424 }
solenberg566ef242015-11-06 15:34:49 -0800425 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
426 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700427 const auto stats = GetAudioSendStreamStats();
428 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
429 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
430 EXPECT_EQ(info.packets_sent, stats.packets_sent);
431 EXPECT_EQ(info.packets_lost, stats.packets_lost);
432 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
433 EXPECT_EQ(info.codec_name, stats.codec_name);
434 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
435 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
436 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
437 EXPECT_EQ(info.audio_level, stats.audio_level);
438 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
439 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
440 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
441 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
442 EXPECT_EQ(info.echo_return_loss_enhancement,
443 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700444 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800445 EXPECT_EQ(info.typing_noise_detected,
446 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700447 }
448
449 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
450 webrtc::AudioReceiveStream::Stats stats;
451 stats.remote_ssrc = 123;
452 stats.bytes_rcvd = 456;
453 stats.packets_rcvd = 768;
454 stats.packets_lost = 101;
455 stats.fraction_lost = 23.45f;
456 stats.codec_name = "codec_name_recv";
457 stats.ext_seqnum = 678;
458 stats.jitter_ms = 901;
459 stats.jitter_buffer_ms = 234;
460 stats.jitter_buffer_preferred_ms = 567;
461 stats.delay_estimate_ms = 890;
462 stats.audio_level = 1234;
463 stats.expand_rate = 5.67f;
464 stats.speech_expand_rate = 8.90f;
465 stats.secondary_decoded_rate = 1.23f;
466 stats.accelerate_rate = 4.56f;
467 stats.preemptive_expand_rate = 7.89f;
468 stats.decoding_calls_to_silence_generator = 12;
469 stats.decoding_calls_to_neteq = 345;
470 stats.decoding_normal = 67890;
471 stats.decoding_plc = 1234;
472 stats.decoding_cng = 5678;
473 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700474 stats.decoding_muted_output = 3456;
475 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200476 return stats;
477 }
478 void SetAudioReceiveStreamStats() {
479 for (auto* s : call_.GetAudioReceiveStreams()) {
480 s->SetStats(GetAudioReceiveStreamStats());
481 }
482 }
483 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700484 const auto stats = GetAudioReceiveStreamStats();
485 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
486 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
487 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
488 EXPECT_EQ(info.packets_lost, stats.packets_lost);
489 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
490 EXPECT_EQ(info.codec_name, stats.codec_name);
491 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
492 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
493 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200494 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700495 stats.jitter_buffer_preferred_ms);
496 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
497 EXPECT_EQ(info.audio_level, stats.audio_level);
498 EXPECT_EQ(info.expand_rate, stats.expand_rate);
499 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
500 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
501 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
502 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200503 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700504 stats.decoding_calls_to_silence_generator);
505 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
506 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
507 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
508 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
509 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700510 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700511 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200512 }
513
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000514 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700515 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700516 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200517 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700519 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700520 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200521 cricket::AudioSendParameters send_parameters_;
522 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800523 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800524 private:
525 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526};
527
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528// Tests that we can create and destroy a channel.
529TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700530 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000531}
532
solenberg31fec402016-05-06 02:13:12 -0700533// Test that we can add a send stream and that it has the correct defaults.
534TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
535 EXPECT_TRUE(SetupChannel());
536 EXPECT_TRUE(
537 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
538 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
539 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
540 EXPECT_EQ("", config.rtp.c_name);
541 EXPECT_EQ(0u, config.rtp.extensions.size());
542 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
543 config.send_transport);
544}
545
546// Test that we can add a receive stream and that it has the correct defaults.
547TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
548 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700549 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700550 const webrtc::AudioReceiveStream::Config& config =
551 GetRecvStreamConfig(kSsrc1);
552 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
553 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
554 EXPECT_FALSE(config.rtp.transport_cc);
555 EXPECT_EQ(0u, config.rtp.extensions.size());
556 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
557 config.rtcp_send_transport);
558 EXPECT_EQ("", config.sync_group);
559}
560
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700562// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700563// TODO(ossu): This test should move into a separate builtin audio codecs
564// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700565TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700566 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 ASSERT_FALSE(codecs.empty());
568 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
569 EXPECT_EQ(48000, codecs[0].clockrate);
570 EXPECT_EQ(2, codecs[0].channels);
571 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572}
573
stefanba4c0e42016-02-04 04:12:24 -0800574TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700575 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800576 bool opus_found = false;
577 for (cricket::AudioCodec codec : codecs) {
578 if (codec.name == "opus") {
579 EXPECT_TRUE(HasTransportCc(codec));
580 opus_found = true;
581 }
582 }
583 EXPECT_TRUE(opus_found);
584}
585
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000586// Tests that we can find codecs by name or id, and that we interpret the
587// clockrate and bitrate fields properly.
588TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
589 cricket::AudioCodec codec;
590 webrtc::CodecInst codec_inst;
591 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800592 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000593 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800594 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800596 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
597 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 // Find ISAC with a different payload id.
599 codec = kIsacCodec;
600 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800601 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 EXPECT_EQ(codec.id, codec_inst.pltype);
603 // Find PCMU with a 0 clockrate.
604 codec = kPcmuCodec;
605 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800606 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 EXPECT_EQ(codec.id, codec_inst.pltype);
608 EXPECT_EQ(8000, codec_inst.plfreq);
609 // Find PCMU with a 0 bitrate.
610 codec = kPcmuCodec;
611 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800612 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 EXPECT_EQ(codec.id, codec_inst.pltype);
614 EXPECT_EQ(64000, codec_inst.rate);
615 // Find ISAC with an explicit bitrate.
616 codec = kIsacCodec;
617 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800618 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 EXPECT_EQ(codec.id, codec_inst.pltype);
620 EXPECT_EQ(32000, codec_inst.rate);
621}
622
623// Test that we set our inbound codecs properly, including changing PT.
624TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700625 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200626 cricket::AudioRecvParameters parameters;
627 parameters.codecs.push_back(kIsacCodec);
628 parameters.codecs.push_back(kPcmuCodec);
629 parameters.codecs.push_back(kTelephoneEventCodec);
630 parameters.codecs[0].id = 106; // collide with existing telephone-event
631 parameters.codecs[2].id = 126;
632 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700633 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700634 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800636 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 gcodec.plfreq = 16000;
638 gcodec.channels = 1;
639 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
640 EXPECT_EQ(106, gcodec.pltype);
641 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800642 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 gcodec.plfreq = 8000;
644 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
645 EXPECT_EQ(126, gcodec.pltype);
646 EXPECT_STREQ("telephone-event", gcodec.plname);
647}
648
649// Test that we fail to set an unknown inbound codec.
650TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700651 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652 cricket::AudioRecvParameters parameters;
653 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700654 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200655 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656}
657
658// Test that we fail if we have duplicate types in the inbound list.
659TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700660 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200661 cricket::AudioRecvParameters parameters;
662 parameters.codecs.push_back(kIsacCodec);
663 parameters.codecs.push_back(kCn16000Codec);
664 parameters.codecs[1].id = kIsacCodec.id;
665 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666}
667
668// Test that we can decode OPUS without stereo parameters.
669TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700670 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200671 cricket::AudioRecvParameters parameters;
672 parameters.codecs.push_back(kIsacCodec);
673 parameters.codecs.push_back(kPcmuCodec);
674 parameters.codecs.push_back(kOpusCodec);
675 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700676 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700677 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800679 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000680 // Even without stereo parameters, recv codecs still specify channels = 2.
681 EXPECT_EQ(2, opus.channels);
682 EXPECT_EQ(111, opus.pltype);
683 EXPECT_STREQ("opus", opus.plname);
684 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700685 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 EXPECT_EQ(111, opus.pltype);
687}
688
689// Test that we can decode OPUS with stereo = 0.
690TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700691 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200692 cricket::AudioRecvParameters parameters;
693 parameters.codecs.push_back(kIsacCodec);
694 parameters.codecs.push_back(kPcmuCodec);
695 parameters.codecs.push_back(kOpusCodec);
696 parameters.codecs[2].params["stereo"] = "0";
697 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700698 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 int channel_num2 = voe_.GetLastChannel();
700 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800701 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702 // Even when stereo is off, recv codecs still specify channels = 2.
703 EXPECT_EQ(2, opus.channels);
704 EXPECT_EQ(111, opus.pltype);
705 EXPECT_STREQ("opus", opus.plname);
706 opus.pltype = 0;
707 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
708 EXPECT_EQ(111, opus.pltype);
709}
710
711// Test that we can decode OPUS with stereo = 1.
712TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700713 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200714 cricket::AudioRecvParameters parameters;
715 parameters.codecs.push_back(kIsacCodec);
716 parameters.codecs.push_back(kPcmuCodec);
717 parameters.codecs.push_back(kOpusCodec);
718 parameters.codecs[2].params["stereo"] = "1";
719 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700720 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 int channel_num2 = voe_.GetLastChannel();
722 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800723 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724 EXPECT_EQ(2, opus.channels);
725 EXPECT_EQ(111, opus.pltype);
726 EXPECT_STREQ("opus", opus.plname);
727 opus.pltype = 0;
728 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
729 EXPECT_EQ(111, opus.pltype);
730}
731
732// Test that changes to recv codecs are applied to all streams.
733TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700734 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200735 cricket::AudioRecvParameters parameters;
736 parameters.codecs.push_back(kIsacCodec);
737 parameters.codecs.push_back(kPcmuCodec);
738 parameters.codecs.push_back(kTelephoneEventCodec);
739 parameters.codecs[0].id = 106; // collide with existing telephone-event
740 parameters.codecs[2].id = 126;
741 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700742 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743 int channel_num2 = voe_.GetLastChannel();
744 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800745 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746 gcodec.plfreq = 16000;
747 gcodec.channels = 1;
748 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
749 EXPECT_EQ(106, gcodec.pltype);
750 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800751 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 gcodec.plfreq = 8000;
753 gcodec.channels = 1;
754 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
755 EXPECT_EQ(126, gcodec.pltype);
756 EXPECT_STREQ("telephone-event", gcodec.plname);
757}
758
759TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700760 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200761 cricket::AudioRecvParameters parameters;
762 parameters.codecs.push_back(kIsacCodec);
763 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765
766 int channel_num2 = voe_.GetLastChannel();
767 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800768 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 gcodec.plfreq = 16000;
770 gcodec.channels = 1;
771 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
772 EXPECT_EQ(106, gcodec.pltype);
773 EXPECT_STREQ("ISAC", gcodec.plname);
774}
775
776// Test that we can apply the same set of codecs again while playing.
777TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700778 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200779 cricket::AudioRecvParameters parameters;
780 parameters.codecs.push_back(kIsacCodec);
781 parameters.codecs.push_back(kCn16000Codec);
782 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700783 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200784 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785
786 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200787 parameters.codecs[0].id = 127;
788 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700789 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790}
791
792// Test that we can add a codec while playing.
793TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700794 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200795 cricket::AudioRecvParameters parameters;
796 parameters.codecs.push_back(kIsacCodec);
797 parameters.codecs.push_back(kCn16000Codec);
798 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700799 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200801 parameters.codecs.push_back(kOpusCodec);
802 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700803 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000804 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800805 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
807}
808
809TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700810 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000811
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000812 // Test that when autobw is enabled, bitrate is kept as the default
813 // value. autobw is enabled for the following tests because the target
814 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815
816 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700817 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818
819 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700820 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000822 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700823 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824}
825
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000826TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700827 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000829 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000830
831 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700832 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
833 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
834 // Rates above the max (56000) should be capped.
835 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000836
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000837 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700838 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
839 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
840 // Rates above the max (510000) should be capped.
841 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842}
843
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000844TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700845 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000846
847 // Test that we can only set a maximum bitrate for a fixed-rate codec
848 // if it's bigger than the fixed rate.
849
850 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700851 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
852 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
853 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
854 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
855 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
856 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
857 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000858}
859
860TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700861 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200862 const int kDesiredBitrate = 128000;
863 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700864 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200865 parameters.max_bandwidth_bps = kDesiredBitrate;
866 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000867
868 EXPECT_TRUE(channel_->AddSendStream(
869 cricket::StreamParams::CreateLegacy(kSsrc1)));
870
minyue7a973442016-10-20 03:27:12 -0700871 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000872}
873
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000874// Test that bitrate cannot be set for CBR codecs.
875// Bitrate is ignored if it is higher than the fixed bitrate.
876// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000877TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700878 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879
880 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200881 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700882 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200883
884 send_parameters_.max_bandwidth_bps = 128000;
885 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700886 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200887
888 send_parameters_.max_bandwidth_bps = 128;
889 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700890 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000891}
892
skvlade0d46372016-04-07 22:59:22 -0700893// Test that the per-stream bitrate limit and the global
894// bitrate limit both apply.
895TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
896 EXPECT_TRUE(SetupSendStream());
897
898 // opus, default bitrate == 64000.
899 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
900 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
901 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
902 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
903
904 // CBR codecs allow both maximums to exceed the bitrate.
905 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
906 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
907 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
908 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
909
910 // CBR codecs don't allow per stream maximums to be too low.
911 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
912 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
913}
914
915// Test that an attempt to set RtpParameters for a stream that does not exist
916// fails.
917TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
918 EXPECT_TRUE(SetupChannel());
919 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700920 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700921 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
922
923 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700924 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700925}
926
927TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700928 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700929 // This test verifies that setting RtpParameters succeeds only if
930 // the structure contains exactly one encoding.
931 // TODO(skvlad): Update this test when we start supporting setting parameters
932 // for each encoding individually.
933
934 EXPECT_TRUE(SetupSendStream());
935 // Setting RtpParameters with no encoding is expected to fail.
936 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700937 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700938 // Setting RtpParameters with exactly one encoding should succeed.
939 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700940 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700941 // Two or more encodings should result in failure.
942 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700943 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700944}
945
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700946// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700947// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700948TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
949 EXPECT_TRUE(SetupSendStream());
950 SetSend(channel_, true);
951 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
952 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700953 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700954 ASSERT_EQ(1u, parameters.encodings.size());
955 ASSERT_TRUE(parameters.encodings[0].active);
956 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700957 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700958 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
959
960 // Now change it back to active and verify we resume sending.
961 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700962 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700963 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
964}
965
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700966// Test that SetRtpSendParameters configures the correct encoding channel for
967// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700968TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
969 SetupForMultiSendStream();
970 // Create send streams.
971 for (uint32_t ssrc : kSsrcs4) {
972 EXPECT_TRUE(
973 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
974 }
975 // Configure one stream to be limited by the stream config, another to be
976 // limited by the global max, and the third one with no per-stream limit
977 // (still subject to the global limit).
978 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, 64000));
979 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
980 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
981 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
982
983 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
984 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
985 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
986
987 // Remove the global cap; the streams should switch to their respective
988 // maximums (or remain unchanged if there was no other limit on them.)
989 EXPECT_TRUE(SetGlobalMaxBitrate(kOpusCodec, -1));
990 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
991 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
992 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
993}
994
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700995// Test that GetRtpSendParameters returns the currently configured codecs.
996TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -0700997 EXPECT_TRUE(SetupSendStream());
998 cricket::AudioSendParameters parameters;
999 parameters.codecs.push_back(kIsacCodec);
1000 parameters.codecs.push_back(kPcmuCodec);
1001 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1002
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001003 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001004 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001005 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1006 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001007}
1008
1009// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001010TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001011 EXPECT_TRUE(SetupSendStream());
1012 cricket::AudioSendParameters parameters;
1013 parameters.codecs.push_back(kIsacCodec);
1014 parameters.codecs.push_back(kPcmuCodec);
1015 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1016
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001017 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001018
1019 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001020 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001021
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001022 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1023 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1024 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1025}
1026
1027// Test that GetRtpReceiveParameters returns the currently configured codecs.
1028TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1029 EXPECT_TRUE(SetupRecvStream());
1030 cricket::AudioRecvParameters parameters;
1031 parameters.codecs.push_back(kIsacCodec);
1032 parameters.codecs.push_back(kPcmuCodec);
1033 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1034
1035 webrtc::RtpParameters rtp_parameters =
1036 channel_->GetRtpReceiveParameters(kSsrc1);
1037 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1038 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1039 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1040}
1041
1042// Test that if we set/get parameters multiple times, we get the same results.
1043TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1044 EXPECT_TRUE(SetupRecvStream());
1045 cricket::AudioRecvParameters parameters;
1046 parameters.codecs.push_back(kIsacCodec);
1047 parameters.codecs.push_back(kPcmuCodec);
1048 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1049
1050 webrtc::RtpParameters initial_params =
1051 channel_->GetRtpReceiveParameters(kSsrc1);
1052
1053 // We should be able to set the params we just got.
1054 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1055
1056 // ... And this shouldn't change the params returned by
1057 // GetRtpReceiveParameters.
1058 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1059 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001060}
1061
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001062// Test that we apply codecs properly.
1063TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001064 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001065 cricket::AudioSendParameters parameters;
1066 parameters.codecs.push_back(kIsacCodec);
1067 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001068 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001069 parameters.codecs[0].id = 96;
1070 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001071 const int initial_num = call_.GetNumCreatedSendStreams();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001072 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001073 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1074 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1075 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1076 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1077 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1078 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1079 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1080 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001081 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001082}
1083
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001084// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1085// to apply.
1086TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001087 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001088 cricket::AudioSendParameters parameters;
1089 parameters.codecs.push_back(kIsacCodec);
1090 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001091 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001092 parameters.codecs[0].id = 96;
1093 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001094 const int initial_num = call_.GetNumCreatedSendStreams();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001095 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001096 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001097 // Calling SetSendCodec again with same codec which is already set.
1098 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001099 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001100 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001101}
1102
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001103// Verify that G722 is set with 16000 samples per second to WebRTC.
1104TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001105 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 cricket::AudioSendParameters parameters;
1107 parameters.codecs.push_back(kG722CodecSdp);
1108 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001109 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001110 EXPECT_STREQ("G722", gcodec.plname);
1111 EXPECT_EQ(1, gcodec.channels);
1112 EXPECT_EQ(16000, gcodec.plfreq);
1113}
1114
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001115// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001117 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001118 cricket::AudioSendParameters parameters;
1119 parameters.codecs.push_back(kOpusCodec);
1120 parameters.codecs[0].bitrate = 0;
1121 parameters.codecs[0].clockrate = 50000;
1122 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123}
1124
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001125// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001127 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001128 cricket::AudioSendParameters parameters;
1129 parameters.codecs.push_back(kOpusCodec);
1130 parameters.codecs[0].bitrate = 0;
1131 parameters.codecs[0].channels = 0;
1132 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133}
1134
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001135// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001137 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001138 cricket::AudioSendParameters parameters;
1139 parameters.codecs.push_back(kOpusCodec);
1140 parameters.codecs[0].bitrate = 0;
1141 parameters.codecs[0].channels = 0;
1142 parameters.codecs[0].params["stereo"] = "1";
1143 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001144}
1145
1146// Test that if channel is 1 for opus and there's no stereo, we fail.
1147TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001148 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001149 cricket::AudioSendParameters parameters;
1150 parameters.codecs.push_back(kOpusCodec);
1151 parameters.codecs[0].bitrate = 0;
1152 parameters.codecs[0].channels = 1;
1153 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154}
1155
1156// Test that if channel is 1 for opus and stereo=0, we fail.
1157TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001158 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001159 cricket::AudioSendParameters parameters;
1160 parameters.codecs.push_back(kOpusCodec);
1161 parameters.codecs[0].bitrate = 0;
1162 parameters.codecs[0].channels = 1;
1163 parameters.codecs[0].params["stereo"] = "0";
1164 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165}
1166
1167// Test that if channel is 1 for opus and stereo=1, we fail.
1168TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001169 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001170 cricket::AudioSendParameters parameters;
1171 parameters.codecs.push_back(kOpusCodec);
1172 parameters.codecs[0].bitrate = 0;
1173 parameters.codecs[0].channels = 1;
1174 parameters.codecs[0].params["stereo"] = "1";
1175 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176}
1177
1178// Test that with bitrate=0 and no stereo,
1179// channels and bitrate are 1 and 32000.
1180TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001181 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001182 cricket::AudioSendParameters parameters;
1183 parameters.codecs.push_back(kOpusCodec);
1184 parameters.codecs[0].bitrate = 0;
1185 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001186 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187}
1188
1189// Test that with bitrate=0 and stereo=0,
1190// channels and bitrate are 1 and 32000.
1191TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001192 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001193 cricket::AudioSendParameters parameters;
1194 parameters.codecs.push_back(kOpusCodec);
1195 parameters.codecs[0].bitrate = 0;
1196 parameters.codecs[0].params["stereo"] = "0";
1197 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001198 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001199}
1200
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001201// Test that with bitrate=invalid and stereo=0,
1202// channels and bitrate are 1 and 32000.
1203TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001204 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001205 cricket::AudioSendParameters parameters;
1206 parameters.codecs.push_back(kOpusCodec);
1207 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001208 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001209 parameters.codecs[0].bitrate = 5999;
1210 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001211 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001212
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001213 parameters.codecs[0].bitrate = 510001;
1214 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001215 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001216}
1217
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218// Test that with bitrate=0 and stereo=1,
1219// channels and bitrate are 2 and 64000.
1220TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001221 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001222 cricket::AudioSendParameters parameters;
1223 parameters.codecs.push_back(kOpusCodec);
1224 parameters.codecs[0].bitrate = 0;
1225 parameters.codecs[0].params["stereo"] = "1";
1226 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001227 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228}
1229
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001230// Test that with bitrate=invalid and stereo=1,
1231// channels and bitrate are 2 and 64000.
1232TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001233 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001234 cricket::AudioSendParameters parameters;
1235 parameters.codecs.push_back(kOpusCodec);
1236 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001237 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001238 parameters.codecs[0].bitrate = 5999;
1239 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001240 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001241
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001242 parameters.codecs[0].bitrate = 510001;
1243 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001244 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001245}
1246
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247// Test that with bitrate=N and stereo unset,
1248// channels and bitrate are 1 and N.
1249TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001250 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001251 cricket::AudioSendParameters parameters;
1252 parameters.codecs.push_back(kOpusCodec);
1253 parameters.codecs[0].bitrate = 96000;
1254 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001255 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001256 EXPECT_EQ(111, gcodec.pltype);
1257 EXPECT_EQ(96000, gcodec.rate);
1258 EXPECT_STREQ("opus", gcodec.plname);
1259 EXPECT_EQ(1, gcodec.channels);
1260 EXPECT_EQ(48000, gcodec.plfreq);
1261}
1262
1263// Test that with bitrate=N and stereo=0,
1264// channels and bitrate are 1 and N.
1265TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001266 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001267 cricket::AudioSendParameters parameters;
1268 parameters.codecs.push_back(kOpusCodec);
1269 parameters.codecs[0].bitrate = 30000;
1270 parameters.codecs[0].params["stereo"] = "0";
1271 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001272 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001273}
1274
1275// Test that with bitrate=N and without any parameters,
1276// channels and bitrate are 1 and N.
1277TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001278 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001279 cricket::AudioSendParameters parameters;
1280 parameters.codecs.push_back(kOpusCodec);
1281 parameters.codecs[0].bitrate = 30000;
1282 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001283 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001284}
1285
1286// Test that with bitrate=N and stereo=1,
1287// channels and bitrate are 2 and N.
1288TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001289 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001290 cricket::AudioSendParameters parameters;
1291 parameters.codecs.push_back(kOpusCodec);
1292 parameters.codecs[0].bitrate = 30000;
1293 parameters.codecs[0].params["stereo"] = "1";
1294 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001295 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001296}
1297
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001298// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1299// Also test that the "maxaveragebitrate" can't be set to values outside the
1300// range of 6000 and 510000
1301TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001302 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001303 cricket::AudioSendParameters parameters;
1304 parameters.codecs.push_back(kOpusCodec);
1305 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001306 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001307 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1308 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001309 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001310
1311 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001312 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1313 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001314 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001315
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001316 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1317 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001318 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001319}
1320
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001321// Test that we can enable NACK with opus as caller.
1322TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001323 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001324 cricket::AudioSendParameters parameters;
1325 parameters.codecs.push_back(kOpusCodec);
1326 parameters.codecs[0].AddFeedbackParam(
1327 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1328 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001329 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001330 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001331 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001332}
1333
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001334// Test that we can enable NACK with opus as callee.
1335TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001336 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001337 cricket::AudioSendParameters parameters;
1338 parameters.codecs.push_back(kOpusCodec);
1339 parameters.codecs[0].AddFeedbackParam(
1340 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1341 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001342 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 EXPECT_TRUE(channel_->SetSendParameters(parameters));
deadbeefb56069e2016-05-06 04:57:03 -07001344 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001345 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001346
1347 EXPECT_TRUE(channel_->AddSendStream(
1348 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001349 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001350}
1351
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352// Test that we can enable NACK on receive streams.
1353TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001354 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001355 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001356 cricket::AudioSendParameters parameters;
1357 parameters.codecs.push_back(kOpusCodec);
1358 parameters.codecs[0].AddFeedbackParam(
1359 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1360 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001361 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001362 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001364 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001365 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001366}
1367
1368// Test that we can disable NACK.
1369TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001370 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 cricket::AudioSendParameters parameters;
1372 parameters.codecs.push_back(kOpusCodec);
1373 parameters.codecs[0].AddFeedbackParam(
1374 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1375 cricket::kParamValueEmpty));
1376 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001377 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001378
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001379 parameters.codecs.clear();
1380 parameters.codecs.push_back(kOpusCodec);
1381 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001382 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001383}
1384
1385// Test that we can disable NACK on receive streams.
1386TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001387 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001388 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001389 cricket::AudioSendParameters parameters;
1390 parameters.codecs.push_back(kOpusCodec);
1391 parameters.codecs[0].AddFeedbackParam(
1392 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1393 cricket::kParamValueEmpty));
1394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001395 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001396 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001397
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001398 parameters.codecs.clear();
1399 parameters.codecs.push_back(kOpusCodec);
1400 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001401 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001402 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001403}
1404
1405// Test that NACK is enabled on a new receive stream.
1406TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001407 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001408 cricket::AudioSendParameters parameters;
1409 parameters.codecs.push_back(kIsacCodec);
1410 parameters.codecs.push_back(kCn16000Codec);
1411 parameters.codecs[0].AddFeedbackParam(
1412 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1413 cricket::kParamValueEmpty));
1414 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenberg971cab02016-06-14 10:02:41 -07001415 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416
solenberg8189b022016-06-14 12:13:00 -07001417 EXPECT_TRUE(AddRecvStream(kSsrc2));
1418 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1419 EXPECT_TRUE(AddRecvStream(kSsrc3));
1420 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001421}
1422
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001423// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001424TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001425 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001426 cricket::AudioSendParameters parameters;
1427 parameters.codecs.push_back(kOpusCodec);
1428 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001429 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001430}
1431
1432// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001433TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001434 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001435 cricket::AudioSendParameters parameters;
1436 parameters.codecs.push_back(kOpusCodec);
1437 parameters.codecs[0].bitrate = 0;
1438 parameters.codecs[0].params["useinbandfec"] = "0";
1439 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001440 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001441}
1442
1443// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001444TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001445 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001446 cricket::AudioSendParameters parameters;
1447 parameters.codecs.push_back(kOpusCodec);
1448 parameters.codecs[0].bitrate = 0;
1449 parameters.codecs[0].params["useinbandfec"] = "1";
1450 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001451 EXPECT_TRUE(GetCodecFec(kSsrc1));
1452 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001453}
1454
1455// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001456TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001457 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001458 cricket::AudioSendParameters parameters;
1459 parameters.codecs.push_back(kOpusCodec);
1460 parameters.codecs[0].bitrate = 0;
1461 parameters.codecs[0].params["stereo"] = "1";
1462 parameters.codecs[0].params["useinbandfec"] = "1";
1463 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001464 EXPECT_TRUE(GetCodecFec(kSsrc1));
1465 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001466}
1467
1468// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001469TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001470 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001471 cricket::AudioSendParameters parameters;
1472 parameters.codecs.push_back(kIsacCodec);
1473 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001474 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001475}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001476
1477// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1478TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001479 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001480 cricket::AudioSendParameters parameters;
1481 parameters.codecs.push_back(kIsacCodec);
1482 parameters.codecs[0].params["useinbandfec"] = "1";
1483 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001484 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001485}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001486
1487// Test that Opus FEC status can be changed.
1488TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001489 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001490 cricket::AudioSendParameters parameters;
1491 parameters.codecs.push_back(kOpusCodec);
1492 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001493 EXPECT_FALSE(GetCodecFec(kSsrc1));
1494
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001495 parameters.codecs[0].params["useinbandfec"] = "1";
1496 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001497 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001498}
1499
stefanba4c0e42016-02-04 04:12:24 -08001500TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001501 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001502 cricket::AudioSendParameters send_parameters;
1503 send_parameters.codecs.push_back(kOpusCodec);
1504 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1505 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1506
1507 cricket::AudioRecvParameters recv_parameters;
1508 recv_parameters.codecs.push_back(kIsacCodec);
1509 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001510 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001511 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1512 EXPECT_FALSE(
1513 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1514
ossudedfd282016-06-14 07:12:39 -07001515 send_parameters.codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -08001516 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1517 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1518 EXPECT_TRUE(
1519 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1520}
1521
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001522// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1523TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001524 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001525 cricket::AudioSendParameters parameters;
1526 parameters.codecs.push_back(kOpusCodec);
1527 parameters.codecs[0].bitrate = 0;
1528 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1529 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001530 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1531 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001532
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001533 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1534 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001535 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001536}
1537
1538// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1539TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001540 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001541 cricket::AudioSendParameters parameters;
1542 parameters.codecs.push_back(kOpusCodec);
1543 parameters.codecs[0].bitrate = 0;
1544 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1545 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001546 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1547 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001548
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001549 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1550 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001551 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001552}
1553
1554// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1555TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001556 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 cricket::AudioSendParameters parameters;
1558 parameters.codecs.push_back(kOpusCodec);
1559 parameters.codecs[0].bitrate = 0;
1560 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1561 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001562 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1563 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001564
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001565 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1566 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001567 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001568}
1569
1570// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1571TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001572 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 cricket::AudioSendParameters parameters;
1574 parameters.codecs.push_back(kOpusCodec);
1575 parameters.codecs[0].bitrate = 0;
1576 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1577 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001578 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1579 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001580
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1582 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001583 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001584}
1585
1586// Test 24000 < maxplaybackrate triggers Opus full band mode.
1587TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001588 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001589 cricket::AudioSendParameters parameters;
1590 parameters.codecs.push_back(kOpusCodec);
1591 parameters.codecs[0].bitrate = 0;
1592 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1593 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001594 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1595 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001596
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001597 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1598 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001599 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001600}
1601
1602// Test Opus that without maxplaybackrate, default playback rate is used.
1603TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001604 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 cricket::AudioSendParameters parameters;
1606 parameters.codecs.push_back(kOpusCodec);
1607 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001608 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001609}
1610
1611// Test the with non-Opus, maxplaybackrate has no effect.
1612TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001613 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001614 cricket::AudioSendParameters parameters;
1615 parameters.codecs.push_back(kIsacCodec);
1616 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1617 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001618 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001619}
1620
1621// Test maxplaybackrate can be set on two streams.
1622TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001623 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001624 cricket::AudioSendParameters parameters;
1625 parameters.codecs.push_back(kOpusCodec);
1626 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001627 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001628
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001629 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001630 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001631 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001632
1633 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001634 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001635}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001636
Minyue Li7100dcd2015-03-27 05:05:59 +01001637// Test that with usedtx=0, Opus DTX is off.
1638TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001639 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001640 cricket::AudioSendParameters parameters;
1641 parameters.codecs.push_back(kOpusCodec);
1642 parameters.codecs[0].params["usedtx"] = "0";
1643 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001644 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001645}
1646
1647// Test that with usedtx=1, Opus DTX is on.
1648TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001649 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001650 cricket::AudioSendParameters parameters;
1651 parameters.codecs.push_back(kOpusCodec);
1652 parameters.codecs[0].params["usedtx"] = "1";
1653 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001654 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001655}
1656
1657// Test that usedtx=1 works with stereo Opus.
1658TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001659 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001660 cricket::AudioSendParameters parameters;
1661 parameters.codecs.push_back(kOpusCodec);
1662 parameters.codecs[0].params["usedtx"] = "1";
1663 parameters.codecs[0].params["stereo"] = "1";
1664 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001665 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001666}
1667
1668// Test that usedtx=1 does not work with non Opus.
1669TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001670 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001671 cricket::AudioSendParameters parameters;
1672 parameters.codecs.push_back(kIsacCodec);
1673 parameters.codecs[0].params["usedtx"] = "1";
1674 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001675 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001676}
1677
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001678// Test that we can switch back and forth between Opus and ISAC with CN.
1679TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001680 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001681
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 cricket::AudioSendParameters opus_parameters;
1683 opus_parameters.codecs.push_back(kOpusCodec);
1684 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
minyue7a973442016-10-20 03:27:12 -07001685 {
1686 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1687 EXPECT_EQ(111, gcodec.pltype);
1688 EXPECT_STREQ("opus", gcodec.plname);
1689 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001691 cricket::AudioSendParameters isac_parameters;
1692 isac_parameters.codecs.push_back(kIsacCodec);
1693 isac_parameters.codecs.push_back(kCn16000Codec);
1694 isac_parameters.codecs.push_back(kOpusCodec);
1695 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
minyue7a973442016-10-20 03:27:12 -07001696 {
1697 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1698 EXPECT_EQ(103, gcodec.pltype);
1699 EXPECT_STREQ("ISAC", gcodec.plname);
1700 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001702 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
minyue7a973442016-10-20 03:27:12 -07001703 {
1704 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1705 EXPECT_EQ(111, gcodec.pltype);
1706 EXPECT_STREQ("opus", gcodec.plname);
1707 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708}
1709
1710// Test that we handle various ways of specifying bitrate.
1711TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001712 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001713 cricket::AudioSendParameters parameters;
1714 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1715 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001716 {
1717 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1718 EXPECT_EQ(103, gcodec.pltype);
1719 EXPECT_STREQ("ISAC", gcodec.plname);
1720 EXPECT_EQ(32000, gcodec.rate);
1721 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001722
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001723 parameters.codecs[0].bitrate = 0; // bitrate == default
1724 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001725 {
1726 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1727 EXPECT_EQ(103, gcodec.pltype);
1728 EXPECT_STREQ("ISAC", gcodec.plname);
1729 EXPECT_EQ(-1, gcodec.rate);
1730 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001731 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001733 {
1734 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1735 EXPECT_EQ(103, gcodec.pltype);
1736 EXPECT_STREQ("ISAC", gcodec.plname);
1737 EXPECT_EQ(28000, gcodec.rate);
1738 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001740 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1741 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001742 {
1743 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1744 EXPECT_EQ(0, gcodec.pltype);
1745 EXPECT_STREQ("PCMU", gcodec.plname);
1746 EXPECT_EQ(64000, gcodec.rate);
1747 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001749 parameters.codecs[0].bitrate = 0; // bitrate == default
1750 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001751 {
1752 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1753 EXPECT_EQ(0, gcodec.pltype);
1754 EXPECT_STREQ("PCMU", gcodec.plname);
1755 EXPECT_EQ(64000, gcodec.rate);
1756 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001758 parameters.codecs[0] = kOpusCodec;
1759 parameters.codecs[0].bitrate = 0; // bitrate == default
1760 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001761 {
1762 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1763 EXPECT_EQ(111, gcodec.pltype);
1764 EXPECT_STREQ("opus", gcodec.plname);
1765 EXPECT_EQ(32000, gcodec.rate);
1766 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767}
1768
Brave Yao5225dd82015-03-26 07:39:19 +08001769// Test that we could set packet size specified in kCodecParamPTime.
1770TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001771 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001772 cricket::AudioSendParameters parameters;
1773 parameters.codecs.push_back(kOpusCodec);
1774 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001776 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001777
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001778 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1779 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001780 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001781
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001782 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1783 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001784 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001785
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001786 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1787 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1788 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001789 EXPECT_EQ(480, GetCodecPacSize(
1790 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001791
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001792 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1793 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1794 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001795 EXPECT_EQ(640, GetCodecPacSize(
1796 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001797}
1798
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001799// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001801 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001802 cricket::AudioSendParameters parameters;
1803 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001804}
1805
1806// Test that we can set send codecs even with telephone-event codec as the first
1807// one on the list.
1808TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001809 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001810 cricket::AudioSendParameters parameters;
1811 parameters.codecs.push_back(kTelephoneEventCodec);
1812 parameters.codecs.push_back(kIsacCodec);
1813 parameters.codecs.push_back(kPcmuCodec);
1814 parameters.codecs[0].id = 98; // DTMF
1815 parameters.codecs[1].id = 96;
1816 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001817 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001818 EXPECT_EQ(96, gcodec.pltype);
1819 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001820 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001821}
1822
solenberg31642aa2016-03-14 08:00:37 -07001823// Test that payload type range is limited for telephone-event codec.
1824TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001825 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001826 cricket::AudioSendParameters parameters;
1827 parameters.codecs.push_back(kTelephoneEventCodec);
1828 parameters.codecs.push_back(kIsacCodec);
1829 parameters.codecs[0].id = 0; // DTMF
1830 parameters.codecs[1].id = 96;
1831 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1832 EXPECT_TRUE(channel_->CanInsertDtmf());
1833 parameters.codecs[0].id = 128; // DTMF
1834 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1835 EXPECT_FALSE(channel_->CanInsertDtmf());
1836 parameters.codecs[0].id = 127;
1837 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1838 EXPECT_TRUE(channel_->CanInsertDtmf());
1839 parameters.codecs[0].id = -1; // DTMF
1840 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1841 EXPECT_FALSE(channel_->CanInsertDtmf());
1842}
1843
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001844// Test that we can set send codecs even with CN codec as the first
1845// one on the list.
1846TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001847 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001848 cricket::AudioSendParameters parameters;
1849 parameters.codecs.push_back(kCn16000Codec);
1850 parameters.codecs.push_back(kIsacCodec);
1851 parameters.codecs.push_back(kPcmuCodec);
1852 parameters.codecs[0].id = 98; // wideband CN
1853 parameters.codecs[1].id = 96;
1854 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001855 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1856 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1857 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1858 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1859 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860}
1861
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001862// Test that we set VAD and DTMF types correctly as caller.
1863TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001864 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001865 cricket::AudioSendParameters parameters;
1866 parameters.codecs.push_back(kIsacCodec);
1867 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001868 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001869 parameters.codecs.push_back(kCn16000Codec);
1870 parameters.codecs.push_back(kCn8000Codec);
1871 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001872 parameters.codecs[0].id = 96;
1873 parameters.codecs[2].id = 97; // wideband CN
1874 parameters.codecs[4].id = 98; // DTMF
1875 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001876 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1877 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1878 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1879 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1880 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1881 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1882 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001883 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884}
1885
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001886// Test that we set VAD and DTMF types correctly as callee.
1887TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001888 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001889 cricket::AudioSendParameters parameters;
1890 parameters.codecs.push_back(kIsacCodec);
1891 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001892 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001893 parameters.codecs.push_back(kCn16000Codec);
1894 parameters.codecs.push_back(kCn8000Codec);
1895 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 parameters.codecs[0].id = 96;
1897 parameters.codecs[2].id = 97; // wideband CN
1898 parameters.codecs[4].id = 98; // DTMF
1899 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001900 EXPECT_TRUE(channel_->AddSendStream(
1901 cricket::StreamParams::CreateLegacy(kSsrc1)));
1902
minyue7a973442016-10-20 03:27:12 -07001903 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1904 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1905 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1906 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1907 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1908 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1909 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001910 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001911}
1912
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001913// Test that we only apply VAD if we have a CN codec that matches the
1914// send codec clockrate.
1915TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001916 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001917 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001918 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001919 parameters.codecs.push_back(kIsacCodec);
1920 parameters.codecs.push_back(kCn16000Codec);
1921 parameters.codecs[1].id = 97;
1922 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001923 {
1924 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1925 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1926 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1927 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1928 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1929 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
1930 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001932 parameters.codecs[0] = kPcmuCodec;
1933 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001934 {
1935 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1936 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1937 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1938 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001939 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001940 parameters.codecs[1] = kCn8000Codec;
1941 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001942 {
1943 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1944 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1945 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1946 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1947 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1948 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
1949 }
Brave Yao5225dd82015-03-26 07:39:19 +08001950 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001951 parameters.codecs[0] = kIsacCodec;
1952 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001953 {
1954 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1955 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1956 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1957 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958}
1959
1960// Test that we perform case-insensitive matching of codec names.
1961TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001962 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001963 cricket::AudioSendParameters parameters;
1964 parameters.codecs.push_back(kIsacCodec);
1965 parameters.codecs.push_back(kPcmuCodec);
1966 parameters.codecs.push_back(kCn16000Codec);
1967 parameters.codecs.push_back(kCn8000Codec);
1968 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001969 parameters.codecs[0].name = "iSaC";
1970 parameters.codecs[0].id = 96;
1971 parameters.codecs[2].id = 97; // wideband CN
1972 parameters.codecs[4].id = 98; // DTMF
1973 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue7a973442016-10-20 03:27:12 -07001974 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1975 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1976 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1977 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1978 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1979 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1980 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001981 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001982}
1983
stefanba4c0e42016-02-04 04:12:24 -08001984class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1985 public:
1986 WebRtcVoiceEngineWithSendSideBweTest()
1987 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1988};
1989
1990TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1991 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07001992 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08001993 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07001994 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
1995 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
1996 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08001997 extension.id);
1998 return;
1999 }
2000 }
2001 FAIL() << "Transport sequence number extension not in header-extension list.";
2002}
2003
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002004// Test support for audio level header extension.
2005TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002006 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002007}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002008TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002009 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002010}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002011
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002012// Test support for absolute send time header extension.
2013TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002014 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002015}
2016TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002017 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002018}
2019
solenberg1ac56142015-10-13 03:58:19 -07002020// Test that we can create a channel and start sending on it.
2021TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002022 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002023 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002024 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002025 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenbergd53a3f92016-04-14 13:56:37 -07002026 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002027 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2028}
2029
2030// Test that a channel will send if and only if it has a source and is enabled
2031// for sending.
2032TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002033 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002034 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2035 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
solenbergd53a3f92016-04-14 13:56:37 -07002036 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002037 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2038 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2039 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2040 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2041 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002042}
2043
solenberg94218532016-06-16 10:53:22 -07002044// Test that a channel is muted/unmuted.
2045TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2046 EXPECT_TRUE(SetupSendStream());
2047 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2048 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2049 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2050 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
2051 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
2052 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2053}
2054
solenberg6d6e7c52016-04-13 09:07:30 -07002055// Test that SetSendParameters() does not alter a stream's send state.
2056TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2057 EXPECT_TRUE(SetupSendStream());
2058 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2059
2060 // Turn on sending.
solenbergd53a3f92016-04-14 13:56:37 -07002061 SetSend(channel_, true);
solenberg6d6e7c52016-04-13 09:07:30 -07002062 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2063
2064 // Changing RTP header extensions will recreate the AudioSendStream.
2065 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002066 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg6d6e7c52016-04-13 09:07:30 -07002067 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2068 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2069
2070 // Turn off sending.
solenbergd53a3f92016-04-14 13:56:37 -07002071 SetSend(channel_, false);
solenberg6d6e7c52016-04-13 09:07:30 -07002072 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2073
2074 // Changing RTP header extensions will recreate the AudioSendStream.
2075 send_parameters_.extensions.clear();
2076 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2077 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2078}
2079
solenberg1ac56142015-10-13 03:58:19 -07002080// Test that we can create a channel and start playing out on it.
2081TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002082 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002083 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002084 channel_->SetPlayout(true);
2085 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2086 channel_->SetPlayout(false);
2087 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088}
2089
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002090// Test that we can add and remove send streams.
2091TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2092 SetupForMultiSendStream();
2093
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002094 // Set the global state for sending.
solenbergd53a3f92016-04-14 13:56:37 -07002095 SetSend(channel_, true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002096
solenbergc96df772015-10-21 13:01:53 -07002097 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002098 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002099 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002100 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002101 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002102 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002103 }
tfarina5237aaf2015-11-10 23:44:30 -08002104 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002105
solenbergc96df772015-10-21 13:01:53 -07002106 // Delete the send streams.
2107 for (uint32_t ssrc : kSsrcs4) {
2108 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002109 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002110 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002111 }
solenbergc96df772015-10-21 13:01:53 -07002112 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002113}
2114
2115// Test SetSendCodecs correctly configure the codecs in all send streams.
2116TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2117 SetupForMultiSendStream();
2118
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002119 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002120 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002121 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002122 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002123 }
2124
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002125 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002126 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002127 parameters.codecs.push_back(kIsacCodec);
2128 parameters.codecs.push_back(kCn16000Codec);
2129 parameters.codecs[1].id = 97;
2130 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002131
2132 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002133 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002134 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2135 const auto& send_codec_spec =
2136 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2137 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2138 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2139 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2140 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2141 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002142 }
2143
minyue7a973442016-10-20 03:27:12 -07002144 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002145 parameters.codecs[0] = kPcmuCodec;
2146 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002147 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002148 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2149 const auto& send_codec_spec =
2150 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2151 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2152 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2153 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2154 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002155 }
2156}
2157
2158// Test we can SetSend on all send streams correctly.
2159TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2160 SetupForMultiSendStream();
2161
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002162 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002163 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002164 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002165 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002166 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2167 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002168 }
2169
2170 // Set the global state for starting sending.
solenbergd53a3f92016-04-14 13:56:37 -07002171 SetSend(channel_, true);
solenbergc96df772015-10-21 13:01:53 -07002172 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002173 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002174 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002175 }
2176
2177 // Set the global state for stopping sending.
solenbergd53a3f92016-04-14 13:56:37 -07002178 SetSend(channel_, false);
solenbergc96df772015-10-21 13:01:53 -07002179 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002180 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002181 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002182 }
2183}
2184
2185// Test we can set the correct statistics on all send streams.
2186TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2187 SetupForMultiSendStream();
2188
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002189 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002190 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002191 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002192 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002193 }
solenberg85a04962015-10-27 03:35:21 -07002194
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002195 // Create a receive stream to check that none of the send streams end up in
2196 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002197 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002198
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002199 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002200 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2201 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002202 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002203
solenberg85a04962015-10-27 03:35:21 -07002204 // Check stats for the added streams.
2205 {
2206 cricket::VoiceMediaInfo info;
2207 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002208
solenberg85a04962015-10-27 03:35:21 -07002209 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002210 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002211 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002212 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002213 }
2214
2215 // We have added one receive stream. We should see empty stats.
2216 EXPECT_EQ(info.receivers.size(), 1u);
2217 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002218 }
solenberg1ac56142015-10-13 03:58:19 -07002219
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002220 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002221 {
2222 cricket::VoiceMediaInfo info;
2223 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2224 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002225 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002226 EXPECT_EQ(0u, info.receivers.size());
2227 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002228
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002229 // Deliver a new packet - a default receive stream should be created and we
2230 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002231 {
2232 cricket::VoiceMediaInfo info;
2233 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2234 SetAudioReceiveStreamStats();
2235 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002236 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002237 EXPECT_EQ(1u, info.receivers.size());
2238 VerifyVoiceReceiverInfo(info.receivers[0]);
2239 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002240}
2241
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002242// Test that we can add and remove receive streams, and do proper send/playout.
2243// We can receive on multiple streams while sending one stream.
2244TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002245 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246
solenberg1ac56142015-10-13 03:58:19 -07002247 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002248 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002249 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002250
solenberg1ac56142015-10-13 03:58:19 -07002251 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002252 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenbergd53a3f92016-04-14 13:56:37 -07002253 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002254 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255
solenberg1ac56142015-10-13 03:58:19 -07002256 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002257 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002258
2259 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002260 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002261 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2262 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002263
2264 // Stop sending.
solenbergd53a3f92016-04-14 13:56:37 -07002265 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002266 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002267
2268 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002269 channel_->SetPlayout(false);
2270 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2271 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002272
aleloi84ef6152016-08-04 05:28:21 -07002273 // Restart playout and make sure recv streams are played out.
2274 channel_->SetPlayout(true);
2275 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2276 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277
aleloi84ef6152016-08-04 05:28:21 -07002278 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002279 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2280 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281}
2282
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002283// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002284// and start sending on it.
2285TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002286 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002287 cricket::AudioOptions options_adjust_agc;
2288 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002289 webrtc::AgcConfig agc_config;
2290 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2291 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002292 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002293 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenbergd53a3f92016-04-14 13:56:37 -07002294 SetSend(channel_, true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002295 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002296 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2297 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenbergd53a3f92016-04-14 13:56:37 -07002298 SetSend(channel_, false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002299 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002300 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301}
2302
wu@webrtc.org97077a32013-10-25 21:18:33 +00002303TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002304 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002305 EXPECT_CALL(adm_,
2306 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002307 webrtc::AgcConfig agc_config;
2308 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2309 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002310 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2311 send_parameters_.options.tx_agc_digital_compression_gain =
2312 rtc::Optional<uint16_t>(9);
2313 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2314 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2315 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002316 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2317 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2318 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2319 EXPECT_TRUE(agc_config.limiterEnable);
2320
2321 // Check interaction with adjust_agc_delta. Both should be respected, for
2322 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002323 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2324 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002325 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2326 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2327}
2328
wu@webrtc.org97077a32013-10-25 21:18:33 +00002329TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002330 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002331 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2332 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002333 send_parameters_.options.recording_sample_rate =
2334 rtc::Optional<uint32_t>(48000);
2335 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2336 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002337}
2338
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002340// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002342 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002343 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344}
2345
2346TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2347 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002348 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002349 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002350 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002351 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002352 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2353 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002354 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355
solenberg85a04962015-10-27 03:35:21 -07002356 // Check stats for the added streams.
2357 {
2358 cricket::VoiceMediaInfo info;
2359 EXPECT_EQ(true, channel_->GetStats(&info));
2360
2361 // We have added one send stream. We should see the stats we've set.
2362 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002363 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002364 // We have added one receive stream. We should see empty stats.
2365 EXPECT_EQ(info.receivers.size(), 1u);
2366 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2367 }
solenberg1ac56142015-10-13 03:58:19 -07002368
solenberg566ef242015-11-06 15:34:49 -08002369 // Start sending - this affects some reported stats.
2370 {
2371 cricket::VoiceMediaInfo info;
solenbergd53a3f92016-04-14 13:56:37 -07002372 SetSend(channel_, true);
solenberg566ef242015-11-06 15:34:49 -08002373 EXPECT_EQ(true, channel_->GetStats(&info));
2374 VerifyVoiceSenderInfo(info.senders[0], true);
2375 }
2376
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002377 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002378 {
2379 cricket::VoiceMediaInfo info;
2380 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2381 EXPECT_EQ(true, channel_->GetStats(&info));
2382 EXPECT_EQ(1u, info.senders.size());
2383 EXPECT_EQ(0u, info.receivers.size());
2384 }
solenberg1ac56142015-10-13 03:58:19 -07002385
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002386 // Deliver a new packet - a default receive stream should be created and we
2387 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002388 {
2389 cricket::VoiceMediaInfo info;
2390 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2391 SetAudioReceiveStreamStats();
2392 EXPECT_EQ(true, channel_->GetStats(&info));
2393 EXPECT_EQ(1u, info.senders.size());
2394 EXPECT_EQ(1u, info.receivers.size());
2395 VerifyVoiceReceiverInfo(info.receivers[0]);
2396 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397}
2398
2399// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002400// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002401TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002402 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002403 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002404 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002405 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406}
2407
2408// Test that the local SSRC is the same on sending and receiving channels if the
2409// receive channel is created before the send channel.
2410TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002411 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002412 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002413 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002414 cricket::StreamParams::CreateLegacy(kSsrc1)));
2415 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2416 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417}
2418
2419// Test that we can properly receive packets.
2420TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002421 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002422 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002424
2425 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2426 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427}
2428
2429// Test that we can properly receive packets on multiple streams.
2430TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002431 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002432 const uint32_t ssrc1 = 1;
2433 const uint32_t ssrc2 = 2;
2434 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002435 EXPECT_TRUE(AddRecvStream(ssrc1));
2436 EXPECT_TRUE(AddRecvStream(ssrc2));
2437 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002438 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002439 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002440 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002442 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002443 }
mflodman3d7db262016-04-29 00:57:13 -07002444
2445 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2446 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2447 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2448
2449 EXPECT_EQ(s1.received_packets(), 0);
2450 EXPECT_EQ(s2.received_packets(), 0);
2451 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002452
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002454 EXPECT_EQ(s1.received_packets(), 0);
2455 EXPECT_EQ(s2.received_packets(), 0);
2456 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002457
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002459 EXPECT_EQ(s1.received_packets(), 1);
2460 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2461 EXPECT_EQ(s2.received_packets(), 0);
2462 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002463
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002465 EXPECT_EQ(s1.received_packets(), 1);
2466 EXPECT_EQ(s2.received_packets(), 1);
2467 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2468 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002469
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002471 EXPECT_EQ(s1.received_packets(), 1);
2472 EXPECT_EQ(s2.received_packets(), 1);
2473 EXPECT_EQ(s3.received_packets(), 1);
2474 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002475
mflodman3d7db262016-04-29 00:57:13 -07002476 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2477 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2478 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479}
2480
solenberg7e63ef02015-11-20 00:19:43 -08002481// Test that receiving on an unsignalled stream works (default channel will be
2482// created).
2483TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002484 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002485 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2486
solenberg7e63ef02015-11-20 00:19:43 -08002487 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002488
2489 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2490 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2491 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002492}
2493
2494// Test that receiving on an unsignalled stream works (default channel will be
2495// created), and that packets will be forwarded to the default channel
2496// regardless of their SSRCs.
2497TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002498 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002499 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002500 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2501
mflodman3d7db262016-04-29 00:57:13 -07002502 // Note that ssrc = 0 is not supported.
2503 uint32_t ssrc = 1;
2504 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002505 rtc::SetBE32(&packet[8], ssrc);
2506 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002507
2508 // Verify we only have one default stream.
2509 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2510 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2511 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002512 }
mflodman3d7db262016-04-29 00:57:13 -07002513
2514 // Sending the same ssrc again should not create a new stream.
2515 --ssrc;
2516 DeliverPacket(packet, sizeof(packet));
2517 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2518 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2519 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002520}
2521
2522// Test that a default channel is created even after a signalled stream has been
2523// added, and that this stream will get any packets for unknown SSRCs.
2524TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002525 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002526 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002527 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2528
2529 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002530 const uint32_t signaled_ssrc = 1;
2531 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002532 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002533 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002534 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2535 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002536
2537 // Note that the first unknown SSRC cannot be 0, because we only support
2538 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002539 const uint32_t unsignaled_ssrc = 7011;
2540 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002541 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002542 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2543 packet, sizeof(packet)));
2544 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2545
2546 DeliverPacket(packet, sizeof(packet));
2547 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2548
2549 rtc::SetBE32(&packet[8], signaled_ssrc);
2550 DeliverPacket(packet, sizeof(packet));
2551 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2552 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002553}
2554
solenberg0a617e22015-10-20 15:49:38 -07002555// Test that we properly handle failures to add a receive stream.
2556TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002557 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002558 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002559 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560}
2561
solenberg0a617e22015-10-20 15:49:38 -07002562// Test that we properly handle failures to add a send stream.
2563TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002564 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002565 voe_.set_fail_create_channel(true);
2566 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2567}
2568
solenberg1ac56142015-10-13 03:58:19 -07002569// Test that AddRecvStream creates new stream.
2570TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002571 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002572 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002573 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002574 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002575}
2576
2577// Test that after adding a recv stream, we do not decode more codecs than
2578// those previously passed into SetRecvCodecs.
2579TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002580 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002581 cricket::AudioRecvParameters parameters;
2582 parameters.codecs.push_back(kIsacCodec);
2583 parameters.codecs.push_back(kPcmuCodec);
2584 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002585 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586 int channel_num2 = voe_.GetLastChannel();
2587 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002588 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002589 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002590 gcodec.channels = 2;
2591 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2592}
2593
2594// Test that we properly clean up any streams that were added, even if
2595// not explicitly removed.
2596TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002597 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002598 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8189b022016-06-14 12:13:00 -07002599 EXPECT_TRUE(AddRecvStream(1));
2600 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002601 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2602 delete channel_;
2603 channel_ = NULL;
2604 EXPECT_EQ(0, voe_.GetNumChannels());
2605}
2606
wu@webrtc.org78187522013-10-07 23:32:02 +00002607TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002608 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002609 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002610}
2611
2612TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002613 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002614 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002615 // Manually delete channel to simulate a failure.
2616 int channel = voe_.GetLastChannel();
2617 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2618 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002619 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002620 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002621 EXPECT_NE(channel, new_channel);
2622 // The last created channel is deleted too.
2623 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002624}
2625
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002626// Test the InsertDtmf on default send stream as caller.
2627TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2628 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002629}
2630
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002631// Test the InsertDtmf on default send stream as callee
2632TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2633 TestInsertDtmf(0, false);
2634}
2635
2636// Test the InsertDtmf on specified send stream as caller.
2637TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2638 TestInsertDtmf(kSsrc1, true);
2639}
2640
2641// Test the InsertDtmf on specified send stream as callee.
2642TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2643 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644}
2645
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002646TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002647 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002648 EXPECT_CALL(adm_,
2649 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2650 EXPECT_CALL(adm_,
2651 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2652 EXPECT_CALL(adm_,
2653 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002654 bool ec_enabled;
2655 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656 webrtc::AecmModes aecm_mode;
2657 bool cng_enabled;
2658 bool agc_enabled;
2659 webrtc::AgcModes agc_mode;
2660 webrtc::AgcConfig agc_config;
2661 bool ns_enabled;
2662 webrtc::NsModes ns_mode;
2663 bool highpass_filter_enabled;
2664 bool stereo_swapping_enabled;
2665 bool typing_detection_enabled;
2666 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 voe_.GetAecmMode(aecm_mode, cng_enabled);
2668 voe_.GetAgcStatus(agc_enabled, agc_mode);
2669 voe_.GetAgcConfig(agc_config);
2670 voe_.GetNsStatus(ns_enabled, ns_mode);
2671 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2672 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2673 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2674 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002675 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 EXPECT_FALSE(cng_enabled);
2677 EXPECT_TRUE(agc_enabled);
2678 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2679 EXPECT_TRUE(ns_enabled);
2680 EXPECT_TRUE(highpass_filter_enabled);
2681 EXPECT_FALSE(stereo_swapping_enabled);
2682 EXPECT_TRUE(typing_detection_enabled);
2683 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2684 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002685 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2686 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687
solenberg246b8172015-12-08 09:50:23 -08002688 // Nothing set in AudioOptions, so everything should be as default.
2689 send_parameters_.options = cricket::AudioOptions();
2690 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002691 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002692 voe_.GetAecmMode(aecm_mode, cng_enabled);
2693 voe_.GetAgcStatus(agc_enabled, agc_mode);
2694 voe_.GetAgcConfig(agc_config);
2695 voe_.GetNsStatus(ns_enabled, ns_mode);
2696 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2697 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2698 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2699 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002700 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002701 EXPECT_FALSE(cng_enabled);
2702 EXPECT_TRUE(agc_enabled);
2703 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2704 EXPECT_TRUE(ns_enabled);
2705 EXPECT_TRUE(highpass_filter_enabled);
2706 EXPECT_FALSE(stereo_swapping_enabled);
2707 EXPECT_TRUE(typing_detection_enabled);
2708 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2709 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002710 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2711 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002712
2713 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002714 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2715 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716 voe_.GetEcStatus(ec_enabled, ec_mode);
2717 EXPECT_FALSE(ec_enabled);
2718
2719 // Turn echo cancellation back on, with settings, and make sure
2720 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002721 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2722 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002724 voe_.GetAecmMode(aecm_mode, cng_enabled);
2725 voe_.GetAgcStatus(agc_enabled, agc_mode);
2726 voe_.GetAgcConfig(agc_config);
2727 voe_.GetNsStatus(ns_enabled, ns_mode);
2728 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2729 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2730 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2731 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002732 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002733 EXPECT_TRUE(agc_enabled);
2734 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2735 EXPECT_TRUE(ns_enabled);
2736 EXPECT_TRUE(highpass_filter_enabled);
2737 EXPECT_FALSE(stereo_swapping_enabled);
2738 EXPECT_TRUE(typing_detection_enabled);
2739 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2740 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2741
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002742 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2743 // control.
solenberg246b8172015-12-08 09:50:23 -08002744 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2745 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002746 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002747 voe_.GetAecmMode(aecm_mode, cng_enabled);
2748 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002749 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002750 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2751
2752 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002753 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2754 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2755 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2756 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002757 voe_.GetEcStatus(ec_enabled, ec_mode);
2758 EXPECT_FALSE(ec_enabled);
2759 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002760 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2761 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002762 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002763 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002764 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002765 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2766
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002768 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2769 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002770 voe_.GetAgcStatus(agc_enabled, agc_mode);
2771 EXPECT_FALSE(agc_enabled);
2772
2773 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002774 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2775 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2776 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777 voe_.GetAgcStatus(agc_enabled, agc_mode);
2778 EXPECT_TRUE(agc_enabled);
2779 voe_.GetAgcConfig(agc_config);
2780 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2781
2782 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002783 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2784 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2785 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2786 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2787 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002788 voe_.GetNsStatus(ns_enabled, ns_mode);
2789 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2790 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2791 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2792 EXPECT_FALSE(ns_enabled);
2793 EXPECT_FALSE(highpass_filter_enabled);
2794 EXPECT_FALSE(typing_detection_enabled);
2795 EXPECT_TRUE(stereo_swapping_enabled);
2796
solenberg1ac56142015-10-13 03:58:19 -07002797 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002798 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002799 voe_.GetEcStatus(ec_enabled, ec_mode);
2800 voe_.GetNsStatus(ns_enabled, ns_mode);
2801 EXPECT_TRUE(ec_enabled);
2802 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2803 EXPECT_FALSE(ns_enabled);
2804 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2805}
2806
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002807TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002808 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809
2810 bool ec_enabled;
2811 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002812 bool agc_enabled;
2813 webrtc::AgcModes agc_mode;
2814 bool ns_enabled;
2815 webrtc::NsModes ns_mode;
2816 bool highpass_filter_enabled;
2817 bool stereo_swapping_enabled;
2818 bool typing_detection_enabled;
2819
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002820 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002821 voe_.GetAgcStatus(agc_enabled, agc_mode);
2822 voe_.GetNsStatus(ns_enabled, ns_mode);
2823 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2824 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2825 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2826 EXPECT_TRUE(ec_enabled);
2827 EXPECT_TRUE(agc_enabled);
2828 EXPECT_TRUE(ns_enabled);
2829 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002830 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002831 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002832}
2833
2834TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2835 webrtc::AgcConfig set_config = {0};
2836 set_config.targetLeveldBOv = 3;
2837 set_config.digitalCompressionGaindB = 9;
2838 set_config.limiterEnable = true;
2839 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002840
2841 webrtc::AgcConfig config = {0};
2842 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2843 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2844 EXPECT_EQ(set_config.digitalCompressionGaindB,
2845 config.digitalCompressionGaindB);
2846 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2847}
2848
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002849TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002850 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002851 EXPECT_CALL(adm_,
2852 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2853 EXPECT_CALL(adm_,
2854 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2855 EXPECT_CALL(adm_,
2856 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
2857
kwiberg686a8ef2016-02-26 03:00:35 -08002858 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002859 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002860 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002861 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002862 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002863 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002864
2865 // Have to add a stream to make SetSend work.
2866 cricket::StreamParams stream1;
2867 stream1.ssrcs.push_back(1);
2868 channel1->AddSendStream(stream1);
2869 cricket::StreamParams stream2;
2870 stream2.ssrcs.push_back(2);
2871 channel2->AddSendStream(stream2);
2872
2873 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002874 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002875 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2876 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2877 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002878 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2879 EXPECT_EQ(parameters_options_all.options, channel1->options());
2880 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2881 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002882
2883 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002884 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002885 parameters_options_no_ns.options.noise_suppression =
2886 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002887 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2888 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002889 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2890 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2891 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002892 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002893
2894 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002895 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002896 parameters_options_no_agc.options.auto_gain_control =
2897 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002898 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002899 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2900 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2901 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002902 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903
solenberg246b8172015-12-08 09:50:23 -08002904 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002905 bool ec_enabled;
2906 webrtc::EcModes ec_mode;
2907 bool agc_enabled;
2908 webrtc::AgcModes agc_mode;
2909 bool ns_enabled;
2910 webrtc::NsModes ns_mode;
2911 voe_.GetEcStatus(ec_enabled, ec_mode);
2912 voe_.GetAgcStatus(agc_enabled, agc_mode);
2913 voe_.GetNsStatus(ns_enabled, ns_mode);
2914 EXPECT_TRUE(ec_enabled);
2915 EXPECT_TRUE(agc_enabled);
2916 EXPECT_TRUE(ns_enabled);
2917
solenbergd53a3f92016-04-14 13:56:37 -07002918 SetSend(channel1.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919 voe_.GetEcStatus(ec_enabled, ec_mode);
2920 voe_.GetAgcStatus(agc_enabled, agc_mode);
2921 voe_.GetNsStatus(ns_enabled, ns_mode);
2922 EXPECT_TRUE(ec_enabled);
2923 EXPECT_TRUE(agc_enabled);
2924 EXPECT_FALSE(ns_enabled);
2925
solenbergd53a3f92016-04-14 13:56:37 -07002926 SetSend(channel2.get(), true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927 voe_.GetEcStatus(ec_enabled, ec_mode);
2928 voe_.GetAgcStatus(agc_enabled, agc_mode);
2929 voe_.GetNsStatus(ns_enabled, ns_mode);
2930 EXPECT_TRUE(ec_enabled);
2931 EXPECT_FALSE(agc_enabled);
2932 EXPECT_TRUE(ns_enabled);
2933
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002934 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002935 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002936 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2937 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002938 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002939 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002940 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002941 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002942 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002943 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002944 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2945 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2946 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002947 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002948 voe_.GetEcStatus(ec_enabled, ec_mode);
2949 voe_.GetAgcStatus(agc_enabled, agc_mode);
2950 voe_.GetNsStatus(ns_enabled, ns_mode);
2951 EXPECT_TRUE(ec_enabled);
2952 EXPECT_FALSE(agc_enabled);
2953 EXPECT_FALSE(ns_enabled);
2954}
2955
wu@webrtc.orgde305012013-10-31 15:40:38 +00002956// This test verifies DSCP settings are properly applied on voice media channel.
2957TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07002958 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08002959 cricket::FakeNetworkInterface network_interface;
2960 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08002961 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08002962
solenbergbc37fc82016-04-04 09:54:44 -07002963 channel.reset(
2964 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002965 channel->SetInterface(&network_interface);
2966 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2967 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2968
2969 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07002970 channel.reset(
2971 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002972 channel->SetInterface(&network_interface);
2973 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
2974
2975 // Verify that setting the option to false resets the
2976 // DiffServCodePoint.
2977 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07002978 channel.reset(
2979 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002980 channel->SetInterface(&network_interface);
2981 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2982 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2983
2984 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00002985}
2986
solenberg1ac56142015-10-13 03:58:19 -07002987TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07002988 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002989 cricket::WebRtcVoiceMediaChannel* media_channel =
2990 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002991 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07002992 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07002993 int channel_id = voe_.GetLastChannel();
2994 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2995 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07002996 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07002997 int channel_id2 = voe_.GetLastChannel();
2998 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002999}
3000
solenberg1ac56142015-10-13 03:58:19 -07003001TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003002 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003004 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3005 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3006 EXPECT_TRUE(channel_->AddSendStream(
3007 cricket::StreamParams::CreateLegacy(kSsrc1)));
3008 int channel_id = voe_.GetLastChannel();
3009 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3010 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3011 EXPECT_TRUE(channel_->AddSendStream(
3012 cricket::StreamParams::CreateLegacy(kSsrc2)));
3013 int channel_id2 = voe_.GetLastChannel();
3014 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003015}
3016
solenberg4bac9c52015-10-09 02:32:53 -07003017TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003018 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003019 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003020 cricket::StreamParams stream;
3021 stream.ssrcs.push_back(kSsrc2);
3022 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003023 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003024 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003025 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003026}
3027
3028TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003029 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003030 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3031 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003032 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003033 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003034 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3035 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3036 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003037}
3038
pbos8fc7fa72015-07-15 08:02:58 -07003039TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003040 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003041 const std::string kSyncLabel = "AvSyncLabel";
3042
solenbergff976312016-03-30 23:28:51 -07003043 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003044 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3045 sp.sync_label = kSyncLabel;
3046 // Creating two channels to make sure that sync label is set properly for both
3047 // the default voice channel and following ones.
3048 EXPECT_TRUE(channel_->AddRecvStream(sp));
3049 sp.ssrcs[0] += 1;
3050 EXPECT_TRUE(channel_->AddRecvStream(sp));
3051
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003052 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003053 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003054 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003055 << "SyncGroup should be set based on sync_label";
3056 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003057 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003058 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003059}
3060
solenberg3a941542015-11-16 07:34:50 -08003061// TODO(solenberg): Remove, once recv streams are configured through Call.
3062// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003063TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064 // Test that setting the header extensions results in the expected state
3065 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003066 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067 ssrcs.push_back(223);
3068 ssrcs.push_back(224);
3069
solenbergff976312016-03-30 23:28:51 -07003070 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003071 cricket::WebRtcVoiceMediaChannel* media_channel =
3072 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003073 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003074 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003075 EXPECT_TRUE(media_channel->AddRecvStream(
3076 cricket::StreamParams::CreateLegacy(ssrc)));
3077 }
3078
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003079 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003080 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003081 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003082 EXPECT_NE(nullptr, s);
3083 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3084 }
3085
3086 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003087 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003088 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003089 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003090 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003091 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003092 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003093 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003094 EXPECT_NE(nullptr, s);
3095 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003096 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3097 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003098 for (const auto& s_ext : s_exts) {
3099 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003100 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003101 }
3102 }
3103 }
3104 }
3105
3106 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003107 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003108 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003109 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003110 EXPECT_NE(nullptr, s);
3111 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3112 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003113}
3114
3115TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3116 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003117 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003118 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003119 static const unsigned char kRtcp[] = {
3120 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3121 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3124 };
jbaucheec21bd2016-03-20 06:15:43 -07003125 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003126
solenbergff976312016-03-30 23:28:51 -07003127 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003128 cricket::WebRtcVoiceMediaChannel* media_channel =
3129 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003130 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003131 EXPECT_TRUE(media_channel->AddRecvStream(
3132 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3133
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003134 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003135 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003136 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003137 EXPECT_EQ(0, s->received_packets());
3138 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3139 EXPECT_EQ(1, s->received_packets());
3140 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3141 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003142}
Minyue2013aec2015-05-13 14:14:42 +02003143
solenberg0a617e22015-10-20 15:49:38 -07003144// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003145// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003146TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003147 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003148 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003149 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003150 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003151 int recv_ch = voe_.GetLastChannel();
3152 EXPECT_NE(recv_ch, default_channel);
3153 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3154 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3155 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003156 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003157 recv_ch = voe_.GetLastChannel();
3158 EXPECT_NE(recv_ch, default_channel);
3159 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003160}
3161
3162TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003163 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003164 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003165
solenberg8189b022016-06-14 12:13:00 -07003166 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003167 int recv_ch = voe_.GetLastChannel();
3168
3169 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3170 int send_ch = voe_.GetLastChannel();
3171
3172 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3173 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3174 // channel of |recv_ch|.This is not a common case, since, normally, only the
3175 // default channel can be associated. However, the default is not deletable.
3176 // So we force the |recv_ch| to associate with a non-default channel.
3177 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3178 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3179
3180 EXPECT_TRUE(channel_->RemoveSendStream(2));
3181 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3182}
stefan658910c2015-09-03 05:48:32 -07003183
deadbeef884f5852016-01-15 09:20:04 -08003184TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003185 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003186 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3187 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003188
3189 // Setting the sink before a recv stream exists should do nothing.
3190 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003191 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003192 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3193
3194 // Now try actually setting the sink.
3195 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3196 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3197
3198 // Now try resetting it.
3199 channel_->SetRawAudioSink(kSsrc1, nullptr);
3200 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3201}
3202
3203TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003204 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003205 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3206 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003207
3208 // Should be able to set a default sink even when no stream exists.
3209 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3210
3211 // Create default channel and ensure it's assigned the default sink.
3212 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3213 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3214
3215 // Try resetting the default sink.
3216 channel_->SetRawAudioSink(0, nullptr);
3217 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3218
3219 // Try setting the default sink while the default stream exists.
3220 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3221 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3222
3223 // If we remove and add a default stream, it should get the same sink.
3224 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3225 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3226 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3227}
3228
skvlad7a43d252016-03-22 15:32:27 -07003229// Test that, just like the video channel, the voice channel communicates the
3230// network state to the call.
3231TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003232 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003233
3234 EXPECT_EQ(webrtc::kNetworkUp,
3235 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3236 EXPECT_EQ(webrtc::kNetworkUp,
3237 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3238
3239 channel_->OnReadyToSend(false);
3240 EXPECT_EQ(webrtc::kNetworkDown,
3241 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3242 EXPECT_EQ(webrtc::kNetworkUp,
3243 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3244
3245 channel_->OnReadyToSend(true);
3246 EXPECT_EQ(webrtc::kNetworkUp,
3247 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3248 EXPECT_EQ(webrtc::kNetworkUp,
3249 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3250}
3251
aleloi18e0b672016-10-04 02:45:47 -07003252// Test that playout is still started after changing parameters
3253TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3254 SetupRecvStream();
3255 channel_->SetPlayout(true);
3256 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3257
3258 // Changing RTP header extensions will recreate the AudioReceiveStream.
3259 cricket::AudioRecvParameters parameters;
3260 parameters.extensions.push_back(
3261 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3262 channel_->SetRecvParameters(parameters);
3263
3264 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3265}
3266
stefan658910c2015-09-03 05:48:32 -07003267// Tests that the library initializes and shuts down properly.
3268TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003269 // If the VoiceEngine wants to gather available codecs early, that's fine but
3270 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003271 cricket::WebRtcVoiceEngine engine(
3272 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003273 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003274 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003275 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003276 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3277 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003278 EXPECT_TRUE(channel != nullptr);
3279 delete channel;
solenbergff976312016-03-30 23:28:51 -07003280}
stefan658910c2015-09-03 05:48:32 -07003281
solenbergff976312016-03-30 23:28:51 -07003282// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003283TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3284 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3285 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3286 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003287 {
ossuc54071d2016-08-17 02:45:41 -07003288 cricket::WebRtcVoiceEngine engine(
3289 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003290 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003291 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003292 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003293 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3294 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3295 EXPECT_TRUE(channel != nullptr);
3296 delete channel;
3297 }
stefan658910c2015-09-03 05:48:32 -07003298}
3299
3300// Tests that the library is configured with the codecs we want.
3301TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003302 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3303 // module.
3304
stefan658910c2015-09-03 05:48:32 -07003305 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003306 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003307 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003308 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003309 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003310 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003311 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003312 // Check that name matching is case-insensitive.
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, "iLBC", 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, "PCMU", 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, "PCMA", 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, "G722", 8000, 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", 32000, 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", 16000, 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, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003329 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003330 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003331 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003332 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003333 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003334 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003335 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003336 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003337 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003338 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003339 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003340 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003341 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003342 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003343 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003344 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003345 cricket::AudioCodec(99, "ABCD", 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(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003348 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003349 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003350 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003351 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003352 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003353 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003354
stefan658910c2015-09-03 05:48:32 -07003355 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003356 // TODO(ossu): Why are the payload types of codecs with non-static payload
3357 // type assignments checked here? It shouldn't really matter.
3358 cricket::WebRtcVoiceEngine engine(
3359 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
stefan658910c2015-09-03 05:48:32 -07003360 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossuc54071d2016-08-17 02:45:41 -07003361 engine.send_codecs().begin();
3362 it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003363 if (it->name == "CN" && it->clockrate == 16000) {
3364 EXPECT_EQ(105, it->id);
3365 } else if (it->name == "CN" && it->clockrate == 32000) {
3366 EXPECT_EQ(106, it->id);
3367 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3368 EXPECT_EQ(103, it->id);
3369 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3370 EXPECT_EQ(104, it->id);
3371 } else if (it->name == "G722" && it->clockrate == 8000) {
3372 EXPECT_EQ(9, it->id);
3373 } else if (it->name == "telephone-event") {
3374 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003375 } else if (it->name == "opus") {
3376 EXPECT_EQ(111, it->id);
3377 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3378 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003379 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3380 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3381 }
3382 }
stefan658910c2015-09-03 05:48:32 -07003383}
3384
3385// Tests that VoE supports at least 32 channels
3386TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003387 cricket::WebRtcVoiceEngine engine(
3388 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003389 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003390 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003391 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003392
3393 cricket::VoiceMediaChannel* channels[32];
3394 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003395 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003396 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3397 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003398 if (!channel)
3399 break;
stefan658910c2015-09-03 05:48:32 -07003400 channels[num_channels++] = channel;
3401 }
3402
tfarina5237aaf2015-11-10 23:44:30 -08003403 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003404 EXPECT_EQ(expected, num_channels);
3405
3406 while (num_channels > 0) {
3407 delete channels[--num_channels];
3408 }
stefan658910c2015-09-03 05:48:32 -07003409}
3410
3411// Test that we set our preferred codecs properly.
3412TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003413 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3414 // - Check that our builtin codecs are usable by Channel.
3415 // - The codecs provided by the engine is usable by Channel.
3416 // It does not check that the codecs in the RecvParameters are actually
3417 // what we sent in - though it's probably reasonable to expect so, if
3418 // SetRecvParameters returns true.
3419 // I think it will become clear once audio decoder injection is completed.
3420 cricket::WebRtcVoiceEngine engine(
3421 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003422 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003423 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003424 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003425 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3426 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003427 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003428 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003429 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003430}