blob: aa041dda3785cf43eaedbd86a40dd22a58894132 [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"
solenberg059fb442016-10-26 05:12:24 -070031#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032
solenbergbc37fc82016-04-04 09:54:44 -070033using testing::Return;
34using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000035
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020036namespace {
37
deadbeef67cf2c12016-04-13 10:07:16 -070038const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
40const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
41const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
42const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
deadbeef67cf2c12016-04-13 10:07:16 -070043const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
44const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
45const cricket::AudioCodec kTelephoneEventCodec(106,
46 "telephone-event",
47 8000,
48 0,
49 1);
solenberg85a04962015-10-27 03:35:21 -070050const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080051const uint32_t kSsrc2 = 2;
52const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070053const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054
solenberg971cab02016-06-14 10:02:41 -070055constexpr int kRtpHistoryMs = 5000;
56
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057class FakeVoEWrapper : public cricket::VoEWrapper {
58 public:
59 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
60 : cricket::VoEWrapper(engine, // processing
61 engine, // base
62 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 engine) { // volume
65 }
66};
skvlad11a9cbf2016-10-07 11:53:05 -070067
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020068} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069
solenbergff976312016-03-30 23:28:51 -070070// Tests that our stub library "works".
71TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070072 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
73 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
74 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070075 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
76 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
77 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -070078 StrictMock<webrtc::test::MockAudioProcessing> apm;
79 EXPECT_CALL(apm, ApplyConfig(testing::_));
80 EXPECT_CALL(apm, SetExtraOptions(testing::_));
81 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0));
82 cricket::FakeWebRtcVoiceEngine voe(&apm);
solenbergff976312016-03-30 23:28:51 -070083 EXPECT_FALSE(voe.IsInited());
84 {
ossuc54071d2016-08-17 02:45:41 -070085 cricket::WebRtcVoiceEngine engine(
86 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(),
87 new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070088 EXPECT_TRUE(voe.IsInited());
89 }
90 EXPECT_FALSE(voe.IsInited());
91}
92
deadbeef884f5852016-01-15 09:20:04 -080093class FakeAudioSink : public webrtc::AudioSinkInterface {
94 public:
95 void OnData(const Data& audio) override {}
96};
97
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080098class FakeAudioSource : public cricket::AudioSource {
99 void SetSink(Sink* sink) override {}
100};
101
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102class WebRtcVoiceEngineTestFake : public testing::Test {
103 public:
stefanba4c0e42016-02-04 04:12:24 -0800104 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
105
106 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenberg059fb442016-10-26 05:12:24 -0700107 : call_(webrtc::Call::Config(&event_log_)), voe_(&apm_),
skvlad11a9cbf2016-10-07 11:53:05 -0700108 override_field_trials_(field_trials) {
ossuc54071d2016-08-17 02:45:41 -0700109 auto factory = webrtc::MockAudioDecoderFactory::CreateUnusedFactory();
solenbergbc37fc82016-04-04 09:54:44 -0700110 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
111 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700112 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
113 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
114 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -0700115 EXPECT_CALL(apm_, ApplyConfig(testing::_));
116 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
117 EXPECT_CALL(apm_, Initialize()).WillOnce(Return(0));
ossuc54071d2016-08-17 02:45:41 -0700118 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory,
solenbergbc37fc82016-04-04 09:54:44 -0700119 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200120 send_parameters_.codecs.push_back(kPcmuCodec);
121 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
solenberg8189b022016-06-14 12:13:00 -0700123
solenbergff976312016-03-30 23:28:51 -0700124 bool SetupChannel() {
solenberg059fb442016-10-26 05:12:24 -0700125 EXPECT_CALL(apm_, ApplyConfig(testing::_));
126 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergbc37fc82016-04-04 09:54:44 -0700127 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
128 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200129 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000130 }
solenberg8189b022016-06-14 12:13:00 -0700131
solenbergff976312016-03-30 23:28:51 -0700132 bool SetupRecvStream() {
133 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700134 return false;
135 }
solenberg8189b022016-06-14 12:13:00 -0700136 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700137 }
solenberg8189b022016-06-14 12:13:00 -0700138
solenbergff976312016-03-30 23:28:51 -0700139 bool SetupSendStream() {
140 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000141 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800143 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
144 return false;
145 }
solenberg059fb442016-10-26 05:12:24 -0700146 EXPECT_CALL(apm_, set_output_will_be_muted(false));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800147 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000148 }
solenberg8189b022016-06-14 12:13:00 -0700149
150 bool AddRecvStream(uint32_t ssrc) {
151 EXPECT_TRUE(channel_);
152 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
153 }
154
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000155 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700156 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700157 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800158 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700159 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700160 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800161 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000162 }
solenberg8189b022016-06-14 12:13:00 -0700163
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000164 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700165 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000166 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 }
solenberg8189b022016-06-14 12:13:00 -0700168
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200169 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000170 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 }
172
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100173 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
174 const auto* send_stream = call_.GetAudioSendStream(ssrc);
175 EXPECT_TRUE(send_stream);
176 return *send_stream;
177 }
178
deadbeef884f5852016-01-15 09:20:04 -0800179 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
180 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
181 EXPECT_TRUE(recv_stream);
182 return *recv_stream;
183 }
184
solenberg3a941542015-11-16 07:34:50 -0800185 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800186 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800187 }
188
solenberg7add0582015-11-20 09:59:34 -0800189 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800190 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800191 }
192
solenberg059fb442016-10-26 05:12:24 -0700193 void SetSend(bool enable) {
194 ASSERT_TRUE(channel_);
solenbergd53a3f92016-04-14 13:56:37 -0700195 if (enable) {
196 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
197 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
198 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
solenberg059fb442016-10-26 05:12:24 -0700199 EXPECT_CALL(apm_, ApplyConfig(testing::_));
200 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergd53a3f92016-04-14 13:56:37 -0700201 }
solenberg059fb442016-10-26 05:12:24 -0700202 channel_->SetSend(enable);
203 }
204
205 void SetSendParameters(const cricket::AudioSendParameters& params) {
206 EXPECT_CALL(apm_, ApplyConfig(testing::_));
207 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
208 ASSERT_TRUE(channel_);
209 EXPECT_TRUE(channel_->SetSendParameters(params));
210 }
211
212 void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source) {
213 EXPECT_CALL(apm_, set_output_will_be_muted(!enable));
214 ASSERT_TRUE(channel_);
215 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, nullptr, source));
solenbergd53a3f92016-04-14 13:56:37 -0700216 }
217
Peter Boström0c4e06b2015-10-07 12:23:21 +0200218 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700219 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000220 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700221 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000222 // send stream.
223 EXPECT_TRUE(channel_->AddSendStream(
224 cricket::StreamParams::CreateLegacy(kSsrc1)));
225 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000226
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000227 // Test we can only InsertDtmf when the other side supports telephone-event.
solenberg059fb442016-10-26 05:12:24 -0700228 SetSendParameters(send_parameters_);
229 SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000230 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800231 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200232 send_parameters_.codecs.push_back(kTelephoneEventCodec);
solenberg059fb442016-10-26 05:12:24 -0700233 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000235
236 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700237 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800238 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000239 EXPECT_TRUE(channel_->AddSendStream(
240 cricket::StreamParams::CreateLegacy(kSsrc1)));
241 }
242
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000243 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800244 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000245
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100246 // Test send.
247 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
248 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
249 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800250 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100251 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
252 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
253 EXPECT_EQ(2, telephone_event.event_code);
254 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000255 }
256
257 // Test that send bandwidth is set correctly.
258 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000259 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
260 // |expected_result| is the expected result from SetMaxSendBandwidth().
261 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700262 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
263 int max_bitrate,
264 bool expected_result,
265 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200266 cricket::AudioSendParameters parameters;
267 parameters.codecs.push_back(codec);
268 parameters.max_bandwidth_bps = max_bitrate;
solenberg059fb442016-10-26 05:12:24 -0700269 if (expected_result) {
270 SetSendParameters(parameters);
271 } else {
272 EXPECT_FALSE(channel_->SetSendParameters(parameters));
273 }
minyue7a973442016-10-20 03:27:12 -0700274 EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000275 }
276
skvlade0d46372016-04-07 22:59:22 -0700277 // Sets the per-stream maximum bitrate limit for the specified SSRC.
278 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700279 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700280 EXPECT_EQ(1UL, parameters.encodings.size());
281
282 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700283 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700284 }
285
solenberg059fb442016-10-26 05:12:24 -0700286 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
skvlade0d46372016-04-07 22:59:22 -0700287 cricket::AudioSendParameters send_parameters;
288 send_parameters.codecs.push_back(codec);
289 send_parameters.max_bandwidth_bps = bitrate;
solenberg059fb442016-10-26 05:12:24 -0700290 SetSendParameters(send_parameters);
skvlade0d46372016-04-07 22:59:22 -0700291 }
292
minyue7a973442016-10-20 03:27:12 -0700293 void CheckSendCodec(int32_t ssrc,
294 const char expected_name[],
295 int expected_channels,
296 int expected_bitrate) {
297 const auto& codec = GetSendStreamConfig(ssrc).send_codec_spec.codec_inst;
298 EXPECT_STREQ(expected_name, codec.plname);
299 EXPECT_EQ(expected_channels, codec.channels);
300 EXPECT_EQ(expected_bitrate, codec.rate);
301 }
302
303 int GetOpusMaxPlaybackRate(int32_t ssrc) {
304 return GetSendStreamConfig(ssrc).send_codec_spec.opus_max_playback_rate;
305 }
306
307 bool GetOpusDtx(int32_t ssrc) {
308 return GetSendStreamConfig(ssrc).send_codec_spec.enable_opus_dtx;
309 }
310
311 bool GetCodecFec(int32_t ssrc) {
312 return GetSendStreamConfig(ssrc).send_codec_spec.enable_codec_fec;
313 }
314
skvlade0d46372016-04-07 22:59:22 -0700315 int GetCodecBitrate(int32_t ssrc) {
minyue7a973442016-10-20 03:27:12 -0700316 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.rate;
317 }
318
319 int GetCodecPacSize(int32_t ssrc) {
320 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.pacsize;
skvlade0d46372016-04-07 22:59:22 -0700321 }
322
323 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
324 int global_max,
325 int stream_max,
326 bool expected_result,
327 int expected_codec_bitrate) {
328 // Clear the bitrate limit from the previous test case.
329 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
330
331 // Attempt to set the requested bitrate limits.
solenberg059fb442016-10-26 05:12:24 -0700332 SetGlobalMaxBitrate(codec, global_max);
skvlade0d46372016-04-07 22:59:22 -0700333 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
334
335 // Verify that reading back the parameters gives results
336 // consistent with the Set() result.
337 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700338 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700339 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
340 EXPECT_EQ(expected_result ? stream_max : -1,
341 resulting_parameters.encodings[0].max_bitrate_bps);
342
343 // Verify that the codec settings have the expected bitrate.
344 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
345 }
346
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000347 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700348 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000349
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000350 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800351 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000352
353 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700354 send_parameters_.extensions.push_back(
355 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg059fb442016-10-26 05:12:24 -0700356 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800357 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000358
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000359 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200360 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700361 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800362 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000363
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000364 // Ensure extension is set properly.
365 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700366 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg059fb442016-10-26 05:12:24 -0700367 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800368 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700369 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800370 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000371
solenberg7add0582015-11-20 09:59:34 -0800372 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000373 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700374 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800375 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
376 call_.GetAudioSendStream(kSsrc2));
377 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700378 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800379 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000380
381 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200382 send_parameters_.codecs.push_back(kPcmuCodec);
383 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700384 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800385 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
386 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000387 }
388
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000389 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700390 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000391
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000392 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800393 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000394
395 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700396 recv_parameters_.extensions.push_back(
397 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800398 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
399 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000400
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000401 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800402 recv_parameters_.extensions.clear();
403 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
404 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000405
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000406 // Ensure extension is set properly.
407 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700408 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800409 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
410 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700411 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800412 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000413
solenberg7add0582015-11-20 09:59:34 -0800414 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700415 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800416 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
417 call_.GetAudioReceiveStream(kSsrc2));
418 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700419 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800420 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000421
422 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800423 recv_parameters_.extensions.clear();
424 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
425 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
426 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000427 }
428
solenberg85a04962015-10-27 03:35:21 -0700429 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
430 webrtc::AudioSendStream::Stats stats;
431 stats.local_ssrc = 12;
432 stats.bytes_sent = 345;
433 stats.packets_sent = 678;
434 stats.packets_lost = 9012;
435 stats.fraction_lost = 34.56f;
436 stats.codec_name = "codec_name_send";
437 stats.ext_seqnum = 789;
438 stats.jitter_ms = 12;
439 stats.rtt_ms = 345;
440 stats.audio_level = 678;
441 stats.aec_quality_min = 9.01f;
442 stats.echo_delay_median_ms = 234;
443 stats.echo_delay_std_ms = 567;
444 stats.echo_return_loss = 890;
445 stats.echo_return_loss_enhancement = 1234;
ivoc8c63a822016-10-21 04:10:03 -0700446 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700447 stats.typing_noise_detected = true;
448 return stats;
449 }
450 void SetAudioSendStreamStats() {
451 for (auto* s : call_.GetAudioSendStreams()) {
452 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200453 }
solenberg85a04962015-10-27 03:35:21 -0700454 }
solenberg566ef242015-11-06 15:34:49 -0800455 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
456 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700457 const auto stats = GetAudioSendStreamStats();
458 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
459 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
460 EXPECT_EQ(info.packets_sent, stats.packets_sent);
461 EXPECT_EQ(info.packets_lost, stats.packets_lost);
462 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
463 EXPECT_EQ(info.codec_name, stats.codec_name);
464 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
465 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
466 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
467 EXPECT_EQ(info.audio_level, stats.audio_level);
468 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
469 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
470 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
471 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
472 EXPECT_EQ(info.echo_return_loss_enhancement,
473 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700474 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800475 EXPECT_EQ(info.typing_noise_detected,
476 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700477 }
478
479 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
480 webrtc::AudioReceiveStream::Stats stats;
481 stats.remote_ssrc = 123;
482 stats.bytes_rcvd = 456;
483 stats.packets_rcvd = 768;
484 stats.packets_lost = 101;
485 stats.fraction_lost = 23.45f;
486 stats.codec_name = "codec_name_recv";
487 stats.ext_seqnum = 678;
488 stats.jitter_ms = 901;
489 stats.jitter_buffer_ms = 234;
490 stats.jitter_buffer_preferred_ms = 567;
491 stats.delay_estimate_ms = 890;
492 stats.audio_level = 1234;
493 stats.expand_rate = 5.67f;
494 stats.speech_expand_rate = 8.90f;
495 stats.secondary_decoded_rate = 1.23f;
496 stats.accelerate_rate = 4.56f;
497 stats.preemptive_expand_rate = 7.89f;
498 stats.decoding_calls_to_silence_generator = 12;
499 stats.decoding_calls_to_neteq = 345;
500 stats.decoding_normal = 67890;
501 stats.decoding_plc = 1234;
502 stats.decoding_cng = 5678;
503 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700504 stats.decoding_muted_output = 3456;
505 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200506 return stats;
507 }
508 void SetAudioReceiveStreamStats() {
509 for (auto* s : call_.GetAudioReceiveStreams()) {
510 s->SetStats(GetAudioReceiveStreamStats());
511 }
512 }
513 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700514 const auto stats = GetAudioReceiveStreamStats();
515 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
516 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
517 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
518 EXPECT_EQ(info.packets_lost, stats.packets_lost);
519 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
520 EXPECT_EQ(info.codec_name, stats.codec_name);
521 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
522 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
523 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200524 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700525 stats.jitter_buffer_preferred_ms);
526 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
527 EXPECT_EQ(info.audio_level, stats.audio_level);
528 EXPECT_EQ(info.expand_rate, stats.expand_rate);
529 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
530 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
531 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
532 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200533 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700534 stats.decoding_calls_to_silence_generator);
535 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
536 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
537 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
538 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
539 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700540 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700541 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200542 }
543
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000544 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700545 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700546 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700547 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200548 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700550 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700551 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200552 cricket::AudioSendParameters send_parameters_;
553 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800554 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800555 private:
556 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557};
558
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559// Tests that we can create and destroy a channel.
560TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700561 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562}
563
solenberg31fec402016-05-06 02:13:12 -0700564// Test that we can add a send stream and that it has the correct defaults.
565TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
566 EXPECT_TRUE(SetupChannel());
567 EXPECT_TRUE(
568 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
569 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
570 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
571 EXPECT_EQ("", config.rtp.c_name);
572 EXPECT_EQ(0u, config.rtp.extensions.size());
573 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
574 config.send_transport);
575}
576
577// Test that we can add a receive stream and that it has the correct defaults.
578TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
579 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700580 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700581 const webrtc::AudioReceiveStream::Config& config =
582 GetRecvStreamConfig(kSsrc1);
583 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
584 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
585 EXPECT_FALSE(config.rtp.transport_cc);
586 EXPECT_EQ(0u, config.rtp.extensions.size());
587 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
588 config.rtcp_send_transport);
589 EXPECT_EQ("", config.sync_group);
590}
591
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700593// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700594// TODO(ossu): This test should move into a separate builtin audio codecs
595// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700596TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700597 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 ASSERT_FALSE(codecs.empty());
599 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
600 EXPECT_EQ(48000, codecs[0].clockrate);
601 EXPECT_EQ(2, codecs[0].channels);
602 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603}
604
stefanba4c0e42016-02-04 04:12:24 -0800605TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700606 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800607 bool opus_found = false;
608 for (cricket::AudioCodec codec : codecs) {
609 if (codec.name == "opus") {
610 EXPECT_TRUE(HasTransportCc(codec));
611 opus_found = true;
612 }
613 }
614 EXPECT_TRUE(opus_found);
615}
616
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617// Tests that we can find codecs by name or id, and that we interpret the
618// clockrate and bitrate fields properly.
619TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
620 cricket::AudioCodec codec;
621 webrtc::CodecInst codec_inst;
622 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800623 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800625 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800627 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
628 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 // Find ISAC with a different payload id.
630 codec = kIsacCodec;
631 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800632 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 EXPECT_EQ(codec.id, codec_inst.pltype);
634 // Find PCMU with a 0 clockrate.
635 codec = kPcmuCodec;
636 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800637 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 EXPECT_EQ(codec.id, codec_inst.pltype);
639 EXPECT_EQ(8000, codec_inst.plfreq);
640 // Find PCMU with a 0 bitrate.
641 codec = kPcmuCodec;
642 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800643 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 EXPECT_EQ(codec.id, codec_inst.pltype);
645 EXPECT_EQ(64000, codec_inst.rate);
646 // Find ISAC with an explicit bitrate.
647 codec = kIsacCodec;
648 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800649 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 EXPECT_EQ(codec.id, codec_inst.pltype);
651 EXPECT_EQ(32000, codec_inst.rate);
652}
653
654// Test that we set our inbound codecs properly, including changing PT.
655TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700656 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200657 cricket::AudioRecvParameters parameters;
658 parameters.codecs.push_back(kIsacCodec);
659 parameters.codecs.push_back(kPcmuCodec);
660 parameters.codecs.push_back(kTelephoneEventCodec);
661 parameters.codecs[0].id = 106; // collide with existing telephone-event
662 parameters.codecs[2].id = 126;
663 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700664 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700665 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800667 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 gcodec.plfreq = 16000;
669 gcodec.channels = 1;
670 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
671 EXPECT_EQ(106, gcodec.pltype);
672 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800673 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674 gcodec.plfreq = 8000;
675 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
676 EXPECT_EQ(126, gcodec.pltype);
677 EXPECT_STREQ("telephone-event", gcodec.plname);
678}
679
680// Test that we fail to set an unknown inbound codec.
681TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700682 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200683 cricket::AudioRecvParameters parameters;
684 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700685 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200686 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687}
688
689// Test that we fail if we have duplicate types in the inbound list.
690TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
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(kCn16000Codec);
695 parameters.codecs[1].id = kIsacCodec.id;
696 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697}
698
699// Test that we can decode OPUS without stereo parameters.
700TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700701 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200702 cricket::AudioRecvParameters parameters;
703 parameters.codecs.push_back(kIsacCodec);
704 parameters.codecs.push_back(kPcmuCodec);
705 parameters.codecs.push_back(kOpusCodec);
706 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700707 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700708 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800710 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711 // Even without stereo parameters, recv codecs still specify channels = 2.
712 EXPECT_EQ(2, opus.channels);
713 EXPECT_EQ(111, opus.pltype);
714 EXPECT_STREQ("opus", opus.plname);
715 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700716 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 EXPECT_EQ(111, opus.pltype);
718}
719
720// Test that we can decode OPUS with stereo = 0.
721TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700722 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200723 cricket::AudioRecvParameters parameters;
724 parameters.codecs.push_back(kIsacCodec);
725 parameters.codecs.push_back(kPcmuCodec);
726 parameters.codecs.push_back(kOpusCodec);
727 parameters.codecs[2].params["stereo"] = "0";
728 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700729 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 int channel_num2 = voe_.GetLastChannel();
731 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800732 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 // Even when stereo is off, recv codecs still specify channels = 2.
734 EXPECT_EQ(2, opus.channels);
735 EXPECT_EQ(111, opus.pltype);
736 EXPECT_STREQ("opus", opus.plname);
737 opus.pltype = 0;
738 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
739 EXPECT_EQ(111, opus.pltype);
740}
741
742// Test that we can decode OPUS with stereo = 1.
743TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700744 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200745 cricket::AudioRecvParameters parameters;
746 parameters.codecs.push_back(kIsacCodec);
747 parameters.codecs.push_back(kPcmuCodec);
748 parameters.codecs.push_back(kOpusCodec);
749 parameters.codecs[2].params["stereo"] = "1";
750 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700751 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 int channel_num2 = voe_.GetLastChannel();
753 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800754 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 EXPECT_EQ(2, opus.channels);
756 EXPECT_EQ(111, opus.pltype);
757 EXPECT_STREQ("opus", opus.plname);
758 opus.pltype = 0;
759 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
760 EXPECT_EQ(111, opus.pltype);
761}
762
763// Test that changes to recv codecs are applied to all streams.
764TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700765 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200766 cricket::AudioRecvParameters parameters;
767 parameters.codecs.push_back(kIsacCodec);
768 parameters.codecs.push_back(kPcmuCodec);
769 parameters.codecs.push_back(kTelephoneEventCodec);
770 parameters.codecs[0].id = 106; // collide with existing telephone-event
771 parameters.codecs[2].id = 126;
772 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700773 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000774 int channel_num2 = voe_.GetLastChannel();
775 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800776 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 gcodec.plfreq = 16000;
778 gcodec.channels = 1;
779 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
780 EXPECT_EQ(106, gcodec.pltype);
781 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800782 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783 gcodec.plfreq = 8000;
784 gcodec.channels = 1;
785 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
786 EXPECT_EQ(126, gcodec.pltype);
787 EXPECT_STREQ("telephone-event", gcodec.plname);
788}
789
790TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700791 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200792 cricket::AudioRecvParameters parameters;
793 parameters.codecs.push_back(kIsacCodec);
794 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200795 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796
797 int channel_num2 = voe_.GetLastChannel();
798 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800799 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800 gcodec.plfreq = 16000;
801 gcodec.channels = 1;
802 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
803 EXPECT_EQ(106, gcodec.pltype);
804 EXPECT_STREQ("ISAC", gcodec.plname);
805}
806
807// Test that we can apply the same set of codecs again while playing.
808TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700809 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200810 cricket::AudioRecvParameters parameters;
811 parameters.codecs.push_back(kIsacCodec);
812 parameters.codecs.push_back(kCn16000Codec);
813 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700814 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200815 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000816
817 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200818 parameters.codecs[0].id = 127;
819 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700820 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821}
822
823// Test that we can add a codec while playing.
824TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700825 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200826 cricket::AudioRecvParameters parameters;
827 parameters.codecs.push_back(kIsacCodec);
828 parameters.codecs.push_back(kCn16000Codec);
829 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700830 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200832 parameters.codecs.push_back(kOpusCodec);
833 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700834 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800836 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000837 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
838}
839
840TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700841 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000843 // Test that when autobw is enabled, bitrate is kept as the default
844 // value. autobw is enabled for the following tests because the target
845 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000846
847 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700848 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849
850 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700851 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000853 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700854 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855}
856
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000857TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700858 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000860 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000861
862 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700863 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
864 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
865 // Rates above the max (56000) should be capped.
866 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000868 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700869 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
870 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
871 // Rates above the max (510000) should be capped.
872 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000873}
874
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000875TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700876 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000877
878 // Test that we can only set a maximum bitrate for a fixed-rate codec
879 // if it's bigger than the fixed rate.
880
881 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700882 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
883 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
884 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
885 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
886 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
887 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
888 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000889}
890
891TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700892 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200893 const int kDesiredBitrate = 128000;
894 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700895 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200896 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700897 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000898
899 EXPECT_TRUE(channel_->AddSendStream(
900 cricket::StreamParams::CreateLegacy(kSsrc1)));
901
minyue7a973442016-10-20 03:27:12 -0700902 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000903}
904
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905// Test that bitrate cannot be set for CBR codecs.
906// Bitrate is ignored if it is higher than the fixed bitrate.
907// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000908TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700909 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910
911 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700912 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700913 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200914
915 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700916 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700917 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200918
919 send_parameters_.max_bandwidth_bps = 128;
920 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700921 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922}
923
skvlade0d46372016-04-07 22:59:22 -0700924// Test that the per-stream bitrate limit and the global
925// bitrate limit both apply.
926TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
927 EXPECT_TRUE(SetupSendStream());
928
929 // opus, default bitrate == 64000.
930 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
931 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
932 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
933 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
934
935 // CBR codecs allow both maximums to exceed the bitrate.
936 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
937 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
938 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
939 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
940
941 // CBR codecs don't allow per stream maximums to be too low.
942 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
943 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
944}
945
946// Test that an attempt to set RtpParameters for a stream that does not exist
947// fails.
948TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
949 EXPECT_TRUE(SetupChannel());
950 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700951 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700952 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
953
954 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700955 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700956}
957
958TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700959 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700960 // This test verifies that setting RtpParameters succeeds only if
961 // the structure contains exactly one encoding.
962 // TODO(skvlad): Update this test when we start supporting setting parameters
963 // for each encoding individually.
964
965 EXPECT_TRUE(SetupSendStream());
966 // Setting RtpParameters with no encoding is expected to fail.
967 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700968 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700969 // Setting RtpParameters with exactly one encoding should succeed.
970 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700971 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700972 // Two or more encodings should result in failure.
973 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700974 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700975}
976
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700977// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700978// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700979TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
980 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -0700981 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700982 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
983 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700984 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700985 ASSERT_EQ(1u, parameters.encodings.size());
986 ASSERT_TRUE(parameters.encodings[0].active);
987 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700988 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700989 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
990
991 // Now change it back to active and verify we resume sending.
992 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700993 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700994 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
995}
996
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700997// Test that SetRtpSendParameters configures the correct encoding channel for
998// each SSRC.
skvlade0d46372016-04-07 22:59:22 -0700999TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1000 SetupForMultiSendStream();
1001 // Create send streams.
1002 for (uint32_t ssrc : kSsrcs4) {
1003 EXPECT_TRUE(
1004 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1005 }
1006 // Configure one stream to be limited by the stream config, another to be
1007 // limited by the global max, and the third one with no per-stream limit
1008 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001009 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001010 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1011 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1012 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1013
1014 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1015 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1016 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1017
1018 // Remove the global cap; the streams should switch to their respective
1019 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001020 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001021 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1022 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1023 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1024}
1025
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001026// Test that GetRtpSendParameters returns the currently configured codecs.
1027TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001028 EXPECT_TRUE(SetupSendStream());
1029 cricket::AudioSendParameters parameters;
1030 parameters.codecs.push_back(kIsacCodec);
1031 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001032 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001033
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001034 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001035 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001036 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1037 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001038}
1039
1040// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001041TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001042 EXPECT_TRUE(SetupSendStream());
1043 cricket::AudioSendParameters parameters;
1044 parameters.codecs.push_back(kIsacCodec);
1045 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001046 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001047
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001048 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001049
1050 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001051 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001052
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001053 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1054 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1055 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1056}
1057
1058// Test that GetRtpReceiveParameters returns the currently configured codecs.
1059TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1060 EXPECT_TRUE(SetupRecvStream());
1061 cricket::AudioRecvParameters parameters;
1062 parameters.codecs.push_back(kIsacCodec);
1063 parameters.codecs.push_back(kPcmuCodec);
1064 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1065
1066 webrtc::RtpParameters rtp_parameters =
1067 channel_->GetRtpReceiveParameters(kSsrc1);
1068 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1069 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1070 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1071}
1072
1073// Test that if we set/get parameters multiple times, we get the same results.
1074TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1075 EXPECT_TRUE(SetupRecvStream());
1076 cricket::AudioRecvParameters parameters;
1077 parameters.codecs.push_back(kIsacCodec);
1078 parameters.codecs.push_back(kPcmuCodec);
1079 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1080
1081 webrtc::RtpParameters initial_params =
1082 channel_->GetRtpReceiveParameters(kSsrc1);
1083
1084 // We should be able to set the params we just got.
1085 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1086
1087 // ... And this shouldn't change the params returned by
1088 // GetRtpReceiveParameters.
1089 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1090 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001091}
1092
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093// Test that we apply codecs properly.
1094TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001095 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001096 cricket::AudioSendParameters parameters;
1097 parameters.codecs.push_back(kIsacCodec);
1098 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001099 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001100 parameters.codecs[0].id = 96;
1101 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001102 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001103 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001104 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1105 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1106 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1107 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1108 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1109 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1110 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1111 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001112 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001113}
1114
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001115// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1116// to apply.
1117TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001118 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001119 cricket::AudioSendParameters parameters;
1120 parameters.codecs.push_back(kIsacCodec);
1121 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001122 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001123 parameters.codecs[0].id = 96;
1124 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001125 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001126 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001127 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001128 // Calling SetSendCodec again with same codec which is already set.
1129 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001130 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001131 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001132}
1133
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001134// Verify that G722 is set with 16000 samples per second to WebRTC.
1135TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001136 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001137 cricket::AudioSendParameters parameters;
1138 parameters.codecs.push_back(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001139 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001140 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001141 EXPECT_STREQ("G722", gcodec.plname);
1142 EXPECT_EQ(1, gcodec.channels);
1143 EXPECT_EQ(16000, gcodec.plfreq);
1144}
1145
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001146// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
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].clockrate = 50000;
1153 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154}
1155
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001156// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
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 = 0;
1163 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164}
1165
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001166// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001168 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001169 cricket::AudioSendParameters parameters;
1170 parameters.codecs.push_back(kOpusCodec);
1171 parameters.codecs[0].bitrate = 0;
1172 parameters.codecs[0].channels = 0;
1173 parameters.codecs[0].params["stereo"] = "1";
1174 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175}
1176
1177// Test that if channel is 1 for opus and there's no stereo, we fail.
1178TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001179 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001180 cricket::AudioSendParameters parameters;
1181 parameters.codecs.push_back(kOpusCodec);
1182 parameters.codecs[0].bitrate = 0;
1183 parameters.codecs[0].channels = 1;
1184 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185}
1186
1187// Test that if channel is 1 for opus and stereo=0, we fail.
1188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001189 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001190 cricket::AudioSendParameters parameters;
1191 parameters.codecs.push_back(kOpusCodec);
1192 parameters.codecs[0].bitrate = 0;
1193 parameters.codecs[0].channels = 1;
1194 parameters.codecs[0].params["stereo"] = "0";
1195 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001196}
1197
1198// Test that if channel is 1 for opus and stereo=1, we fail.
1199TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001200 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001201 cricket::AudioSendParameters parameters;
1202 parameters.codecs.push_back(kOpusCodec);
1203 parameters.codecs[0].bitrate = 0;
1204 parameters.codecs[0].channels = 1;
1205 parameters.codecs[0].params["stereo"] = "1";
1206 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001207}
1208
1209// Test that with bitrate=0 and no stereo,
1210// channels and bitrate are 1 and 32000.
1211TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001212 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001213 cricket::AudioSendParameters parameters;
1214 parameters.codecs.push_back(kOpusCodec);
1215 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001216 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001217 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001218}
1219
1220// Test that with bitrate=0 and stereo=0,
1221// channels and bitrate are 1 and 32000.
1222TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001223 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001224 cricket::AudioSendParameters parameters;
1225 parameters.codecs.push_back(kOpusCodec);
1226 parameters.codecs[0].bitrate = 0;
1227 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001228 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001229 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230}
1231
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001232// Test that with bitrate=invalid and stereo=0,
1233// channels and bitrate are 1 and 32000.
1234TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001235 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001236 cricket::AudioSendParameters parameters;
1237 parameters.codecs.push_back(kOpusCodec);
1238 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001239 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001240 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001241 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001242 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001243
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001244 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001245 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001246 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001247}
1248
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001249// Test that with bitrate=0 and stereo=1,
1250// channels and bitrate are 2 and 64000.
1251TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001252 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 cricket::AudioSendParameters parameters;
1254 parameters.codecs.push_back(kOpusCodec);
1255 parameters.codecs[0].bitrate = 0;
1256 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001257 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001258 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001259}
1260
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001261// Test that with bitrate=invalid and stereo=1,
1262// channels and bitrate are 2 and 64000.
1263TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001264 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001265 cricket::AudioSendParameters parameters;
1266 parameters.codecs.push_back(kOpusCodec);
1267 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001268 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001269 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001270 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001271 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001272
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001273 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001274 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001275 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001276}
1277
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001278// Test that with bitrate=N and stereo unset,
1279// channels and bitrate are 1 and N.
1280TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001281 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001282 cricket::AudioSendParameters parameters;
1283 parameters.codecs.push_back(kOpusCodec);
1284 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001285 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001286 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001287 EXPECT_EQ(111, gcodec.pltype);
1288 EXPECT_EQ(96000, gcodec.rate);
1289 EXPECT_STREQ("opus", gcodec.plname);
1290 EXPECT_EQ(1, gcodec.channels);
1291 EXPECT_EQ(48000, gcodec.plfreq);
1292}
1293
1294// Test that with bitrate=N and stereo=0,
1295// channels and bitrate are 1 and N.
1296TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001297 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001298 cricket::AudioSendParameters parameters;
1299 parameters.codecs.push_back(kOpusCodec);
1300 parameters.codecs[0].bitrate = 30000;
1301 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001302 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001303 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001304}
1305
1306// Test that with bitrate=N and without any parameters,
1307// channels and bitrate are 1 and N.
1308TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001309 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001310 cricket::AudioSendParameters parameters;
1311 parameters.codecs.push_back(kOpusCodec);
1312 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001313 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001314 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001315}
1316
1317// Test that with bitrate=N and stereo=1,
1318// channels and bitrate are 2 and N.
1319TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001320 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001321 cricket::AudioSendParameters parameters;
1322 parameters.codecs.push_back(kOpusCodec);
1323 parameters.codecs[0].bitrate = 30000;
1324 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001325 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001326 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327}
1328
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001329// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1330// Also test that the "maxaveragebitrate" can't be set to values outside the
1331// range of 6000 and 510000
1332TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001333 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001334 cricket::AudioSendParameters parameters;
1335 parameters.codecs.push_back(kOpusCodec);
1336 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001337 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001338 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001339 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001340 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001341
1342 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001344 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001345 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001346
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001347 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001348 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001349 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001350}
1351
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001352// Test that we can enable NACK with opus as caller.
1353TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001354 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001355 cricket::AudioSendParameters parameters;
1356 parameters.codecs.push_back(kOpusCodec);
1357 parameters.codecs[0].AddFeedbackParam(
1358 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1359 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001360 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001361 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001362 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001363}
1364
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001365// Test that we can enable NACK with opus as callee.
1366TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001367 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 cricket::AudioSendParameters parameters;
1369 parameters.codecs.push_back(kOpusCodec);
1370 parameters.codecs[0].AddFeedbackParam(
1371 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1372 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001373 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001374 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001375 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001376 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001377
1378 EXPECT_TRUE(channel_->AddSendStream(
1379 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001380 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001381}
1382
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001383// Test that we can enable NACK on receive streams.
1384TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001385 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001386 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001387 cricket::AudioSendParameters parameters;
1388 parameters.codecs.push_back(kOpusCodec);
1389 parameters.codecs[0].AddFeedbackParam(
1390 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1391 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001392 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001393 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001394 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}
1398
1399// Test that we can disable NACK.
1400TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001401 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001402 cricket::AudioSendParameters parameters;
1403 parameters.codecs.push_back(kOpusCodec);
1404 parameters.codecs[0].AddFeedbackParam(
1405 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1406 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001407 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001408 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001409
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001410 parameters.codecs.clear();
1411 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001412 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001413 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414}
1415
1416// Test that we can disable NACK on receive streams.
1417TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001418 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001419 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001420 cricket::AudioSendParameters parameters;
1421 parameters.codecs.push_back(kOpusCodec);
1422 parameters.codecs[0].AddFeedbackParam(
1423 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1424 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001425 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001426 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001427 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001428
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001429 parameters.codecs.clear();
1430 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001431 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001432 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001433 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001434}
1435
1436// Test that NACK is enabled on a new receive stream.
1437TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001438 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001439 cricket::AudioSendParameters parameters;
1440 parameters.codecs.push_back(kIsacCodec);
1441 parameters.codecs.push_back(kCn16000Codec);
1442 parameters.codecs[0].AddFeedbackParam(
1443 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1444 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001445 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001446 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447
solenberg8189b022016-06-14 12:13:00 -07001448 EXPECT_TRUE(AddRecvStream(kSsrc2));
1449 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1450 EXPECT_TRUE(AddRecvStream(kSsrc3));
1451 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001452}
1453
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001454// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001455TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001456 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001457 cricket::AudioSendParameters parameters;
1458 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001459 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001460 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001461}
1462
1463// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001464TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001465 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001466 cricket::AudioSendParameters parameters;
1467 parameters.codecs.push_back(kOpusCodec);
1468 parameters.codecs[0].bitrate = 0;
1469 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001470 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001471 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001472}
1473
1474// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001475TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001476 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001477 cricket::AudioSendParameters parameters;
1478 parameters.codecs.push_back(kOpusCodec);
1479 parameters.codecs[0].bitrate = 0;
1480 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001481 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001482 EXPECT_TRUE(GetCodecFec(kSsrc1));
1483 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001484}
1485
1486// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001487TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001488 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001489 cricket::AudioSendParameters parameters;
1490 parameters.codecs.push_back(kOpusCodec);
1491 parameters.codecs[0].bitrate = 0;
1492 parameters.codecs[0].params["stereo"] = "1";
1493 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001494 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001495 EXPECT_TRUE(GetCodecFec(kSsrc1));
1496 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001497}
1498
1499// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001500TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001501 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001502 cricket::AudioSendParameters parameters;
1503 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001504 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001505 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001506}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001507
1508// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1509TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001510 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001511 cricket::AudioSendParameters parameters;
1512 parameters.codecs.push_back(kIsacCodec);
1513 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001514 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001515 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001516}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001517
1518// Test that Opus FEC status can be changed.
1519TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001520 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001521 cricket::AudioSendParameters parameters;
1522 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001523 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001524 EXPECT_FALSE(GetCodecFec(kSsrc1));
1525
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001526 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001527 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001528 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001529}
1530
stefanba4c0e42016-02-04 04:12:24 -08001531TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001532 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001533 cricket::AudioSendParameters send_parameters;
1534 send_parameters.codecs.push_back(kOpusCodec);
1535 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001536 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001537
1538 cricket::AudioRecvParameters recv_parameters;
1539 recv_parameters.codecs.push_back(kIsacCodec);
1540 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001541 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001542 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1543 EXPECT_FALSE(
1544 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1545
ossudedfd282016-06-14 07:12:39 -07001546 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001547 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001548 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1549 EXPECT_TRUE(
1550 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1551}
1552
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001553// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1554TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001555 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001556 cricket::AudioSendParameters parameters;
1557 parameters.codecs.push_back(kOpusCodec);
1558 parameters.codecs[0].bitrate = 0;
1559 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001560 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001561 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1562 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001563
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001564 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001565 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001566 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001567}
1568
1569// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1570TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001571 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001572 cricket::AudioSendParameters parameters;
1573 parameters.codecs.push_back(kOpusCodec);
1574 parameters.codecs[0].bitrate = 0;
1575 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001576 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001577 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1578 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001579
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001580 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001581 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001582 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001583}
1584
1585// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1586TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001587 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001588 cricket::AudioSendParameters parameters;
1589 parameters.codecs.push_back(kOpusCodec);
1590 parameters.codecs[0].bitrate = 0;
1591 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001592 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001593 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1594 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001595
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001596 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001597 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001598 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001599}
1600
1601// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1602TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001603 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001604 cricket::AudioSendParameters parameters;
1605 parameters.codecs.push_back(kOpusCodec);
1606 parameters.codecs[0].bitrate = 0;
1607 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001608 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001609 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1610 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001611
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001612 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001613 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001614 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001615}
1616
1617// Test 24000 < maxplaybackrate triggers Opus full band mode.
1618TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001619 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001620 cricket::AudioSendParameters parameters;
1621 parameters.codecs.push_back(kOpusCodec);
1622 parameters.codecs[0].bitrate = 0;
1623 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001624 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001625 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1626 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001627
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001628 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001629 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001630 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001631}
1632
1633// Test Opus that without maxplaybackrate, default playback rate is used.
1634TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001635 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001636 cricket::AudioSendParameters parameters;
1637 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001638 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001639 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001640}
1641
1642// Test the with non-Opus, maxplaybackrate has no effect.
1643TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001644 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001645 cricket::AudioSendParameters parameters;
1646 parameters.codecs.push_back(kIsacCodec);
1647 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001648 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001649 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001650}
1651
1652// Test maxplaybackrate can be set on two streams.
1653TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001654 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001655 cricket::AudioSendParameters parameters;
1656 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001657 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001658 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001659
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001660 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001661 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001662 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001663
1664 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001665 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001666}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001667
Minyue Li7100dcd2015-03-27 05:05:59 +01001668// Test that with usedtx=0, Opus DTX is off.
1669TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
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(kOpusCodec);
1673 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001674 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001675 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001676}
1677
1678// Test that with usedtx=1, Opus DTX is on.
1679TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001680 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kOpusCodec);
1683 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001684 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001685 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001686}
1687
1688// Test that usedtx=1 works with stereo Opus.
1689TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001690 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001691 cricket::AudioSendParameters parameters;
1692 parameters.codecs.push_back(kOpusCodec);
1693 parameters.codecs[0].params["usedtx"] = "1";
1694 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001695 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001696 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001697}
1698
1699// Test that usedtx=1 does not work with non Opus.
1700TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001701 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001702 cricket::AudioSendParameters parameters;
1703 parameters.codecs.push_back(kIsacCodec);
1704 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001705 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001706 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001707}
1708
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001709// Test that we can switch back and forth between Opus and ISAC with CN.
1710TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001711 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001712
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001713 cricket::AudioSendParameters opus_parameters;
1714 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001715 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001716 {
1717 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1718 EXPECT_EQ(111, gcodec.pltype);
1719 EXPECT_STREQ("opus", gcodec.plname);
1720 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001722 cricket::AudioSendParameters isac_parameters;
1723 isac_parameters.codecs.push_back(kIsacCodec);
1724 isac_parameters.codecs.push_back(kCn16000Codec);
1725 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001726 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001727 {
1728 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1729 EXPECT_EQ(103, gcodec.pltype);
1730 EXPECT_STREQ("ISAC", gcodec.plname);
1731 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001732
solenberg059fb442016-10-26 05:12:24 -07001733 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001734 {
1735 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1736 EXPECT_EQ(111, gcodec.pltype);
1737 EXPECT_STREQ("opus", gcodec.plname);
1738 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001739}
1740
1741// Test that we handle various ways of specifying bitrate.
1742TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001743 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001744 cricket::AudioSendParameters parameters;
1745 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001746 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001747 {
1748 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1749 EXPECT_EQ(103, gcodec.pltype);
1750 EXPECT_STREQ("ISAC", gcodec.plname);
1751 EXPECT_EQ(32000, gcodec.rate);
1752 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001753
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001754 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001755 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001756 {
1757 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1758 EXPECT_EQ(103, gcodec.pltype);
1759 EXPECT_STREQ("ISAC", gcodec.plname);
1760 EXPECT_EQ(-1, gcodec.rate);
1761 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001762 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001763 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001764 {
1765 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1766 EXPECT_EQ(103, gcodec.pltype);
1767 EXPECT_STREQ("ISAC", gcodec.plname);
1768 EXPECT_EQ(28000, gcodec.rate);
1769 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001771 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001772 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001773 {
1774 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1775 EXPECT_EQ(0, gcodec.pltype);
1776 EXPECT_STREQ("PCMU", gcodec.plname);
1777 EXPECT_EQ(64000, gcodec.rate);
1778 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001779
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001780 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001781 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001782 {
1783 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1784 EXPECT_EQ(0, gcodec.pltype);
1785 EXPECT_STREQ("PCMU", gcodec.plname);
1786 EXPECT_EQ(64000, gcodec.rate);
1787 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001789 parameters.codecs[0] = kOpusCodec;
1790 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001791 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001792 {
1793 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1794 EXPECT_EQ(111, gcodec.pltype);
1795 EXPECT_STREQ("opus", gcodec.plname);
1796 EXPECT_EQ(32000, gcodec.rate);
1797 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798}
1799
Brave Yao5225dd82015-03-26 07:39:19 +08001800// Test that we could set packet size specified in kCodecParamPTime.
1801TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001802 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001803 cricket::AudioSendParameters parameters;
1804 parameters.codecs.push_back(kOpusCodec);
1805 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001806 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001807 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001808
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001809 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001810 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001811 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001812
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001813 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001814 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001815 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001816
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001817 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1818 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001819 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001820 EXPECT_EQ(480, GetCodecPacSize(
1821 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001822
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001823 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1824 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001825 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001826 EXPECT_EQ(640, GetCodecPacSize(
1827 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001828}
1829
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001830// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001831TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001832 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001833 cricket::AudioSendParameters parameters;
1834 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001835}
1836
1837// Test that we can set send codecs even with telephone-event codec as the first
1838// one on the list.
1839TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001840 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001841 cricket::AudioSendParameters parameters;
1842 parameters.codecs.push_back(kTelephoneEventCodec);
1843 parameters.codecs.push_back(kIsacCodec);
1844 parameters.codecs.push_back(kPcmuCodec);
1845 parameters.codecs[0].id = 98; // DTMF
1846 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001847 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001848 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001849 EXPECT_EQ(96, gcodec.pltype);
1850 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001851 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001852}
1853
solenberg31642aa2016-03-14 08:00:37 -07001854// Test that payload type range is limited for telephone-event codec.
1855TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001856 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001857 cricket::AudioSendParameters parameters;
1858 parameters.codecs.push_back(kTelephoneEventCodec);
1859 parameters.codecs.push_back(kIsacCodec);
1860 parameters.codecs[0].id = 0; // DTMF
1861 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001862 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001863 EXPECT_TRUE(channel_->CanInsertDtmf());
1864 parameters.codecs[0].id = 128; // DTMF
1865 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1866 EXPECT_FALSE(channel_->CanInsertDtmf());
1867 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001868 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001869 EXPECT_TRUE(channel_->CanInsertDtmf());
1870 parameters.codecs[0].id = -1; // DTMF
1871 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1872 EXPECT_FALSE(channel_->CanInsertDtmf());
1873}
1874
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001875// Test that we can set send codecs even with CN codec as the first
1876// one on the list.
1877TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001878 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001879 cricket::AudioSendParameters parameters;
1880 parameters.codecs.push_back(kCn16000Codec);
1881 parameters.codecs.push_back(kIsacCodec);
1882 parameters.codecs.push_back(kPcmuCodec);
1883 parameters.codecs[0].id = 98; // wideband CN
1884 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001885 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001886 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1887 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1888 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1889 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1890 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001891}
1892
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001893// Test that we set VAD and DTMF types correctly as caller.
1894TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001895 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 cricket::AudioSendParameters parameters;
1897 parameters.codecs.push_back(kIsacCodec);
1898 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001899 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001900 parameters.codecs.push_back(kCn16000Codec);
1901 parameters.codecs.push_back(kCn8000Codec);
1902 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001903 parameters.codecs[0].id = 96;
1904 parameters.codecs[2].id = 97; // wideband CN
1905 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001906 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001907 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1908 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1909 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1910 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1911 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1912 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1913 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001914 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915}
1916
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001917// Test that we set VAD and DTMF types correctly as callee.
1918TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001919 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001920 cricket::AudioSendParameters parameters;
1921 parameters.codecs.push_back(kIsacCodec);
1922 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001923 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001924 parameters.codecs.push_back(kCn16000Codec);
1925 parameters.codecs.push_back(kCn8000Codec);
1926 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001927 parameters.codecs[0].id = 96;
1928 parameters.codecs[2].id = 97; // wideband CN
1929 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001930 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001931 EXPECT_TRUE(channel_->AddSendStream(
1932 cricket::StreamParams::CreateLegacy(kSsrc1)));
1933
minyue7a973442016-10-20 03:27:12 -07001934 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1935 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1936 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1937 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1938 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1939 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1940 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001941 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001942}
1943
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944// Test that we only apply VAD if we have a CN codec that matches the
1945// send codec clockrate.
1946TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001947 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001948 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001950 parameters.codecs.push_back(kIsacCodec);
1951 parameters.codecs.push_back(kCn16000Codec);
1952 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07001953 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001954 {
1955 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1956 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1957 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1958 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1959 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1960 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
1961 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001963 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07001964 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001965 {
1966 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1967 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1968 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1969 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001970 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001971 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07001972 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001973 {
1974 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1975 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1976 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1977 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1978 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1979 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
1980 }
Brave Yao5225dd82015-03-26 07:39:19 +08001981 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001982 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07001983 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001984 {
1985 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1986 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1987 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1988 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001989}
1990
1991// Test that we perform case-insensitive matching of codec names.
1992TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001993 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001994 cricket::AudioSendParameters parameters;
1995 parameters.codecs.push_back(kIsacCodec);
1996 parameters.codecs.push_back(kPcmuCodec);
1997 parameters.codecs.push_back(kCn16000Codec);
1998 parameters.codecs.push_back(kCn8000Codec);
1999 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002000 parameters.codecs[0].name = "iSaC";
2001 parameters.codecs[0].id = 96;
2002 parameters.codecs[2].id = 97; // wideband CN
2003 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002004 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002005 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2006 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2007 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2008 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2009 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2010 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2011 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002012 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002013}
2014
stefanba4c0e42016-02-04 04:12:24 -08002015class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2016 public:
2017 WebRtcVoiceEngineWithSendSideBweTest()
2018 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2019};
2020
2021TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2022 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002023 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002024 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002025 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2026 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2027 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002028 extension.id);
2029 return;
2030 }
2031 }
2032 FAIL() << "Transport sequence number extension not in header-extension list.";
2033}
2034
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002035// Test support for audio level header extension.
2036TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002037 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002038}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002039TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002040 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002041}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002042
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002043// Test support for absolute send time header extension.
2044TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002045 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002046}
2047TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002048 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002049}
2050
solenberg1ac56142015-10-13 03:58:19 -07002051// Test that we can create a channel and start sending on it.
2052TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002053 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002054 SetSendParameters(send_parameters_);
2055 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002056 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002057 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002058 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2059}
2060
2061// Test that a channel will send if and only if it has a source and is enabled
2062// for sending.
2063TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002064 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002065 SetSendParameters(send_parameters_);
2066 SetAudioSend(kSsrc1, true, nullptr);
2067 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002068 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002069 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002070 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002071 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002072 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002073}
2074
solenberg94218532016-06-16 10:53:22 -07002075// Test that a channel is muted/unmuted.
2076TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2077 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002078 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002079 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002080 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002081 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002082 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002083 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2084}
2085
solenberg6d6e7c52016-04-13 09:07:30 -07002086// Test that SetSendParameters() does not alter a stream's send state.
2087TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2088 EXPECT_TRUE(SetupSendStream());
2089 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2090
2091 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002092 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002093 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2094
2095 // Changing RTP header extensions will recreate the AudioSendStream.
2096 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002097 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002098 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002099 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2100
2101 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002102 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002103 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2104
2105 // Changing RTP header extensions will recreate the AudioSendStream.
2106 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002107 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002108 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2109}
2110
solenberg1ac56142015-10-13 03:58:19 -07002111// Test that we can create a channel and start playing out on it.
2112TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002113 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002114 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002115 channel_->SetPlayout(true);
2116 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2117 channel_->SetPlayout(false);
2118 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002119}
2120
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002121// Test that we can add and remove send streams.
2122TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2123 SetupForMultiSendStream();
2124
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002125 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002126 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002127
solenbergc96df772015-10-21 13:01:53 -07002128 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002129 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002130 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002131 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002132 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002133 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002134 }
tfarina5237aaf2015-11-10 23:44:30 -08002135 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002136
solenbergc96df772015-10-21 13:01:53 -07002137 // Delete the send streams.
2138 for (uint32_t ssrc : kSsrcs4) {
2139 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002140 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002141 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002142 }
solenbergc96df772015-10-21 13:01:53 -07002143 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002144}
2145
2146// Test SetSendCodecs correctly configure the codecs in all send streams.
2147TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2148 SetupForMultiSendStream();
2149
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002150 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002151 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002152 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002153 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002154 }
2155
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002156 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002157 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002158 parameters.codecs.push_back(kIsacCodec);
2159 parameters.codecs.push_back(kCn16000Codec);
2160 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002161 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002162
2163 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002164 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002165 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2166 const auto& send_codec_spec =
2167 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2168 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2169 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2170 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2171 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2172 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002173 }
2174
minyue7a973442016-10-20 03:27:12 -07002175 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002176 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002177 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002178 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002179 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2180 const auto& send_codec_spec =
2181 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2182 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2183 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2184 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2185 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002186 }
2187}
2188
2189// Test we can SetSend on all send streams correctly.
2190TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2191 SetupForMultiSendStream();
2192
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002193 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002194 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002195 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002196 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002197 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002198 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002199 }
2200
2201 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002202 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002203 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002204 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002205 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002206 }
2207
2208 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002209 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002210 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002211 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002212 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213 }
2214}
2215
2216// Test we can set the correct statistics on all send streams.
2217TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2218 SetupForMultiSendStream();
2219
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002220 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002221 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002222 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002223 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002224 }
solenberg85a04962015-10-27 03:35:21 -07002225
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002226 // Create a receive stream to check that none of the send streams end up in
2227 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002228 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002229
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002230 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002231 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002232 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002233 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002234
solenberg85a04962015-10-27 03:35:21 -07002235 // Check stats for the added streams.
2236 {
2237 cricket::VoiceMediaInfo info;
2238 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002239
solenberg85a04962015-10-27 03:35:21 -07002240 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002241 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002242 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002243 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002244 }
2245
2246 // We have added one receive stream. We should see empty stats.
2247 EXPECT_EQ(info.receivers.size(), 1u);
2248 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002249 }
solenberg1ac56142015-10-13 03:58:19 -07002250
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002251 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002252 {
2253 cricket::VoiceMediaInfo info;
2254 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2255 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002256 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002257 EXPECT_EQ(0u, info.receivers.size());
2258 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002259
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002260 // Deliver a new packet - a default receive stream should be created and we
2261 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002262 {
2263 cricket::VoiceMediaInfo info;
2264 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2265 SetAudioReceiveStreamStats();
2266 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002267 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002268 EXPECT_EQ(1u, info.receivers.size());
2269 VerifyVoiceReceiverInfo(info.receivers[0]);
2270 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271}
2272
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002273// Test that we can add and remove receive streams, and do proper send/playout.
2274// We can receive on multiple streams while sending one stream.
2275TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002276 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277
solenberg1ac56142015-10-13 03:58:19 -07002278 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002279 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002280 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281
solenberg1ac56142015-10-13 03:58:19 -07002282 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002283 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002284 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002285 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286
solenberg1ac56142015-10-13 03:58:19 -07002287 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002288 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002289
2290 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002291 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002292 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2293 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002294
2295 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002296 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002297 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298
2299 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002300 channel_->SetPlayout(false);
2301 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2302 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303
aleloi84ef6152016-08-04 05:28:21 -07002304 // Restart playout and make sure recv streams are played out.
2305 channel_->SetPlayout(true);
2306 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2307 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002308
aleloi84ef6152016-08-04 05:28:21 -07002309 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2311 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312}
2313
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002315// and start sending on it.
2316TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002317 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002318 cricket::AudioOptions options_adjust_agc;
2319 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320 webrtc::AgcConfig agc_config;
2321 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2322 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002323 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002324 SetSendParameters(send_parameters_);
2325 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002326 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2328 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002329 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002330 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002331 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002332}
2333
wu@webrtc.org97077a32013-10-25 21:18:33 +00002334TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002335 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002336 EXPECT_CALL(adm_,
2337 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002338 webrtc::AgcConfig agc_config;
2339 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2340 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002341 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2342 send_parameters_.options.tx_agc_digital_compression_gain =
2343 rtc::Optional<uint16_t>(9);
2344 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2345 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002346 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002347 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2348 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2349 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2350 EXPECT_TRUE(agc_config.limiterEnable);
2351
2352 // Check interaction with adjust_agc_delta. Both should be respected, for
2353 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002354 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002355 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002356 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2357 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2358}
2359
wu@webrtc.org97077a32013-10-25 21:18:33 +00002360TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002361 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002362 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2363 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002364 send_parameters_.options.recording_sample_rate =
2365 rtc::Optional<uint32_t>(48000);
2366 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002367 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002368}
2369
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002371// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002373 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002374 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375}
2376
2377TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2378 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002379 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002380 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002381 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002382 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002383 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002384 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002385 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002386
solenberg85a04962015-10-27 03:35:21 -07002387 // Check stats for the added streams.
2388 {
2389 cricket::VoiceMediaInfo info;
2390 EXPECT_EQ(true, channel_->GetStats(&info));
2391
2392 // We have added one send stream. We should see the stats we've set.
2393 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002394 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002395 // We have added one receive stream. We should see empty stats.
2396 EXPECT_EQ(info.receivers.size(), 1u);
2397 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2398 }
solenberg1ac56142015-10-13 03:58:19 -07002399
solenberg566ef242015-11-06 15:34:49 -08002400 // Start sending - this affects some reported stats.
2401 {
2402 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002403 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002404 EXPECT_EQ(true, channel_->GetStats(&info));
2405 VerifyVoiceSenderInfo(info.senders[0], true);
2406 }
2407
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002408 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002409 {
2410 cricket::VoiceMediaInfo info;
2411 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2412 EXPECT_EQ(true, channel_->GetStats(&info));
2413 EXPECT_EQ(1u, info.senders.size());
2414 EXPECT_EQ(0u, info.receivers.size());
2415 }
solenberg1ac56142015-10-13 03:58:19 -07002416
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002417 // Deliver a new packet - a default receive stream should be created and we
2418 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002419 {
2420 cricket::VoiceMediaInfo info;
2421 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2422 SetAudioReceiveStreamStats();
2423 EXPECT_EQ(true, channel_->GetStats(&info));
2424 EXPECT_EQ(1u, info.senders.size());
2425 EXPECT_EQ(1u, info.receivers.size());
2426 VerifyVoiceReceiverInfo(info.receivers[0]);
2427 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428}
2429
2430// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002431// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002433 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002434 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002435 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002436 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437}
2438
2439// Test that the local SSRC is the same on sending and receiving channels if the
2440// receive channel is created before the send channel.
2441TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002442 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002443 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002445 cricket::StreamParams::CreateLegacy(kSsrc1)));
2446 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2447 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448}
2449
2450// Test that we can properly receive packets.
2451TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002452 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002453 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002454 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002455
2456 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2457 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458}
2459
2460// Test that we can properly receive packets on multiple streams.
2461TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002462 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002463 const uint32_t ssrc1 = 1;
2464 const uint32_t ssrc2 = 2;
2465 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002466 EXPECT_TRUE(AddRecvStream(ssrc1));
2467 EXPECT_TRUE(AddRecvStream(ssrc2));
2468 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002470 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002471 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002472 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002473 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002474 }
mflodman3d7db262016-04-29 00:57:13 -07002475
2476 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2477 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2478 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2479
2480 EXPECT_EQ(s1.received_packets(), 0);
2481 EXPECT_EQ(s2.received_packets(), 0);
2482 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002483
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002485 EXPECT_EQ(s1.received_packets(), 0);
2486 EXPECT_EQ(s2.received_packets(), 0);
2487 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002488
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002490 EXPECT_EQ(s1.received_packets(), 1);
2491 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2492 EXPECT_EQ(s2.received_packets(), 0);
2493 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002494
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002496 EXPECT_EQ(s1.received_packets(), 1);
2497 EXPECT_EQ(s2.received_packets(), 1);
2498 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2499 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002500
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002502 EXPECT_EQ(s1.received_packets(), 1);
2503 EXPECT_EQ(s2.received_packets(), 1);
2504 EXPECT_EQ(s3.received_packets(), 1);
2505 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002506
mflodman3d7db262016-04-29 00:57:13 -07002507 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2508 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2509 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510}
2511
solenberg7e63ef02015-11-20 00:19:43 -08002512// Test that receiving on an unsignalled stream works (default channel will be
2513// created).
2514TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002515 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002516 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2517
solenberg7e63ef02015-11-20 00:19:43 -08002518 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002519
2520 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2521 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2522 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002523}
2524
2525// Test that receiving on an unsignalled stream works (default channel will be
2526// created), and that packets will be forwarded to the default channel
2527// regardless of their SSRCs.
2528TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002529 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002530 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002531 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2532
mflodman3d7db262016-04-29 00:57:13 -07002533 // Note that ssrc = 0 is not supported.
2534 uint32_t ssrc = 1;
2535 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002536 rtc::SetBE32(&packet[8], ssrc);
2537 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002538
2539 // Verify we only have one default stream.
2540 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2541 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2542 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002543 }
mflodman3d7db262016-04-29 00:57:13 -07002544
2545 // Sending the same ssrc again should not create a new stream.
2546 --ssrc;
2547 DeliverPacket(packet, sizeof(packet));
2548 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2549 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2550 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002551}
2552
2553// Test that a default channel is created even after a signalled stream has been
2554// added, and that this stream will get any packets for unknown SSRCs.
2555TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002556 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002557 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002558 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2559
2560 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002561 const uint32_t signaled_ssrc = 1;
2562 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002563 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002564 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002565 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2566 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002567
2568 // Note that the first unknown SSRC cannot be 0, because we only support
2569 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002570 const uint32_t unsignaled_ssrc = 7011;
2571 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002572 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002573 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2574 packet, sizeof(packet)));
2575 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2576
2577 DeliverPacket(packet, sizeof(packet));
2578 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2579
2580 rtc::SetBE32(&packet[8], signaled_ssrc);
2581 DeliverPacket(packet, sizeof(packet));
2582 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2583 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002584}
2585
solenberg0a617e22015-10-20 15:49:38 -07002586// Test that we properly handle failures to add a receive stream.
2587TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002588 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002589 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002590 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002591}
2592
solenberg0a617e22015-10-20 15:49:38 -07002593// Test that we properly handle failures to add a send stream.
2594TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002595 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002596 voe_.set_fail_create_channel(true);
2597 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2598}
2599
solenberg1ac56142015-10-13 03:58:19 -07002600// Test that AddRecvStream creates new stream.
2601TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002602 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002604 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002605 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002606}
2607
2608// Test that after adding a recv stream, we do not decode more codecs than
2609// those previously passed into SetRecvCodecs.
2610TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002611 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002612 cricket::AudioRecvParameters parameters;
2613 parameters.codecs.push_back(kIsacCodec);
2614 parameters.codecs.push_back(kPcmuCodec);
2615 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002616 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002617 int channel_num2 = voe_.GetLastChannel();
2618 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002619 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002620 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002621 gcodec.channels = 2;
2622 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2623}
2624
2625// Test that we properly clean up any streams that were added, even if
2626// not explicitly removed.
2627TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002628 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002629 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002630 EXPECT_TRUE(AddRecvStream(1));
2631 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002632 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2633 delete channel_;
2634 channel_ = NULL;
2635 EXPECT_EQ(0, voe_.GetNumChannels());
2636}
2637
wu@webrtc.org78187522013-10-07 23:32:02 +00002638TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002639 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002640 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002641}
2642
2643TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002644 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002645 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002646 // Manually delete channel to simulate a failure.
2647 int channel = voe_.GetLastChannel();
2648 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2649 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002650 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002651 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002652 EXPECT_NE(channel, new_channel);
2653 // The last created channel is deleted too.
2654 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002655}
2656
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002657// Test the InsertDtmf on default send stream as caller.
2658TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2659 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660}
2661
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002662// Test the InsertDtmf on default send stream as callee
2663TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2664 TestInsertDtmf(0, false);
2665}
2666
2667// Test the InsertDtmf on specified send stream as caller.
2668TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2669 TestInsertDtmf(kSsrc1, true);
2670}
2671
2672// Test the InsertDtmf on specified send stream as callee.
2673TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2674 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002675}
2676
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002678 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002679 EXPECT_CALL(adm_,
2680 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2681 EXPECT_CALL(adm_,
2682 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2683 EXPECT_CALL(adm_,
2684 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 bool ec_enabled;
2686 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687 webrtc::AecmModes aecm_mode;
2688 bool cng_enabled;
2689 bool agc_enabled;
2690 webrtc::AgcModes agc_mode;
2691 webrtc::AgcConfig agc_config;
2692 bool ns_enabled;
2693 webrtc::NsModes ns_mode;
2694 bool highpass_filter_enabled;
2695 bool stereo_swapping_enabled;
2696 bool typing_detection_enabled;
2697 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002698 voe_.GetAecmMode(aecm_mode, cng_enabled);
2699 voe_.GetAgcStatus(agc_enabled, agc_mode);
2700 voe_.GetAgcConfig(agc_config);
2701 voe_.GetNsStatus(ns_enabled, ns_mode);
2702 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2703 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2704 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2705 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002706 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002707 EXPECT_FALSE(cng_enabled);
2708 EXPECT_TRUE(agc_enabled);
2709 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2710 EXPECT_TRUE(ns_enabled);
2711 EXPECT_TRUE(highpass_filter_enabled);
2712 EXPECT_FALSE(stereo_swapping_enabled);
2713 EXPECT_TRUE(typing_detection_enabled);
2714 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2715 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002716 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2717 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718
solenberg246b8172015-12-08 09:50:23 -08002719 // Nothing set in AudioOptions, so everything should be as default.
2720 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002721 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002722 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723 voe_.GetAecmMode(aecm_mode, cng_enabled);
2724 voe_.GetAgcStatus(agc_enabled, agc_mode);
2725 voe_.GetAgcConfig(agc_config);
2726 voe_.GetNsStatus(ns_enabled, ns_mode);
2727 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2728 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2729 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2730 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002731 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732 EXPECT_FALSE(cng_enabled);
2733 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);
solenberg246b8172015-12-08 09:50:23 -08002741 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2742 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002743
2744 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002745 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002746 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 voe_.GetEcStatus(ec_enabled, ec_mode);
2748 EXPECT_FALSE(ec_enabled);
2749
2750 // Turn echo cancellation back on, with settings, and make sure
2751 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002752 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002753 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002754 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755 voe_.GetAecmMode(aecm_mode, cng_enabled);
2756 voe_.GetAgcStatus(agc_enabled, agc_mode);
2757 voe_.GetAgcConfig(agc_config);
2758 voe_.GetNsStatus(ns_enabled, ns_mode);
2759 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2760 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2761 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2762 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002763 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002764 EXPECT_TRUE(agc_enabled);
2765 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2766 EXPECT_TRUE(ns_enabled);
2767 EXPECT_TRUE(highpass_filter_enabled);
2768 EXPECT_FALSE(stereo_swapping_enabled);
2769 EXPECT_TRUE(typing_detection_enabled);
2770 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2771 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2772
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002773 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2774 // control.
solenberg246b8172015-12-08 09:50:23 -08002775 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002776 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002777 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002778 voe_.GetAecmMode(aecm_mode, cng_enabled);
2779 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002780 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002781 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2782
2783 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002784 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2785 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2786 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002787 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002788 voe_.GetEcStatus(ec_enabled, ec_mode);
2789 EXPECT_FALSE(ec_enabled);
2790 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002791 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002792 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002793 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002794 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002795 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002796 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2797
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002798 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002799 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002800 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002801 voe_.GetAgcStatus(agc_enabled, agc_mode);
2802 EXPECT_FALSE(agc_enabled);
2803
2804 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002805 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2806 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07002807 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002808 voe_.GetAgcStatus(agc_enabled, agc_mode);
2809 EXPECT_TRUE(agc_enabled);
2810 voe_.GetAgcConfig(agc_config);
2811 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2812
2813 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002814 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2815 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2816 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2817 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002818 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002819 voe_.GetNsStatus(ns_enabled, ns_mode);
2820 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2821 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2822 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2823 EXPECT_FALSE(ns_enabled);
2824 EXPECT_FALSE(highpass_filter_enabled);
2825 EXPECT_FALSE(typing_detection_enabled);
2826 EXPECT_TRUE(stereo_swapping_enabled);
2827
solenberg1ac56142015-10-13 03:58:19 -07002828 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07002829 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002830 voe_.GetEcStatus(ec_enabled, ec_mode);
2831 voe_.GetNsStatus(ns_enabled, ns_mode);
2832 EXPECT_TRUE(ec_enabled);
2833 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2834 EXPECT_FALSE(ns_enabled);
2835 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2836}
2837
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002838TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002839 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002840
2841 bool ec_enabled;
2842 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843 bool agc_enabled;
2844 webrtc::AgcModes agc_mode;
2845 bool ns_enabled;
2846 webrtc::NsModes ns_mode;
2847 bool highpass_filter_enabled;
2848 bool stereo_swapping_enabled;
2849 bool typing_detection_enabled;
2850
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002851 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002852 voe_.GetAgcStatus(agc_enabled, agc_mode);
2853 voe_.GetNsStatus(ns_enabled, ns_mode);
2854 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2855 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2856 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2857 EXPECT_TRUE(ec_enabled);
2858 EXPECT_TRUE(agc_enabled);
2859 EXPECT_TRUE(ns_enabled);
2860 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002861 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002862 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002863}
2864
2865TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2866 webrtc::AgcConfig set_config = {0};
2867 set_config.targetLeveldBOv = 3;
2868 set_config.digitalCompressionGaindB = 9;
2869 set_config.limiterEnable = true;
2870 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002871
2872 webrtc::AgcConfig config = {0};
2873 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2874 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2875 EXPECT_EQ(set_config.digitalCompressionGaindB,
2876 config.digitalCompressionGaindB);
2877 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2878}
2879
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002880TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002881 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002882 EXPECT_CALL(adm_,
2883 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2884 EXPECT_CALL(adm_,
2885 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2886 EXPECT_CALL(adm_,
2887 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07002888 EXPECT_CALL(adm_,
2889 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
2890 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
2891 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
2892 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
2893 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07002894
kwiberg686a8ef2016-02-26 03:00:35 -08002895 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002896 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002897 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002898 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002899 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002900 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002901
2902 // Have to add a stream to make SetSend work.
2903 cricket::StreamParams stream1;
2904 stream1.ssrcs.push_back(1);
2905 channel1->AddSendStream(stream1);
2906 cricket::StreamParams stream2;
2907 stream2.ssrcs.push_back(2);
2908 channel2->AddSendStream(stream2);
2909
2910 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002911 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002912 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2913 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2914 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002915 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002916 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07002917 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002918 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919
2920 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002921 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002922 parameters_options_no_ns.options.noise_suppression =
2923 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002924 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002925 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002926 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2927 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2928 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002929 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930
2931 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002932 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002933 parameters_options_no_agc.options.auto_gain_control =
2934 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002935 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002936 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2937 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2938 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002939 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940
solenberg059fb442016-10-26 05:12:24 -07002941 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942 bool ec_enabled;
2943 webrtc::EcModes ec_mode;
2944 bool agc_enabled;
2945 webrtc::AgcModes agc_mode;
2946 bool ns_enabled;
2947 webrtc::NsModes ns_mode;
2948 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_TRUE(agc_enabled);
2953 EXPECT_TRUE(ns_enabled);
2954
solenberg059fb442016-10-26 05:12:24 -07002955 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002956 voe_.GetEcStatus(ec_enabled, ec_mode);
2957 voe_.GetAgcStatus(agc_enabled, agc_mode);
2958 voe_.GetNsStatus(ns_enabled, ns_mode);
2959 EXPECT_TRUE(ec_enabled);
2960 EXPECT_TRUE(agc_enabled);
2961 EXPECT_FALSE(ns_enabled);
2962
solenberg059fb442016-10-26 05:12:24 -07002963 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002964 voe_.GetEcStatus(ec_enabled, ec_mode);
2965 voe_.GetAgcStatus(agc_enabled, agc_mode);
2966 voe_.GetNsStatus(ns_enabled, ns_mode);
2967 EXPECT_TRUE(ec_enabled);
2968 EXPECT_FALSE(agc_enabled);
2969 EXPECT_TRUE(ns_enabled);
2970
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07002972 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
2973 EXPECT_CALL(apm_, ApplyConfig(testing::_));
2974 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002975 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2976 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002977 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002978 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002979 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002980 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002981 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07002982 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01002983 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2984 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2985 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002986 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002987 voe_.GetEcStatus(ec_enabled, ec_mode);
2988 voe_.GetAgcStatus(agc_enabled, agc_mode);
2989 voe_.GetNsStatus(ns_enabled, ns_mode);
2990 EXPECT_TRUE(ec_enabled);
2991 EXPECT_FALSE(agc_enabled);
2992 EXPECT_FALSE(ns_enabled);
2993}
2994
wu@webrtc.orgde305012013-10-31 15:40:38 +00002995// This test verifies DSCP settings are properly applied on voice media channel.
2996TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07002997 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08002998 cricket::FakeNetworkInterface network_interface;
2999 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003000 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003001
solenberg059fb442016-10-26 05:12:24 -07003002 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3003 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3004
solenbergbc37fc82016-04-04 09:54:44 -07003005 channel.reset(
3006 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003007 channel->SetInterface(&network_interface);
3008 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3009 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3010
3011 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003012 channel.reset(
3013 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003014 channel->SetInterface(&network_interface);
3015 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3016
3017 // Verify that setting the option to false resets the
3018 // DiffServCodePoint.
3019 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003020 channel.reset(
3021 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003022 channel->SetInterface(&network_interface);
3023 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3024 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3025
3026 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003027}
3028
solenberg1ac56142015-10-13 03:58:19 -07003029TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003030 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003031 cricket::WebRtcVoiceMediaChannel* media_channel =
3032 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003033 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003034 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003035 int channel_id = voe_.GetLastChannel();
3036 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3037 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003038 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003039 int channel_id2 = voe_.GetLastChannel();
3040 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003041}
3042
solenberg1ac56142015-10-13 03:58:19 -07003043TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003044 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003045 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003046 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3047 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3048 EXPECT_TRUE(channel_->AddSendStream(
3049 cricket::StreamParams::CreateLegacy(kSsrc1)));
3050 int channel_id = voe_.GetLastChannel();
3051 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3052 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3053 EXPECT_TRUE(channel_->AddSendStream(
3054 cricket::StreamParams::CreateLegacy(kSsrc2)));
3055 int channel_id2 = voe_.GetLastChannel();
3056 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003057}
3058
solenberg4bac9c52015-10-09 02:32:53 -07003059TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003060 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003061 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003062 cricket::StreamParams stream;
3063 stream.ssrcs.push_back(kSsrc2);
3064 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003065 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003066 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003067 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003068}
3069
3070TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003071 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003072 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3073 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003074 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003075 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003076 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3077 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3078 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003079}
3080
pbos8fc7fa72015-07-15 08:02:58 -07003081TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003082 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003083 const std::string kSyncLabel = "AvSyncLabel";
3084
solenbergff976312016-03-30 23:28:51 -07003085 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003086 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3087 sp.sync_label = kSyncLabel;
3088 // Creating two channels to make sure that sync label is set properly for both
3089 // the default voice channel and following ones.
3090 EXPECT_TRUE(channel_->AddRecvStream(sp));
3091 sp.ssrcs[0] += 1;
3092 EXPECT_TRUE(channel_->AddRecvStream(sp));
3093
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003094 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003095 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003096 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003097 << "SyncGroup should be set based on sync_label";
3098 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003099 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003100 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003101}
3102
solenberg3a941542015-11-16 07:34:50 -08003103// TODO(solenberg): Remove, once recv streams are configured through Call.
3104// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003105TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003106 // Test that setting the header extensions results in the expected state
3107 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003108 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003109 ssrcs.push_back(223);
3110 ssrcs.push_back(224);
3111
solenbergff976312016-03-30 23:28:51 -07003112 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003113 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003114 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003115 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003116 cricket::StreamParams::CreateLegacy(ssrc)));
3117 }
3118
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003119 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003120 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003121 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003122 EXPECT_NE(nullptr, s);
3123 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3124 }
3125
3126 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003127 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003128 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003129 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003130 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003131 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003132 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003133 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003134 EXPECT_NE(nullptr, s);
3135 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003136 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3137 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003138 for (const auto& s_ext : s_exts) {
3139 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003140 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003141 }
3142 }
3143 }
3144 }
3145
3146 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003147 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003148 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003149 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003150 EXPECT_NE(nullptr, s);
3151 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3152 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003153}
3154
3155TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3156 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003157 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003158 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003159 static const unsigned char kRtcp[] = {
3160 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3161 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3164 };
jbaucheec21bd2016-03-20 06:15:43 -07003165 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003166
solenbergff976312016-03-30 23:28:51 -07003167 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003168 cricket::WebRtcVoiceMediaChannel* media_channel =
3169 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003170 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003171 EXPECT_TRUE(media_channel->AddRecvStream(
3172 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3173
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003174 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003175 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003176 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003177 EXPECT_EQ(0, s->received_packets());
3178 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3179 EXPECT_EQ(1, s->received_packets());
3180 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3181 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003182}
Minyue2013aec2015-05-13 14:14:42 +02003183
solenberg0a617e22015-10-20 15:49:38 -07003184// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003185// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003186TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003187 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003188 SetSendParameters(send_parameters_);
solenberg8fb30c32015-10-13 03:06:58 -07003189 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003190 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003191 int recv_ch = voe_.GetLastChannel();
3192 EXPECT_NE(recv_ch, default_channel);
3193 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3194 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3195 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003196 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003197 recv_ch = voe_.GetLastChannel();
3198 EXPECT_NE(recv_ch, default_channel);
3199 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003200}
3201
3202TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003203 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003204 SetSendParameters(send_parameters_);
Minyue2013aec2015-05-13 14:14:42 +02003205
solenberg8189b022016-06-14 12:13:00 -07003206 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003207 int recv_ch = voe_.GetLastChannel();
3208
3209 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3210 int send_ch = voe_.GetLastChannel();
3211
3212 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3213 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3214 // channel of |recv_ch|.This is not a common case, since, normally, only the
3215 // default channel can be associated. However, the default is not deletable.
3216 // So we force the |recv_ch| to associate with a non-default channel.
3217 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3218 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3219
3220 EXPECT_TRUE(channel_->RemoveSendStream(2));
3221 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3222}
stefan658910c2015-09-03 05:48:32 -07003223
deadbeef884f5852016-01-15 09:20:04 -08003224TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003225 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003226 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3227 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003228
3229 // Setting the sink before a recv stream exists should do nothing.
3230 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003231 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003232 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3233
3234 // Now try actually setting the sink.
3235 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3236 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3237
3238 // Now try resetting it.
3239 channel_->SetRawAudioSink(kSsrc1, nullptr);
3240 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3241}
3242
3243TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003244 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003245 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3246 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003247
3248 // Should be able to set a default sink even when no stream exists.
3249 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3250
3251 // Create default channel and ensure it's assigned the default sink.
3252 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3253 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3254
3255 // Try resetting the default sink.
3256 channel_->SetRawAudioSink(0, nullptr);
3257 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3258
3259 // Try setting the default sink while the default stream exists.
3260 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3261 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3262
3263 // If we remove and add a default stream, it should get the same sink.
3264 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3265 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3266 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3267}
3268
skvlad7a43d252016-03-22 15:32:27 -07003269// Test that, just like the video channel, the voice channel communicates the
3270// network state to the call.
3271TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003272 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003273
3274 EXPECT_EQ(webrtc::kNetworkUp,
3275 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3276 EXPECT_EQ(webrtc::kNetworkUp,
3277 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3278
3279 channel_->OnReadyToSend(false);
3280 EXPECT_EQ(webrtc::kNetworkDown,
3281 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3282 EXPECT_EQ(webrtc::kNetworkUp,
3283 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3284
3285 channel_->OnReadyToSend(true);
3286 EXPECT_EQ(webrtc::kNetworkUp,
3287 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3288 EXPECT_EQ(webrtc::kNetworkUp,
3289 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3290}
3291
aleloi18e0b672016-10-04 02:45:47 -07003292// Test that playout is still started after changing parameters
3293TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3294 SetupRecvStream();
3295 channel_->SetPlayout(true);
3296 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3297
3298 // Changing RTP header extensions will recreate the AudioReceiveStream.
3299 cricket::AudioRecvParameters parameters;
3300 parameters.extensions.push_back(
3301 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3302 channel_->SetRecvParameters(parameters);
3303
3304 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3305}
3306
stefan658910c2015-09-03 05:48:32 -07003307// Tests that the library initializes and shuts down properly.
3308TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003309 // If the VoiceEngine wants to gather available codecs early, that's fine but
3310 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003311 cricket::WebRtcVoiceEngine engine(
3312 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003313 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003314 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003315 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003316 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3317 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003318 EXPECT_TRUE(channel != nullptr);
3319 delete channel;
solenbergff976312016-03-30 23:28:51 -07003320}
stefan658910c2015-09-03 05:48:32 -07003321
solenbergff976312016-03-30 23:28:51 -07003322// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003323TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3324 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3325 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3326 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003327 {
ossuc54071d2016-08-17 02:45:41 -07003328 cricket::WebRtcVoiceEngine engine(
3329 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003330 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003331 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003332 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003333 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3334 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3335 EXPECT_TRUE(channel != nullptr);
3336 delete channel;
3337 }
stefan658910c2015-09-03 05:48:32 -07003338}
3339
3340// Tests that the library is configured with the codecs we want.
3341TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003342 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3343 // module.
3344
stefan658910c2015-09-03 05:48:32 -07003345 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003346 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003347 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003348 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003349 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003350 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003351 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003352 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003353 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003354 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003355 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003356 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003357 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003358 cricket::AudioCodec(96, "PCMU", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003359 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003360 cricket::AudioCodec(96, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003361 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003362 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003363 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003364 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003365 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003366 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003367 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003368 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003369 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003370 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003371 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003372 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003373 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003374 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003375 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003376 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003377 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003378 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003379 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003380 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003381 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003382 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003383 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003384 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003385 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003386 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003387 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003388 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003389 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003390 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003391 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003392 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003393 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003394
stefan658910c2015-09-03 05:48:32 -07003395 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003396 // TODO(ossu): Why are the payload types of codecs with non-static payload
3397 // type assignments checked here? It shouldn't really matter.
3398 cricket::WebRtcVoiceEngine engine(
3399 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
stefan658910c2015-09-03 05:48:32 -07003400 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossuc54071d2016-08-17 02:45:41 -07003401 engine.send_codecs().begin();
3402 it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003403 if (it->name == "CN" && it->clockrate == 16000) {
3404 EXPECT_EQ(105, it->id);
3405 } else if (it->name == "CN" && it->clockrate == 32000) {
3406 EXPECT_EQ(106, it->id);
3407 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3408 EXPECT_EQ(103, it->id);
3409 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3410 EXPECT_EQ(104, it->id);
3411 } else if (it->name == "G722" && it->clockrate == 8000) {
3412 EXPECT_EQ(9, it->id);
3413 } else if (it->name == "telephone-event") {
3414 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003415 } else if (it->name == "opus") {
3416 EXPECT_EQ(111, it->id);
3417 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3418 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003419 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3420 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3421 }
3422 }
stefan658910c2015-09-03 05:48:32 -07003423}
3424
3425// Tests that VoE supports at least 32 channels
3426TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003427 cricket::WebRtcVoiceEngine engine(
3428 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003429 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003430 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003431 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003432
3433 cricket::VoiceMediaChannel* channels[32];
3434 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003435 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003436 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3437 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003438 if (!channel)
3439 break;
stefan658910c2015-09-03 05:48:32 -07003440 channels[num_channels++] = channel;
3441 }
3442
tfarina5237aaf2015-11-10 23:44:30 -08003443 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003444 EXPECT_EQ(expected, num_channels);
3445
3446 while (num_channels > 0) {
3447 delete channels[--num_channels];
3448 }
stefan658910c2015-09-03 05:48:32 -07003449}
3450
3451// Test that we set our preferred codecs properly.
3452TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003453 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3454 // - Check that our builtin codecs are usable by Channel.
3455 // - The codecs provided by the engine is usable by Channel.
3456 // It does not check that the codecs in the RecvParameters are actually
3457 // what we sent in - though it's probably reasonable to expect so, if
3458 // SetRecvParameters returns true.
3459 // I think it will become clear once audio decoder injection is completed.
3460 cricket::WebRtcVoiceEngine engine(
3461 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003462 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003463 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003464 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003465 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3466 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003467 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003468 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003469 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003470}