blob: 43142ea367b32a49875ec7966eaae6d5d46f495d [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);
solenberg2779bab2016-11-17 04:45:19 -080045const cricket::AudioCodec
46 kTelephoneEventCodec1(106, "telephone-event", 8000, 0, 1);
47const cricket::AudioCodec
48 kTelephoneEventCodec2(107, "telephone-event", 32000, 0, 1);
49
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;
solenberg7602aab2016-11-14 11:30:07 -080053const uint32_t kSsrc4 = 0x42;
solenberg85a04962015-10-27 03:35:21 -070054const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055
solenberg971cab02016-06-14 10:02:41 -070056constexpr int kRtpHistoryMs = 5000;
57
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058class FakeVoEWrapper : public cricket::VoEWrapper {
59 public:
60 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
61 : cricket::VoEWrapper(engine, // processing
62 engine, // base
63 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065 engine) { // volume
66 }
67};
skvlad11a9cbf2016-10-07 11:53:05 -070068
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020069} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070
solenbergff976312016-03-30 23:28:51 -070071// Tests that our stub library "works".
72TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070073 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
74 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
75 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070076 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
77 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
78 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -070079 StrictMock<webrtc::test::MockAudioProcessing> apm;
80 EXPECT_CALL(apm, ApplyConfig(testing::_));
81 EXPECT_CALL(apm, SetExtraOptions(testing::_));
82 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0));
83 cricket::FakeWebRtcVoiceEngine voe(&apm);
solenbergff976312016-03-30 23:28:51 -070084 EXPECT_FALSE(voe.IsInited());
85 {
ossuc54071d2016-08-17 02:45:41 -070086 cricket::WebRtcVoiceEngine engine(
87 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(),
88 new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070089 EXPECT_TRUE(voe.IsInited());
90 }
91 EXPECT_FALSE(voe.IsInited());
92}
93
deadbeef884f5852016-01-15 09:20:04 -080094class FakeAudioSink : public webrtc::AudioSinkInterface {
95 public:
96 void OnData(const Data& audio) override {}
97};
98
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080099class FakeAudioSource : public cricket::AudioSource {
100 void SetSink(Sink* sink) override {}
101};
102
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103class WebRtcVoiceEngineTestFake : public testing::Test {
104 public:
stefanba4c0e42016-02-04 04:12:24 -0800105 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
106
107 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenberg059fb442016-10-26 05:12:24 -0700108 : call_(webrtc::Call::Config(&event_log_)), voe_(&apm_),
skvlad11a9cbf2016-10-07 11:53:05 -0700109 override_field_trials_(field_trials) {
ossuc54071d2016-08-17 02:45:41 -0700110 auto factory = webrtc::MockAudioDecoderFactory::CreateUnusedFactory();
solenbergbc37fc82016-04-04 09:54:44 -0700111 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
112 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700113 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
114 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
115 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -0700116 EXPECT_CALL(apm_, ApplyConfig(testing::_));
117 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
118 EXPECT_CALL(apm_, Initialize()).WillOnce(Return(0));
ossuc54071d2016-08-17 02:45:41 -0700119 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory,
solenbergbc37fc82016-04-04 09:54:44 -0700120 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200121 send_parameters_.codecs.push_back(kPcmuCodec);
122 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
solenberg8189b022016-06-14 12:13:00 -0700124
solenbergff976312016-03-30 23:28:51 -0700125 bool SetupChannel() {
solenberg059fb442016-10-26 05:12:24 -0700126 EXPECT_CALL(apm_, ApplyConfig(testing::_));
127 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergbc37fc82016-04-04 09:54:44 -0700128 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
129 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200130 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000131 }
solenberg8189b022016-06-14 12:13:00 -0700132
solenbergff976312016-03-30 23:28:51 -0700133 bool SetupRecvStream() {
134 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700135 return false;
136 }
solenberg8189b022016-06-14 12:13:00 -0700137 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700138 }
solenberg8189b022016-06-14 12:13:00 -0700139
solenbergff976312016-03-30 23:28:51 -0700140 bool SetupSendStream() {
141 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000142 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800144 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
145 return false;
146 }
solenberg059fb442016-10-26 05:12:24 -0700147 EXPECT_CALL(apm_, set_output_will_be_muted(false));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800148 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 }
solenberg8189b022016-06-14 12:13:00 -0700150
151 bool AddRecvStream(uint32_t ssrc) {
152 EXPECT_TRUE(channel_);
153 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
154 }
155
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000156 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700157 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700158 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800159 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700160 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700161 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800162 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000163 }
solenberg8189b022016-06-14 12:13:00 -0700164
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700166 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000167 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 }
solenberg8189b022016-06-14 12:13:00 -0700169
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200170 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172 }
173
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100174 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
175 const auto* send_stream = call_.GetAudioSendStream(ssrc);
176 EXPECT_TRUE(send_stream);
177 return *send_stream;
178 }
179
deadbeef884f5852016-01-15 09:20:04 -0800180 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
181 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
182 EXPECT_TRUE(recv_stream);
183 return *recv_stream;
184 }
185
solenberg3a941542015-11-16 07:34:50 -0800186 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800187 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800188 }
189
solenberg7add0582015-11-20 09:59:34 -0800190 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800191 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800192 }
193
solenberg059fb442016-10-26 05:12:24 -0700194 void SetSend(bool enable) {
195 ASSERT_TRUE(channel_);
solenbergd53a3f92016-04-14 13:56:37 -0700196 if (enable) {
197 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
198 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
199 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
solenberg059fb442016-10-26 05:12:24 -0700200 EXPECT_CALL(apm_, ApplyConfig(testing::_));
201 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergd53a3f92016-04-14 13:56:37 -0700202 }
solenberg059fb442016-10-26 05:12:24 -0700203 channel_->SetSend(enable);
204 }
205
206 void SetSendParameters(const cricket::AudioSendParameters& params) {
207 EXPECT_CALL(apm_, ApplyConfig(testing::_));
208 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
209 ASSERT_TRUE(channel_);
210 EXPECT_TRUE(channel_->SetSendParameters(params));
211 }
212
minyue6b825df2016-10-31 04:08:32 -0700213 void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source,
214 const cricket::AudioOptions* options = nullptr) {
solenberg059fb442016-10-26 05:12:24 -0700215 EXPECT_CALL(apm_, set_output_will_be_muted(!enable));
216 ASSERT_TRUE(channel_);
minyue6b825df2016-10-31 04:08:32 -0700217 if (enable && options) {
218 EXPECT_CALL(apm_, ApplyConfig(testing::_));
219 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
220 }
221 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source));
solenbergd53a3f92016-04-14 13:56:37 -0700222 }
223
solenbergffbbcac2016-11-17 05:25:37 -0800224 void TestInsertDtmf(uint32_t ssrc, bool caller,
225 const cricket::AudioCodec& codec) {
solenbergff976312016-03-30 23:28:51 -0700226 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000227 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700228 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000229 // send stream.
230 EXPECT_TRUE(channel_->AddSendStream(
231 cricket::StreamParams::CreateLegacy(kSsrc1)));
232 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000233
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 // Test we can only InsertDtmf when the other side supports telephone-event.
solenberg059fb442016-10-26 05:12:24 -0700235 SetSendParameters(send_parameters_);
236 SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000237 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800238 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
solenbergffbbcac2016-11-17 05:25:37 -0800239 send_parameters_.codecs.push_back(codec);
solenberg059fb442016-10-26 05:12:24 -0700240 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000242
243 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700244 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800245 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000246 EXPECT_TRUE(channel_->AddSendStream(
247 cricket::StreamParams::CreateLegacy(kSsrc1)));
248 }
249
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000250 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800251 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000252
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100253 // Test send.
254 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
255 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
256 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800257 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100258 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
solenbergffbbcac2016-11-17 05:25:37 -0800259 EXPECT_EQ(codec.id, telephone_event.payload_type);
260 EXPECT_EQ(codec.clockrate, telephone_event.payload_frequency);
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100261 EXPECT_EQ(2, telephone_event.event_code);
262 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263 }
264
265 // Test that send bandwidth is set correctly.
266 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000267 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
268 // |expected_result| is the expected result from SetMaxSendBandwidth().
269 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700270 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
271 int max_bitrate,
272 bool expected_result,
273 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200274 cricket::AudioSendParameters parameters;
275 parameters.codecs.push_back(codec);
276 parameters.max_bandwidth_bps = max_bitrate;
solenberg059fb442016-10-26 05:12:24 -0700277 if (expected_result) {
278 SetSendParameters(parameters);
279 } else {
280 EXPECT_FALSE(channel_->SetSendParameters(parameters));
281 }
minyue7a973442016-10-20 03:27:12 -0700282 EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000283 }
284
skvlade0d46372016-04-07 22:59:22 -0700285 // Sets the per-stream maximum bitrate limit for the specified SSRC.
286 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700287 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700288 EXPECT_EQ(1UL, parameters.encodings.size());
289
290 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700291 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700292 }
293
solenberg059fb442016-10-26 05:12:24 -0700294 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
skvlade0d46372016-04-07 22:59:22 -0700295 cricket::AudioSendParameters send_parameters;
296 send_parameters.codecs.push_back(codec);
297 send_parameters.max_bandwidth_bps = bitrate;
solenberg059fb442016-10-26 05:12:24 -0700298 SetSendParameters(send_parameters);
skvlade0d46372016-04-07 22:59:22 -0700299 }
300
minyue7a973442016-10-20 03:27:12 -0700301 void CheckSendCodec(int32_t ssrc,
302 const char expected_name[],
303 int expected_channels,
304 int expected_bitrate) {
305 const auto& codec = GetSendStreamConfig(ssrc).send_codec_spec.codec_inst;
306 EXPECT_STREQ(expected_name, codec.plname);
307 EXPECT_EQ(expected_channels, codec.channels);
308 EXPECT_EQ(expected_bitrate, codec.rate);
309 }
310
311 int GetOpusMaxPlaybackRate(int32_t ssrc) {
312 return GetSendStreamConfig(ssrc).send_codec_spec.opus_max_playback_rate;
313 }
314
315 bool GetOpusDtx(int32_t ssrc) {
316 return GetSendStreamConfig(ssrc).send_codec_spec.enable_opus_dtx;
317 }
318
319 bool GetCodecFec(int32_t ssrc) {
320 return GetSendStreamConfig(ssrc).send_codec_spec.enable_codec_fec;
321 }
322
skvlade0d46372016-04-07 22:59:22 -0700323 int GetCodecBitrate(int32_t ssrc) {
minyue7a973442016-10-20 03:27:12 -0700324 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.rate;
325 }
326
327 int GetCodecPacSize(int32_t ssrc) {
328 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.pacsize;
skvlade0d46372016-04-07 22:59:22 -0700329 }
330
minyue6b825df2016-10-31 04:08:32 -0700331 const rtc::Optional<std::string>& GetAudioNetworkAdaptorConfig(int32_t ssrc) {
332 return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
333 }
334
skvlade0d46372016-04-07 22:59:22 -0700335 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
336 int global_max,
337 int stream_max,
338 bool expected_result,
339 int expected_codec_bitrate) {
340 // Clear the bitrate limit from the previous test case.
341 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
342
343 // Attempt to set the requested bitrate limits.
solenberg059fb442016-10-26 05:12:24 -0700344 SetGlobalMaxBitrate(codec, global_max);
skvlade0d46372016-04-07 22:59:22 -0700345 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
346
347 // Verify that reading back the parameters gives results
348 // consistent with the Set() result.
349 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700350 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700351 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
352 EXPECT_EQ(expected_result ? stream_max : -1,
353 resulting_parameters.encodings[0].max_bitrate_bps);
354
355 // Verify that the codec settings have the expected bitrate.
356 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
357 }
358
stefan13f1a0a2016-11-30 07:22:58 -0800359 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
360 int expected_min_bitrate_bps,
361 const char* start_bitrate_kbps,
362 int expected_start_bitrate_bps,
363 const char* max_bitrate_kbps,
364 int expected_max_bitrate_bps) {
365 EXPECT_TRUE(SetupSendStream());
366 auto& codecs = send_parameters_.codecs;
367 codecs.clear();
368 codecs.push_back(kOpusCodec);
369 codecs[0].params[cricket::kCodecParamMinBitrate] = min_bitrate_kbps;
370 codecs[0].params[cricket::kCodecParamStartBitrate] = start_bitrate_kbps;
371 codecs[0].params[cricket::kCodecParamMaxBitrate] = max_bitrate_kbps;
372 SetSendParameters(send_parameters_);
373
374 EXPECT_EQ(expected_min_bitrate_bps,
375 call_.GetConfig().bitrate_config.min_bitrate_bps);
376 EXPECT_EQ(expected_start_bitrate_bps,
377 call_.GetConfig().bitrate_config.start_bitrate_bps);
378 EXPECT_EQ(expected_max_bitrate_bps,
379 call_.GetConfig().bitrate_config.max_bitrate_bps);
380 }
381
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000382 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700383 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000384
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000385 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800386 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000387
388 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700389 send_parameters_.extensions.push_back(
390 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg059fb442016-10-26 05:12:24 -0700391 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800392 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000393
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000394 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200395 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700396 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800397 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000398
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000399 // Ensure extension is set properly.
400 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700401 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg059fb442016-10-26 05:12:24 -0700402 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800403 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700404 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800405 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000406
solenberg7add0582015-11-20 09:59:34 -0800407 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000408 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700409 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800410 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
411 call_.GetAudioSendStream(kSsrc2));
412 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700413 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800414 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000415
416 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200417 send_parameters_.codecs.push_back(kPcmuCodec);
418 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700419 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800420 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
421 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000422 }
423
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000424 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700425 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000426
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000427 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800428 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000429
430 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700431 recv_parameters_.extensions.push_back(
432 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800433 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
434 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000435
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000436 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800437 recv_parameters_.extensions.clear();
438 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
439 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000440
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000441 // Ensure extension is set properly.
442 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700443 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800444 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
445 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700446 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800447 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000448
solenberg7add0582015-11-20 09:59:34 -0800449 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700450 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800451 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
452 call_.GetAudioReceiveStream(kSsrc2));
453 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700454 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800455 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000456
457 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800458 recv_parameters_.extensions.clear();
459 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
460 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
461 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000462 }
463
solenberg85a04962015-10-27 03:35:21 -0700464 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
465 webrtc::AudioSendStream::Stats stats;
466 stats.local_ssrc = 12;
467 stats.bytes_sent = 345;
468 stats.packets_sent = 678;
469 stats.packets_lost = 9012;
470 stats.fraction_lost = 34.56f;
471 stats.codec_name = "codec_name_send";
hbos1acfbd22016-11-17 23:43:29 -0800472 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700473 stats.ext_seqnum = 789;
474 stats.jitter_ms = 12;
475 stats.rtt_ms = 345;
476 stats.audio_level = 678;
477 stats.aec_quality_min = 9.01f;
478 stats.echo_delay_median_ms = 234;
479 stats.echo_delay_std_ms = 567;
480 stats.echo_return_loss = 890;
481 stats.echo_return_loss_enhancement = 1234;
ivoc8c63a822016-10-21 04:10:03 -0700482 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700483 stats.typing_noise_detected = true;
484 return stats;
485 }
486 void SetAudioSendStreamStats() {
487 for (auto* s : call_.GetAudioSendStreams()) {
488 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200489 }
solenberg85a04962015-10-27 03:35:21 -0700490 }
solenberg566ef242015-11-06 15:34:49 -0800491 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
492 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700493 const auto stats = GetAudioSendStreamStats();
494 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
495 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
496 EXPECT_EQ(info.packets_sent, stats.packets_sent);
497 EXPECT_EQ(info.packets_lost, stats.packets_lost);
498 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
499 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800500 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700501 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
502 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
503 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
504 EXPECT_EQ(info.audio_level, stats.audio_level);
505 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
506 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
507 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
508 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
509 EXPECT_EQ(info.echo_return_loss_enhancement,
510 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700511 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800512 EXPECT_EQ(info.typing_noise_detected,
513 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700514 }
515
516 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
517 webrtc::AudioReceiveStream::Stats stats;
518 stats.remote_ssrc = 123;
519 stats.bytes_rcvd = 456;
520 stats.packets_rcvd = 768;
521 stats.packets_lost = 101;
522 stats.fraction_lost = 23.45f;
523 stats.codec_name = "codec_name_recv";
hbos1acfbd22016-11-17 23:43:29 -0800524 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700525 stats.ext_seqnum = 678;
526 stats.jitter_ms = 901;
527 stats.jitter_buffer_ms = 234;
528 stats.jitter_buffer_preferred_ms = 567;
529 stats.delay_estimate_ms = 890;
530 stats.audio_level = 1234;
531 stats.expand_rate = 5.67f;
532 stats.speech_expand_rate = 8.90f;
533 stats.secondary_decoded_rate = 1.23f;
534 stats.accelerate_rate = 4.56f;
535 stats.preemptive_expand_rate = 7.89f;
536 stats.decoding_calls_to_silence_generator = 12;
537 stats.decoding_calls_to_neteq = 345;
538 stats.decoding_normal = 67890;
539 stats.decoding_plc = 1234;
540 stats.decoding_cng = 5678;
541 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700542 stats.decoding_muted_output = 3456;
543 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200544 return stats;
545 }
546 void SetAudioReceiveStreamStats() {
547 for (auto* s : call_.GetAudioReceiveStreams()) {
548 s->SetStats(GetAudioReceiveStreamStats());
549 }
550 }
551 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700552 const auto stats = GetAudioReceiveStreamStats();
553 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
554 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
555 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
556 EXPECT_EQ(info.packets_lost, stats.packets_lost);
557 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
558 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800559 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700560 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
561 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
562 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200563 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700564 stats.jitter_buffer_preferred_ms);
565 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
566 EXPECT_EQ(info.audio_level, stats.audio_level);
567 EXPECT_EQ(info.expand_rate, stats.expand_rate);
568 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
569 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
570 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
571 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200572 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700573 stats.decoding_calls_to_silence_generator);
574 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
575 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
576 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
577 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
578 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700579 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700580 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200581 }
hbos1acfbd22016-11-17 23:43:29 -0800582 void VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo& info) const {
583 EXPECT_EQ(send_parameters_.codecs.size(), info.send_codecs.size());
584 for (const cricket::AudioCodec& codec : send_parameters_.codecs) {
585 ASSERT_EQ(info.send_codecs.count(codec.id), 1U);
586 EXPECT_EQ(info.send_codecs.find(codec.id)->second,
587 codec.ToCodecParameters());
588 }
589 EXPECT_EQ(recv_parameters_.codecs.size(), info.receive_codecs.size());
590 for (const cricket::AudioCodec& codec : recv_parameters_.codecs) {
591 ASSERT_EQ(info.receive_codecs.count(codec.id), 1U);
592 EXPECT_EQ(info.receive_codecs.find(codec.id)->second,
593 codec.ToCodecParameters());
594 }
595 }
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200596
peah8271d042016-11-22 07:24:52 -0800597 bool IsHighPassFilterEnabled() {
598 return engine_->GetApmConfigForTest().high_pass_filter.enabled;
599 }
600
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700602 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700603 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700604 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200605 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000606 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700607 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700608 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200609 cricket::AudioSendParameters send_parameters_;
610 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800611 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800612 private:
613 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614};
615
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616// Tests that we can create and destroy a channel.
617TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700618 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619}
620
solenberg31fec402016-05-06 02:13:12 -0700621// Test that we can add a send stream and that it has the correct defaults.
622TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
623 EXPECT_TRUE(SetupChannel());
624 EXPECT_TRUE(
625 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
626 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
627 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
628 EXPECT_EQ("", config.rtp.c_name);
629 EXPECT_EQ(0u, config.rtp.extensions.size());
630 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
631 config.send_transport);
632}
633
634// Test that we can add a receive stream and that it has the correct defaults.
635TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
636 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700637 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700638 const webrtc::AudioReceiveStream::Config& config =
639 GetRecvStreamConfig(kSsrc1);
640 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
641 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
642 EXPECT_FALSE(config.rtp.transport_cc);
643 EXPECT_EQ(0u, config.rtp.extensions.size());
644 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
645 config.rtcp_send_transport);
646 EXPECT_EQ("", config.sync_group);
647}
648
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700650// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700651// TODO(ossu): This test should move into a separate builtin audio codecs
652// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700653TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700654 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 ASSERT_FALSE(codecs.empty());
656 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
657 EXPECT_EQ(48000, codecs[0].clockrate);
658 EXPECT_EQ(2, codecs[0].channels);
659 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660}
661
stefanba4c0e42016-02-04 04:12:24 -0800662TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700663 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800664 bool opus_found = false;
665 for (cricket::AudioCodec codec : codecs) {
666 if (codec.name == "opus") {
667 EXPECT_TRUE(HasTransportCc(codec));
668 opus_found = true;
669 }
670 }
671 EXPECT_TRUE(opus_found);
672}
673
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674// Tests that we can find codecs by name or id, and that we interpret the
675// clockrate and bitrate fields properly.
676TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
677 cricket::AudioCodec codec;
678 webrtc::CodecInst codec_inst;
679 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800680 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800682 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg2779bab2016-11-17 04:45:19 -0800684 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec1,
685 &codec_inst));
686 // Find telephone-event with explicit clockrate and 0 bitrate.
687 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec2,
solenberg26c8c912015-11-27 04:00:25 -0800688 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 // Find ISAC with a different payload id.
690 codec = kIsacCodec;
691 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800692 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693 EXPECT_EQ(codec.id, codec_inst.pltype);
694 // Find PCMU with a 0 clockrate.
695 codec = kPcmuCodec;
696 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800697 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698 EXPECT_EQ(codec.id, codec_inst.pltype);
699 EXPECT_EQ(8000, codec_inst.plfreq);
700 // Find PCMU with a 0 bitrate.
701 codec = kPcmuCodec;
702 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800703 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 EXPECT_EQ(codec.id, codec_inst.pltype);
705 EXPECT_EQ(64000, codec_inst.rate);
706 // Find ISAC with an explicit bitrate.
707 codec = kIsacCodec;
708 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800709 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_EQ(codec.id, codec_inst.pltype);
711 EXPECT_EQ(32000, codec_inst.rate);
712}
713
714// Test that we set our inbound codecs properly, including changing PT.
715TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700716 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200717 cricket::AudioRecvParameters parameters;
718 parameters.codecs.push_back(kIsacCodec);
719 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800720 parameters.codecs.push_back(kTelephoneEventCodec1);
721 parameters.codecs.push_back(kTelephoneEventCodec2);
722 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200723 parameters.codecs[2].id = 126;
724 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700725 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700726 int channel_num = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800727
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800729 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 gcodec.plfreq = 16000;
731 gcodec.channels = 1;
732 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
733 EXPECT_EQ(106, gcodec.pltype);
734 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800735
tfarina5237aaf2015-11-10 23:44:30 -0800736 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 gcodec.plfreq = 8000;
738 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
739 EXPECT_EQ(126, gcodec.pltype);
740 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800741
742 gcodec.plfreq = 32000;
743 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
744 EXPECT_EQ(107, gcodec.pltype);
745 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746}
747
748// Test that we fail to set an unknown inbound codec.
749TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700750 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200751 cricket::AudioRecvParameters parameters;
752 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700753 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755}
756
757// Test that we fail if we have duplicate types in the inbound list.
758TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700759 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200760 cricket::AudioRecvParameters parameters;
761 parameters.codecs.push_back(kIsacCodec);
762 parameters.codecs.push_back(kCn16000Codec);
763 parameters.codecs[1].id = kIsacCodec.id;
764 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765}
766
767// Test that we can decode OPUS without stereo parameters.
768TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700769 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200770 cricket::AudioRecvParameters parameters;
771 parameters.codecs.push_back(kIsacCodec);
772 parameters.codecs.push_back(kPcmuCodec);
773 parameters.codecs.push_back(kOpusCodec);
774 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700775 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700776 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800778 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 // Even without stereo parameters, recv codecs still specify channels = 2.
780 EXPECT_EQ(2, opus.channels);
781 EXPECT_EQ(111, opus.pltype);
782 EXPECT_STREQ("opus", opus.plname);
783 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700784 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 EXPECT_EQ(111, opus.pltype);
786}
787
788// Test that we can decode OPUS with stereo = 0.
789TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700790 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200791 cricket::AudioRecvParameters parameters;
792 parameters.codecs.push_back(kIsacCodec);
793 parameters.codecs.push_back(kPcmuCodec);
794 parameters.codecs.push_back(kOpusCodec);
795 parameters.codecs[2].params["stereo"] = "0";
796 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700797 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798 int channel_num2 = voe_.GetLastChannel();
799 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800800 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 // Even when stereo is off, recv codecs still specify channels = 2.
802 EXPECT_EQ(2, opus.channels);
803 EXPECT_EQ(111, opus.pltype);
804 EXPECT_STREQ("opus", opus.plname);
805 opus.pltype = 0;
806 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
807 EXPECT_EQ(111, opus.pltype);
808}
809
810// Test that we can decode OPUS with stereo = 1.
811TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700812 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 cricket::AudioRecvParameters parameters;
814 parameters.codecs.push_back(kIsacCodec);
815 parameters.codecs.push_back(kPcmuCodec);
816 parameters.codecs.push_back(kOpusCodec);
817 parameters.codecs[2].params["stereo"] = "1";
818 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700819 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820 int channel_num2 = voe_.GetLastChannel();
821 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800822 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823 EXPECT_EQ(2, opus.channels);
824 EXPECT_EQ(111, opus.pltype);
825 EXPECT_STREQ("opus", opus.plname);
826 opus.pltype = 0;
827 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
828 EXPECT_EQ(111, opus.pltype);
829}
830
831// Test that changes to recv codecs are applied to all streams.
832TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700833 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200834 cricket::AudioRecvParameters parameters;
835 parameters.codecs.push_back(kIsacCodec);
836 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800837 parameters.codecs.push_back(kTelephoneEventCodec1);
838 parameters.codecs.push_back(kTelephoneEventCodec2);
839 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200840 parameters.codecs[2].id = 126;
841 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700842 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843 int channel_num2 = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800844
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800846 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847 gcodec.plfreq = 16000;
848 gcodec.channels = 1;
849 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
850 EXPECT_EQ(106, gcodec.pltype);
851 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800852
tfarina5237aaf2015-11-10 23:44:30 -0800853 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000854 gcodec.plfreq = 8000;
855 gcodec.channels = 1;
856 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
857 EXPECT_EQ(126, gcodec.pltype);
858 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800859
860 gcodec.plfreq = 32000;
861 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
862 EXPECT_EQ(107, gcodec.pltype);
863 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864}
865
866TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700867 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200868 cricket::AudioRecvParameters parameters;
869 parameters.codecs.push_back(kIsacCodec);
solenberg2779bab2016-11-17 04:45:19 -0800870 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200871 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872
873 int channel_num2 = voe_.GetLastChannel();
874 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800875 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 gcodec.plfreq = 16000;
877 gcodec.channels = 1;
878 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
879 EXPECT_EQ(106, gcodec.pltype);
880 EXPECT_STREQ("ISAC", gcodec.plname);
881}
882
883// Test that we can apply the same set of codecs again while playing.
884TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700885 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200886 cricket::AudioRecvParameters parameters;
887 parameters.codecs.push_back(kIsacCodec);
888 parameters.codecs.push_back(kCn16000Codec);
889 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700890 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200891 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892
893 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200894 parameters.codecs[0].id = 127;
895 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700896 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897}
898
899// Test that we can add a codec while playing.
900TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700901 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200902 cricket::AudioRecvParameters parameters;
903 parameters.codecs.push_back(kIsacCodec);
904 parameters.codecs.push_back(kCn16000Codec);
905 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700906 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000907
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200908 parameters.codecs.push_back(kOpusCodec);
909 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700910 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000911 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800912 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
914}
915
916TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700917 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000919 // Test that when autobw is enabled, bitrate is kept as the default
920 // value. autobw is enabled for the following tests because the target
921 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922
923 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700924 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925
926 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700927 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700930 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000931}
932
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000933TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700934 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000936 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000937
938 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700939 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
940 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
941 // Rates above the max (56000) should be capped.
942 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700945 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
946 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
947 // Rates above the max (510000) should be capped.
948 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949}
950
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000951TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700952 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000953
954 // Test that we can only set a maximum bitrate for a fixed-rate codec
955 // if it's bigger than the fixed rate.
956
957 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700958 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
959 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
960 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
961 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
962 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
963 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
964 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000965}
966
967TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700968 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200969 const int kDesiredBitrate = 128000;
970 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700971 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200972 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700973 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000974
975 EXPECT_TRUE(channel_->AddSendStream(
976 cricket::StreamParams::CreateLegacy(kSsrc1)));
977
minyue7a973442016-10-20 03:27:12 -0700978 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000979}
980
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981// Test that bitrate cannot be set for CBR codecs.
982// Bitrate is ignored if it is higher than the fixed bitrate.
983// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000984TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700985 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986
987 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700988 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700989 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200990
991 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700992 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700993 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200994
995 send_parameters_.max_bandwidth_bps = 128;
996 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700997 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998}
999
skvlade0d46372016-04-07 22:59:22 -07001000// Test that the per-stream bitrate limit and the global
1001// bitrate limit both apply.
1002TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
1003 EXPECT_TRUE(SetupSendStream());
1004
1005 // opus, default bitrate == 64000.
1006 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
1007 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
1008 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
1009 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
1010
1011 // CBR codecs allow both maximums to exceed the bitrate.
1012 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
1013 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
1014 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
1015 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
1016
1017 // CBR codecs don't allow per stream maximums to be too low.
1018 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
1019 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
1020}
1021
1022// Test that an attempt to set RtpParameters for a stream that does not exist
1023// fails.
1024TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
1025 EXPECT_TRUE(SetupChannel());
1026 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001027 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -07001028 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
1029
1030 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001031 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -07001032}
1033
1034TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001035 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -07001036 // This test verifies that setting RtpParameters succeeds only if
1037 // the structure contains exactly one encoding.
1038 // TODO(skvlad): Update this test when we start supporting setting parameters
1039 // for each encoding individually.
1040
1041 EXPECT_TRUE(SetupSendStream());
1042 // Setting RtpParameters with no encoding is expected to fail.
1043 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001044 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001045 // Setting RtpParameters with exactly one encoding should succeed.
1046 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001047 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001048 // Two or more encodings should result in failure.
1049 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001050 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001051}
1052
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001053// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001054// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001055TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1056 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07001057 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001058 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1059 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001060 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001061 ASSERT_EQ(1u, parameters.encodings.size());
1062 ASSERT_TRUE(parameters.encodings[0].active);
1063 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001064 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001065 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
1066
1067 // Now change it back to active and verify we resume sending.
1068 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001069 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001070 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1071}
1072
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001073// Test that SetRtpSendParameters configures the correct encoding channel for
1074// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001075TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1076 SetupForMultiSendStream();
1077 // Create send streams.
1078 for (uint32_t ssrc : kSsrcs4) {
1079 EXPECT_TRUE(
1080 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1081 }
1082 // Configure one stream to be limited by the stream config, another to be
1083 // limited by the global max, and the third one with no per-stream limit
1084 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001085 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001086 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1087 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1088 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1089
1090 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1091 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1092 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1093
1094 // Remove the global cap; the streams should switch to their respective
1095 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001096 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001097 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1098 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1099 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1100}
1101
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001102// Test that GetRtpSendParameters returns the currently configured codecs.
1103TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001104 EXPECT_TRUE(SetupSendStream());
1105 cricket::AudioSendParameters parameters;
1106 parameters.codecs.push_back(kIsacCodec);
1107 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001108 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001109
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001110 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001111 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001112 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1113 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001114}
1115
1116// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001117TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001118 EXPECT_TRUE(SetupSendStream());
1119 cricket::AudioSendParameters parameters;
1120 parameters.codecs.push_back(kIsacCodec);
1121 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001122 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001123
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001124 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001125
1126 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001127 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001128
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001129 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1130 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1131 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1132}
1133
1134// Test that GetRtpReceiveParameters returns the currently configured codecs.
1135TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1136 EXPECT_TRUE(SetupRecvStream());
1137 cricket::AudioRecvParameters parameters;
1138 parameters.codecs.push_back(kIsacCodec);
1139 parameters.codecs.push_back(kPcmuCodec);
1140 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1141
1142 webrtc::RtpParameters rtp_parameters =
1143 channel_->GetRtpReceiveParameters(kSsrc1);
1144 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1145 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1146 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1147}
1148
1149// Test that if we set/get parameters multiple times, we get the same results.
1150TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1151 EXPECT_TRUE(SetupRecvStream());
1152 cricket::AudioRecvParameters parameters;
1153 parameters.codecs.push_back(kIsacCodec);
1154 parameters.codecs.push_back(kPcmuCodec);
1155 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1156
1157 webrtc::RtpParameters initial_params =
1158 channel_->GetRtpReceiveParameters(kSsrc1);
1159
1160 // We should be able to set the params we just got.
1161 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1162
1163 // ... And this shouldn't change the params returned by
1164 // GetRtpReceiveParameters.
1165 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1166 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001167}
1168
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169// Test that we apply codecs properly.
1170TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001171 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001172 cricket::AudioSendParameters parameters;
1173 parameters.codecs.push_back(kIsacCodec);
1174 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001175 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001176 parameters.codecs[0].id = 96;
1177 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001178 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001179 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001180 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1181 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1182 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1183 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1184 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1185 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1186 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1187 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001188 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189}
1190
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001191// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1192// to apply.
1193TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001194 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001195 cricket::AudioSendParameters parameters;
1196 parameters.codecs.push_back(kIsacCodec);
1197 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001198 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001199 parameters.codecs[0].id = 96;
1200 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001201 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001202 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001203 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001204 // Calling SetSendCodec again with same codec which is already set.
1205 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001206 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001207 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001208}
1209
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001210// Verify that G722 is set with 16000 samples per second to WebRTC.
1211TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
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(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001215 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001216 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001217 EXPECT_STREQ("G722", gcodec.plname);
1218 EXPECT_EQ(1, gcodec.channels);
1219 EXPECT_EQ(16000, gcodec.plfreq);
1220}
1221
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001222// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001223TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001224 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 cricket::AudioSendParameters parameters;
1226 parameters.codecs.push_back(kOpusCodec);
1227 parameters.codecs[0].bitrate = 0;
1228 parameters.codecs[0].clockrate = 50000;
1229 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001230}
1231
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001232// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001233TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001234 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001235 cricket::AudioSendParameters parameters;
1236 parameters.codecs.push_back(kOpusCodec);
1237 parameters.codecs[0].bitrate = 0;
1238 parameters.codecs[0].channels = 0;
1239 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240}
1241
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001242// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001243TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001244 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001245 cricket::AudioSendParameters parameters;
1246 parameters.codecs.push_back(kOpusCodec);
1247 parameters.codecs[0].bitrate = 0;
1248 parameters.codecs[0].channels = 0;
1249 parameters.codecs[0].params["stereo"] = "1";
1250 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251}
1252
1253// Test that if channel is 1 for opus and there's no stereo, we fail.
1254TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001255 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001256 cricket::AudioSendParameters parameters;
1257 parameters.codecs.push_back(kOpusCodec);
1258 parameters.codecs[0].bitrate = 0;
1259 parameters.codecs[0].channels = 1;
1260 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261}
1262
1263// Test that if channel is 1 for opus and stereo=0, we fail.
1264TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001265 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001266 cricket::AudioSendParameters parameters;
1267 parameters.codecs.push_back(kOpusCodec);
1268 parameters.codecs[0].bitrate = 0;
1269 parameters.codecs[0].channels = 1;
1270 parameters.codecs[0].params["stereo"] = "0";
1271 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001272}
1273
1274// Test that if channel is 1 for opus and stereo=1, we fail.
1275TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001276 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 cricket::AudioSendParameters parameters;
1278 parameters.codecs.push_back(kOpusCodec);
1279 parameters.codecs[0].bitrate = 0;
1280 parameters.codecs[0].channels = 1;
1281 parameters.codecs[0].params["stereo"] = "1";
1282 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001283}
1284
1285// Test that with bitrate=0 and no stereo,
1286// channels and bitrate are 1 and 32000.
1287TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001288 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001289 cricket::AudioSendParameters parameters;
1290 parameters.codecs.push_back(kOpusCodec);
1291 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001292 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001293 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001294}
1295
1296// Test that with bitrate=0 and stereo=0,
1297// channels and bitrate are 1 and 32000.
1298TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001299 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001300 cricket::AudioSendParameters parameters;
1301 parameters.codecs.push_back(kOpusCodec);
1302 parameters.codecs[0].bitrate = 0;
1303 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001304 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001305 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001306}
1307
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001308// Test that with bitrate=invalid and stereo=0,
1309// channels and bitrate are 1 and 32000.
1310TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001311 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001312 cricket::AudioSendParameters parameters;
1313 parameters.codecs.push_back(kOpusCodec);
1314 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001315 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001316 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001317 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001318 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001319
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001320 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001321 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001322 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001323}
1324
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001325// Test that with bitrate=0 and stereo=1,
1326// channels and bitrate are 2 and 64000.
1327TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001328 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001329 cricket::AudioSendParameters parameters;
1330 parameters.codecs.push_back(kOpusCodec);
1331 parameters.codecs[0].bitrate = 0;
1332 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001333 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001334 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335}
1336
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001337// Test that with bitrate=invalid and stereo=1,
1338// channels and bitrate are 2 and 64000.
1339TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001340 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 cricket::AudioSendParameters parameters;
1342 parameters.codecs.push_back(kOpusCodec);
1343 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001344 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001345 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001346 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001347 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001348
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001349 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001350 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001351 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001352}
1353
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001354// Test that with bitrate=N and stereo unset,
1355// channels and bitrate are 1 and N.
1356TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001357 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001358 cricket::AudioSendParameters parameters;
1359 parameters.codecs.push_back(kOpusCodec);
1360 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001361 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001362 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001363 EXPECT_EQ(111, gcodec.pltype);
1364 EXPECT_EQ(96000, gcodec.rate);
1365 EXPECT_STREQ("opus", gcodec.plname);
1366 EXPECT_EQ(1, gcodec.channels);
1367 EXPECT_EQ(48000, gcodec.plfreq);
1368}
1369
1370// Test that with bitrate=N and stereo=0,
1371// channels and bitrate are 1 and N.
1372TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001373 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 cricket::AudioSendParameters parameters;
1375 parameters.codecs.push_back(kOpusCodec);
1376 parameters.codecs[0].bitrate = 30000;
1377 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001378 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001379 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001380}
1381
1382// Test that with bitrate=N and without any parameters,
1383// channels and bitrate are 1 and N.
1384TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001385 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001386 cricket::AudioSendParameters parameters;
1387 parameters.codecs.push_back(kOpusCodec);
1388 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001389 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001390 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001391}
1392
1393// Test that with bitrate=N and stereo=1,
1394// channels and bitrate are 2 and N.
1395TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001396 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].bitrate = 30000;
1400 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001401 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001402 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001403}
1404
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001405// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1406// Also test that the "maxaveragebitrate" can't be set to values outside the
1407// range of 6000 and 510000
1408TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001409 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001410 cricket::AudioSendParameters parameters;
1411 parameters.codecs.push_back(kOpusCodec);
1412 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001413 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001414 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001415 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001416 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001417
1418 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001419 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001420 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001421 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001422
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001423 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001424 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001425 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001426}
1427
stefan13f1a0a2016-11-30 07:22:58 -08001428TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
1429 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1430 200000);
1431}
1432
1433TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
1434 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1435}
1436
1437TEST_F(WebRtcVoiceEngineTestFake,
1438 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1439 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "", -1);
1440}
1441
1442TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCapsMinAndStartBitrate) {
1443 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
1444}
1445
1446TEST_F(WebRtcVoiceEngineTestFake,
1447 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1448 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1449 200000);
1450 send_parameters_.max_bandwidth_bps = 300000;
1451 SetSendParameters(send_parameters_);
1452 EXPECT_EQ(100000, call_.GetConfig().bitrate_config.min_bitrate_bps)
1453 << "Setting max bitrate should keep previous min bitrate.";
1454 EXPECT_EQ(-1, call_.GetConfig().bitrate_config.start_bitrate_bps)
1455 << "Setting max bitrate should not reset start bitrate.";
1456 EXPECT_EQ(300000, call_.GetConfig().bitrate_config.max_bitrate_bps);
1457}
1458
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001459// Test that we can enable NACK with opus as caller.
1460TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001461 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001462 cricket::AudioSendParameters parameters;
1463 parameters.codecs.push_back(kOpusCodec);
1464 parameters.codecs[0].AddFeedbackParam(
1465 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1466 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001467 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001468 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001469 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470}
1471
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001472// Test that we can enable NACK with opus as callee.
1473TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001474 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001475 cricket::AudioSendParameters parameters;
1476 parameters.codecs.push_back(kOpusCodec);
1477 parameters.codecs[0].AddFeedbackParam(
1478 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1479 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001480 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001481 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001482 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001483 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001484
1485 EXPECT_TRUE(channel_->AddSendStream(
1486 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001487 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001488}
1489
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001490// Test that we can enable NACK on receive streams.
1491TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001492 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001493 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001494 cricket::AudioSendParameters parameters;
1495 parameters.codecs.push_back(kOpusCodec);
1496 parameters.codecs[0].AddFeedbackParam(
1497 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1498 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001499 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001500 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001501 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001502 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001503 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001504}
1505
1506// Test that we can disable NACK.
1507TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001508 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001509 cricket::AudioSendParameters parameters;
1510 parameters.codecs.push_back(kOpusCodec);
1511 parameters.codecs[0].AddFeedbackParam(
1512 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1513 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001514 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001515 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001517 parameters.codecs.clear();
1518 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001519 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001520 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521}
1522
1523// Test that we can disable NACK on receive streams.
1524TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001525 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001526 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001527 cricket::AudioSendParameters parameters;
1528 parameters.codecs.push_back(kOpusCodec);
1529 parameters.codecs[0].AddFeedbackParam(
1530 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1531 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001532 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001533 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001534 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001535
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001536 parameters.codecs.clear();
1537 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001538 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001539 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001540 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541}
1542
1543// Test that NACK is enabled on a new receive stream.
1544TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001545 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 cricket::AudioSendParameters parameters;
1547 parameters.codecs.push_back(kIsacCodec);
1548 parameters.codecs.push_back(kCn16000Codec);
1549 parameters.codecs[0].AddFeedbackParam(
1550 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1551 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001552 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001553 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554
solenberg8189b022016-06-14 12:13:00 -07001555 EXPECT_TRUE(AddRecvStream(kSsrc2));
1556 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1557 EXPECT_TRUE(AddRecvStream(kSsrc3));
1558 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559}
1560
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001561// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001562TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001563 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001564 cricket::AudioSendParameters parameters;
1565 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001566 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001567 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001568}
1569
1570// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001571TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001572 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 cricket::AudioSendParameters parameters;
1574 parameters.codecs.push_back(kOpusCodec);
1575 parameters.codecs[0].bitrate = 0;
1576 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001577 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001578 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001579}
1580
1581// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001582TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001583 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001584 cricket::AudioSendParameters parameters;
1585 parameters.codecs.push_back(kOpusCodec);
1586 parameters.codecs[0].bitrate = 0;
1587 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001588 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001589 EXPECT_TRUE(GetCodecFec(kSsrc1));
1590 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001591}
1592
1593// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001594TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001595 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001596 cricket::AudioSendParameters parameters;
1597 parameters.codecs.push_back(kOpusCodec);
1598 parameters.codecs[0].bitrate = 0;
1599 parameters.codecs[0].params["stereo"] = "1";
1600 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001601 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001602 EXPECT_TRUE(GetCodecFec(kSsrc1));
1603 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001604}
1605
1606// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001607TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001608 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001609 cricket::AudioSendParameters parameters;
1610 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001611 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001612 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001613}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001614
1615// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1616TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001617 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001618 cricket::AudioSendParameters parameters;
1619 parameters.codecs.push_back(kIsacCodec);
1620 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001621 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001622 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001623}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001624
1625// Test that Opus FEC status can be changed.
1626TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001627 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001628 cricket::AudioSendParameters parameters;
1629 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001630 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001631 EXPECT_FALSE(GetCodecFec(kSsrc1));
1632
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001633 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001634 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001635 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001636}
1637
stefanba4c0e42016-02-04 04:12:24 -08001638TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001639 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001640 cricket::AudioSendParameters send_parameters;
1641 send_parameters.codecs.push_back(kOpusCodec);
1642 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001643 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001644
1645 cricket::AudioRecvParameters recv_parameters;
1646 recv_parameters.codecs.push_back(kIsacCodec);
1647 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001648 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001649 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1650 EXPECT_FALSE(
1651 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1652
ossudedfd282016-06-14 07:12:39 -07001653 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001654 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001655 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1656 EXPECT_TRUE(
1657 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1658}
1659
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001660// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1661TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001662 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001663 cricket::AudioSendParameters parameters;
1664 parameters.codecs.push_back(kOpusCodec);
1665 parameters.codecs[0].bitrate = 0;
1666 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001667 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001668 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1669 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001670
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001671 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001672 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001673 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001674}
1675
1676// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1677TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001678 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001679 cricket::AudioSendParameters parameters;
1680 parameters.codecs.push_back(kOpusCodec);
1681 parameters.codecs[0].bitrate = 0;
1682 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001683 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001684 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1685 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001686
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001687 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001688 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001689 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001690}
1691
1692// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1693TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001694 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001695 cricket::AudioSendParameters parameters;
1696 parameters.codecs.push_back(kOpusCodec);
1697 parameters.codecs[0].bitrate = 0;
1698 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001699 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001700 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1701 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001702
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001704 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001705 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001706}
1707
1708// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1709TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001710 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 cricket::AudioSendParameters parameters;
1712 parameters.codecs.push_back(kOpusCodec);
1713 parameters.codecs[0].bitrate = 0;
1714 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001715 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001716 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1717 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001718
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001719 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001720 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001721 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001722}
1723
1724// Test 24000 < maxplaybackrate triggers Opus full band mode.
1725TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001726 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001727 cricket::AudioSendParameters parameters;
1728 parameters.codecs.push_back(kOpusCodec);
1729 parameters.codecs[0].bitrate = 0;
1730 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001731 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001732 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1733 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001734
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001735 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001736 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001737 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001738}
1739
1740// Test Opus that without maxplaybackrate, default playback rate is used.
1741TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001742 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001743 cricket::AudioSendParameters parameters;
1744 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001745 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001746 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001747}
1748
1749// Test the with non-Opus, maxplaybackrate has no effect.
1750TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001751 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001752 cricket::AudioSendParameters parameters;
1753 parameters.codecs.push_back(kIsacCodec);
1754 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001755 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001756 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001757}
1758
1759// Test maxplaybackrate can be set on two streams.
1760TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001761 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001762 cricket::AudioSendParameters parameters;
1763 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001764 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001765 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001766
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001767 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001768 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001769 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001770
1771 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001772 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001773}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001774
Minyue Li7100dcd2015-03-27 05:05:59 +01001775// Test that with usedtx=0, Opus DTX is off.
1776TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001777 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001778 cricket::AudioSendParameters parameters;
1779 parameters.codecs.push_back(kOpusCodec);
1780 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001781 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001782 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001783}
1784
1785// Test that with usedtx=1, Opus DTX is on.
1786TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001787 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001788 cricket::AudioSendParameters parameters;
1789 parameters.codecs.push_back(kOpusCodec);
1790 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001791 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001792 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001793}
1794
1795// Test that usedtx=1 works with stereo Opus.
1796TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001797 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001798 cricket::AudioSendParameters parameters;
1799 parameters.codecs.push_back(kOpusCodec);
1800 parameters.codecs[0].params["usedtx"] = "1";
1801 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001802 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001803 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001804}
1805
1806// Test that usedtx=1 does not work with non Opus.
1807TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001808 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001809 cricket::AudioSendParameters parameters;
1810 parameters.codecs.push_back(kIsacCodec);
1811 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001812 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001813 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001814}
1815
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001816// Test that we can switch back and forth between Opus and ISAC with CN.
1817TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001818 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001819
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001820 cricket::AudioSendParameters opus_parameters;
1821 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001822 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001823 {
1824 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1825 EXPECT_EQ(111, gcodec.pltype);
1826 EXPECT_STREQ("opus", gcodec.plname);
1827 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001829 cricket::AudioSendParameters isac_parameters;
1830 isac_parameters.codecs.push_back(kIsacCodec);
1831 isac_parameters.codecs.push_back(kCn16000Codec);
1832 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001833 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001834 {
1835 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1836 EXPECT_EQ(103, gcodec.pltype);
1837 EXPECT_STREQ("ISAC", gcodec.plname);
1838 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839
solenberg059fb442016-10-26 05:12:24 -07001840 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001841 {
1842 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1843 EXPECT_EQ(111, gcodec.pltype);
1844 EXPECT_STREQ("opus", gcodec.plname);
1845 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001846}
1847
1848// Test that we handle various ways of specifying bitrate.
1849TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001850 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001851 cricket::AudioSendParameters parameters;
1852 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001853 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001854 {
1855 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1856 EXPECT_EQ(103, gcodec.pltype);
1857 EXPECT_STREQ("ISAC", gcodec.plname);
1858 EXPECT_EQ(32000, gcodec.rate);
1859 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001861 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001862 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001863 {
1864 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1865 EXPECT_EQ(103, gcodec.pltype);
1866 EXPECT_STREQ("ISAC", gcodec.plname);
1867 EXPECT_EQ(-1, gcodec.rate);
1868 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001869 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001870 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001871 {
1872 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1873 EXPECT_EQ(103, gcodec.pltype);
1874 EXPECT_STREQ("ISAC", gcodec.plname);
1875 EXPECT_EQ(28000, gcodec.rate);
1876 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001878 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001879 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001880 {
1881 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1882 EXPECT_EQ(0, gcodec.pltype);
1883 EXPECT_STREQ("PCMU", gcodec.plname);
1884 EXPECT_EQ(64000, gcodec.rate);
1885 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001887 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001888 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001889 {
1890 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1891 EXPECT_EQ(0, gcodec.pltype);
1892 EXPECT_STREQ("PCMU", gcodec.plname);
1893 EXPECT_EQ(64000, gcodec.rate);
1894 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001895
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 parameters.codecs[0] = kOpusCodec;
1897 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001898 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001899 {
1900 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1901 EXPECT_EQ(111, gcodec.pltype);
1902 EXPECT_STREQ("opus", gcodec.plname);
1903 EXPECT_EQ(32000, gcodec.rate);
1904 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905}
1906
Brave Yao5225dd82015-03-26 07:39:19 +08001907// Test that we could set packet size specified in kCodecParamPTime.
1908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001909 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001910 cricket::AudioSendParameters parameters;
1911 parameters.codecs.push_back(kOpusCodec);
1912 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001913 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001914 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001915
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001916 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001917 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001918 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001919
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001920 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001921 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001922 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001923
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001924 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1925 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001926 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001927 EXPECT_EQ(480, GetCodecPacSize(
1928 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001929
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001930 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1931 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001932 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001933 EXPECT_EQ(640, GetCodecPacSize(
1934 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001935}
1936
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001937// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001939 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001940 cricket::AudioSendParameters parameters;
1941 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001942}
1943
1944// Test that we can set send codecs even with telephone-event codec as the first
1945// one on the list.
1946TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001947 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001948 cricket::AudioSendParameters parameters;
solenberg2779bab2016-11-17 04:45:19 -08001949 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001950 parameters.codecs.push_back(kIsacCodec);
1951 parameters.codecs.push_back(kPcmuCodec);
1952 parameters.codecs[0].id = 98; // DTMF
1953 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001954 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001955 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001956 EXPECT_EQ(96, gcodec.pltype);
1957 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001958 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001959}
1960
solenberg31642aa2016-03-14 08:00:37 -07001961// Test that payload type range is limited for telephone-event codec.
1962TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001963 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001964 cricket::AudioSendParameters parameters;
solenbergffbbcac2016-11-17 05:25:37 -08001965 parameters.codecs.push_back(kTelephoneEventCodec2);
solenberg31642aa2016-03-14 08:00:37 -07001966 parameters.codecs.push_back(kIsacCodec);
1967 parameters.codecs[0].id = 0; // DTMF
1968 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001969 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001970 EXPECT_TRUE(channel_->CanInsertDtmf());
1971 parameters.codecs[0].id = 128; // DTMF
1972 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1973 EXPECT_FALSE(channel_->CanInsertDtmf());
1974 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001975 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001976 EXPECT_TRUE(channel_->CanInsertDtmf());
1977 parameters.codecs[0].id = -1; // DTMF
1978 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1979 EXPECT_FALSE(channel_->CanInsertDtmf());
1980}
1981
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001982// Test that we can set send codecs even with CN codec as the first
1983// one on the list.
1984TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001985 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001986 cricket::AudioSendParameters parameters;
1987 parameters.codecs.push_back(kCn16000Codec);
1988 parameters.codecs.push_back(kIsacCodec);
1989 parameters.codecs.push_back(kPcmuCodec);
1990 parameters.codecs[0].id = 98; // wideband CN
1991 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001992 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001993 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1994 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1995 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1996 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1997 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001998}
1999
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002000// Test that we set VAD and DTMF types correctly as caller.
2001TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002002 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002003 cricket::AudioSendParameters parameters;
2004 parameters.codecs.push_back(kIsacCodec);
2005 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002006 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002007 parameters.codecs.push_back(kCn16000Codec);
2008 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002009 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002010 parameters.codecs[0].id = 96;
2011 parameters.codecs[2].id = 97; // wideband CN
2012 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002013 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002014 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2015 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2016 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2017 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2018 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2019 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2020 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002021 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022}
2023
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002024// Test that we set VAD and DTMF types correctly as callee.
2025TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002026 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002027 cricket::AudioSendParameters parameters;
2028 parameters.codecs.push_back(kIsacCodec);
2029 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002030 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002031 parameters.codecs.push_back(kCn16000Codec);
2032 parameters.codecs.push_back(kCn8000Codec);
solenbergffbbcac2016-11-17 05:25:37 -08002033 parameters.codecs.push_back(kTelephoneEventCodec2);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002034 parameters.codecs[0].id = 96;
2035 parameters.codecs[2].id = 97; // wideband CN
2036 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002037 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002038 EXPECT_TRUE(channel_->AddSendStream(
2039 cricket::StreamParams::CreateLegacy(kSsrc1)));
2040
minyue7a973442016-10-20 03:27:12 -07002041 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2042 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2043 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2044 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2045 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2046 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2047 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002048 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002049}
2050
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051// Test that we only apply VAD if we have a CN codec that matches the
2052// send codec clockrate.
2053TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002054 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002055 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002056 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002057 parameters.codecs.push_back(kIsacCodec);
2058 parameters.codecs.push_back(kCn16000Codec);
2059 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002060 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002061 {
2062 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2063 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2064 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2065 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2066 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2067 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2068 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002069 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002070 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002071 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002072 {
2073 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2074 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2075 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2076 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002077 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002078 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07002079 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002080 {
2081 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2082 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2083 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2084 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2085 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2086 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2087 }
Brave Yao5225dd82015-03-26 07:39:19 +08002088 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002089 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07002090 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002091 {
2092 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2093 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2094 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2095 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002096}
2097
2098// Test that we perform case-insensitive matching of codec names.
2099TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002100 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002101 cricket::AudioSendParameters parameters;
2102 parameters.codecs.push_back(kIsacCodec);
2103 parameters.codecs.push_back(kPcmuCodec);
2104 parameters.codecs.push_back(kCn16000Codec);
2105 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002106 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002107 parameters.codecs[0].name = "iSaC";
2108 parameters.codecs[0].id = 96;
2109 parameters.codecs[2].id = 97; // wideband CN
2110 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002111 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002112 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2113 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2114 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2115 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2116 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2117 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2118 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002119 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120}
2121
stefanba4c0e42016-02-04 04:12:24 -08002122class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2123 public:
2124 WebRtcVoiceEngineWithSendSideBweTest()
2125 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2126};
2127
2128TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2129 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002130 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002131 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002132 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2133 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2134 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002135 extension.id);
2136 return;
2137 }
2138 }
2139 FAIL() << "Transport sequence number extension not in header-extension list.";
2140}
2141
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002142// Test support for audio level header extension.
2143TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002144 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002145}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002146TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002147 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002148}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002149
solenbergd4adce42016-11-17 06:26:52 -08002150// Test support for transport sequence number header extension.
2151TEST_F(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
2152 TestSetSendRtpHeaderExtensions(
2153 webrtc::RtpExtension::kTransportSequenceNumberUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002154}
solenbergd4adce42016-11-17 06:26:52 -08002155TEST_F(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
2156 TestSetRecvRtpHeaderExtensions(
2157 webrtc::RtpExtension::kTransportSequenceNumberUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002158}
2159
solenberg1ac56142015-10-13 03:58:19 -07002160// Test that we can create a channel and start sending on it.
2161TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002162 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002163 SetSendParameters(send_parameters_);
2164 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002165 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002166 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002167 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2168}
2169
2170// Test that a channel will send if and only if it has a source and is enabled
2171// for sending.
2172TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002173 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002174 SetSendParameters(send_parameters_);
2175 SetAudioSend(kSsrc1, true, nullptr);
2176 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002177 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002178 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002179 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002180 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002181 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002182}
2183
solenberg94218532016-06-16 10:53:22 -07002184// Test that a channel is muted/unmuted.
2185TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2186 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002187 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002188 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002189 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002190 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002191 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002192 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2193}
2194
solenberg6d6e7c52016-04-13 09:07:30 -07002195// Test that SetSendParameters() does not alter a stream's send state.
2196TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2197 EXPECT_TRUE(SetupSendStream());
2198 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2199
2200 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002201 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002202 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2203
2204 // Changing RTP header extensions will recreate the AudioSendStream.
2205 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002206 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002207 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002208 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2209
2210 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002211 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002212 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2213
2214 // Changing RTP header extensions will recreate the AudioSendStream.
2215 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002216 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002217 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2218}
2219
solenberg1ac56142015-10-13 03:58:19 -07002220// Test that we can create a channel and start playing out on it.
2221TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002222 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002223 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002224 channel_->SetPlayout(true);
2225 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2226 channel_->SetPlayout(false);
2227 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002228}
2229
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002230// Test that we can add and remove send streams.
2231TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2232 SetupForMultiSendStream();
2233
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002234 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002235 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002236
solenbergc96df772015-10-21 13:01:53 -07002237 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002238 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002239 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002240 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002241 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002242 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002243 }
tfarina5237aaf2015-11-10 23:44:30 -08002244 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002245
solenbergc96df772015-10-21 13:01:53 -07002246 // Delete the send streams.
2247 for (uint32_t ssrc : kSsrcs4) {
2248 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002249 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002250 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002251 }
solenbergc96df772015-10-21 13:01:53 -07002252 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002253}
2254
2255// Test SetSendCodecs correctly configure the codecs in all send streams.
2256TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2257 SetupForMultiSendStream();
2258
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002260 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002261 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002262 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002263 }
2264
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002265 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002266 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002267 parameters.codecs.push_back(kIsacCodec);
2268 parameters.codecs.push_back(kCn16000Codec);
2269 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002270 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271
2272 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002273 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002274 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2275 const auto& send_codec_spec =
2276 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2277 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2278 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2279 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2280 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2281 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282 }
2283
minyue7a973442016-10-20 03:27:12 -07002284 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002285 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002286 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002287 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002288 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2289 const auto& send_codec_spec =
2290 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2291 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2292 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2293 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2294 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002295 }
2296}
2297
2298// Test we can SetSend on all send streams correctly.
2299TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2300 SetupForMultiSendStream();
2301
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002302 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002303 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002304 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002305 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002306 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002307 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002308 }
2309
2310 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002311 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002312 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002313 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002314 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002315 }
2316
2317 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002318 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002319 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002320 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002321 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002322 }
2323}
2324
2325// Test we can set the correct statistics on all send streams.
2326TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2327 SetupForMultiSendStream();
2328
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002329 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002330 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002331 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002332 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002333 }
solenberg85a04962015-10-27 03:35:21 -07002334
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002335 // Create a receive stream to check that none of the send streams end up in
2336 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002337 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002338
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002339 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002340 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002341 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002342 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002343
solenberg85a04962015-10-27 03:35:21 -07002344 // Check stats for the added streams.
2345 {
2346 cricket::VoiceMediaInfo info;
2347 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002348
solenberg85a04962015-10-27 03:35:21 -07002349 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002350 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002351 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002352 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002353 }
hbos1acfbd22016-11-17 23:43:29 -08002354 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002355
2356 // We have added one receive stream. We should see empty stats.
2357 EXPECT_EQ(info.receivers.size(), 1u);
2358 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002359 }
solenberg1ac56142015-10-13 03:58:19 -07002360
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002361 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002362 {
2363 cricket::VoiceMediaInfo info;
2364 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2365 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002366 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002367 EXPECT_EQ(0u, info.receivers.size());
2368 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002369
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002370 // Deliver a new packet - a default receive stream should be created and we
2371 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002372 {
2373 cricket::VoiceMediaInfo info;
2374 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2375 SetAudioReceiveStreamStats();
2376 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002377 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002378 EXPECT_EQ(1u, info.receivers.size());
2379 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002380 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002381 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002382}
2383
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002384// Test that we can add and remove receive streams, and do proper send/playout.
2385// We can receive on multiple streams while sending one stream.
2386TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002387 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002388
solenberg1ac56142015-10-13 03:58:19 -07002389 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002390 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002391 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392
solenberg1ac56142015-10-13 03:58:19 -07002393 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002394 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002395 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002396 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397
solenberg1ac56142015-10-13 03:58:19 -07002398 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002399 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400
2401 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002402 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002403 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2404 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405
2406 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002407 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002408 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002409
2410 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002411 channel_->SetPlayout(false);
2412 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2413 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414
aleloi84ef6152016-08-04 05:28:21 -07002415 // Restart playout and make sure recv streams are played out.
2416 channel_->SetPlayout(true);
2417 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2418 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002419
aleloi84ef6152016-08-04 05:28:21 -07002420 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2422 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423}
2424
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002426// and start sending on it.
2427TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002428 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002429 cricket::AudioOptions options_adjust_agc;
2430 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 webrtc::AgcConfig agc_config;
2432 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2433 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002434 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002435 SetSendParameters(send_parameters_);
2436 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002437 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002438 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2439 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002440 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002441 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002443}
2444
wu@webrtc.org97077a32013-10-25 21:18:33 +00002445TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002446 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002447 EXPECT_CALL(adm_,
2448 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002449 webrtc::AgcConfig agc_config;
2450 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2451 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002452 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2453 send_parameters_.options.tx_agc_digital_compression_gain =
2454 rtc::Optional<uint16_t>(9);
2455 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2456 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002457 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002458 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2459 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2460 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2461 EXPECT_TRUE(agc_config.limiterEnable);
2462
2463 // Check interaction with adjust_agc_delta. Both should be respected, for
2464 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002465 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002466 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002467 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2468 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2469}
2470
wu@webrtc.org97077a32013-10-25 21:18:33 +00002471TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002472 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002473 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2474 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002475 send_parameters_.options.recording_sample_rate =
2476 rtc::Optional<uint32_t>(48000);
2477 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002478 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002479}
2480
minyue6b825df2016-10-31 04:08:32 -07002481TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2482 EXPECT_TRUE(SetupSendStream());
2483 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2484 send_parameters_.options.audio_network_adaptor_config =
2485 rtc::Optional<std::string>("1234");
2486 SetSendParameters(send_parameters_);
2487 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2488 GetAudioNetworkAdaptorConfig(kSsrc1));
2489}
2490
2491TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2492 EXPECT_TRUE(SetupSendStream());
2493 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2494 send_parameters_.options.audio_network_adaptor_config =
2495 rtc::Optional<std::string>("1234");
2496 SetSendParameters(send_parameters_);
2497 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2498 GetAudioNetworkAdaptorConfig(kSsrc1));
2499 const int initial_num = call_.GetNumCreatedSendStreams();
2500 cricket::AudioOptions options;
2501 options.audio_network_adaptor = rtc::Optional<bool>(false);
2502 SetAudioSend(kSsrc1, true, nullptr, &options);
2503 // AudioSendStream expected to be recreated.
2504 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2505 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2506}
2507
2508TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2509 EXPECT_TRUE(SetupSendStream());
2510 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2511 send_parameters_.options.audio_network_adaptor_config =
2512 rtc::Optional<std::string>("1234");
2513 SetSendParameters(send_parameters_);
2514 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2515 GetAudioNetworkAdaptorConfig(kSsrc1));
2516 const int initial_num = call_.GetNumCreatedSendStreams();
2517 cricket::AudioOptions options;
2518 options.audio_network_adaptor = rtc::Optional<bool>();
2519 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2520 // adaptor.
2521 SetAudioSend(kSsrc1, true, nullptr, &options);
2522 // AudioSendStream not expected to be recreated.
2523 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2524 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2525 GetAudioNetworkAdaptorConfig(kSsrc1));
2526}
2527
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002529// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002531 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002532 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002533}
2534
2535TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2536 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002537 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002538 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002539 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002540 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002541 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002542 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002543 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544
solenberg85a04962015-10-27 03:35:21 -07002545 // Check stats for the added streams.
2546 {
2547 cricket::VoiceMediaInfo info;
2548 EXPECT_EQ(true, channel_->GetStats(&info));
2549
2550 // We have added one send stream. We should see the stats we've set.
2551 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002552 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002553 // We have added one receive stream. We should see empty stats.
2554 EXPECT_EQ(info.receivers.size(), 1u);
2555 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2556 }
solenberg1ac56142015-10-13 03:58:19 -07002557
solenberg566ef242015-11-06 15:34:49 -08002558 // Start sending - this affects some reported stats.
2559 {
2560 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002561 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002562 EXPECT_EQ(true, channel_->GetStats(&info));
2563 VerifyVoiceSenderInfo(info.senders[0], true);
hbos1acfbd22016-11-17 23:43:29 -08002564 VerifyVoiceSendRecvCodecs(info);
solenberg566ef242015-11-06 15:34:49 -08002565 }
2566
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002567 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002568 {
2569 cricket::VoiceMediaInfo info;
2570 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2571 EXPECT_EQ(true, channel_->GetStats(&info));
2572 EXPECT_EQ(1u, info.senders.size());
2573 EXPECT_EQ(0u, info.receivers.size());
2574 }
solenberg1ac56142015-10-13 03:58:19 -07002575
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002576 // Deliver a new packet - a default receive stream should be created and we
2577 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002578 {
2579 cricket::VoiceMediaInfo info;
2580 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2581 SetAudioReceiveStreamStats();
2582 EXPECT_EQ(true, channel_->GetStats(&info));
2583 EXPECT_EQ(1u, info.senders.size());
2584 EXPECT_EQ(1u, info.receivers.size());
2585 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002586 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002587 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588}
2589
2590// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002591// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002592TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002593 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002594 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002595 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002596 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597}
2598
2599// Test that the local SSRC is the same on sending and receiving channels if the
2600// receive channel is created before the send channel.
2601TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002602 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002603 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002604 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002605 cricket::StreamParams::CreateLegacy(kSsrc1)));
2606 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2607 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002608}
2609
2610// Test that we can properly receive packets.
2611TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002612 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002613 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002615
2616 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2617 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618}
2619
2620// Test that we can properly receive packets on multiple streams.
2621TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002622 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002623 const uint32_t ssrc1 = 1;
2624 const uint32_t ssrc2 = 2;
2625 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002626 EXPECT_TRUE(AddRecvStream(ssrc1));
2627 EXPECT_TRUE(AddRecvStream(ssrc2));
2628 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002629 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002630 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002631 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002632 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002633 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002634 }
mflodman3d7db262016-04-29 00:57:13 -07002635
2636 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2637 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2638 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2639
2640 EXPECT_EQ(s1.received_packets(), 0);
2641 EXPECT_EQ(s2.received_packets(), 0);
2642 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002643
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002645 EXPECT_EQ(s1.received_packets(), 0);
2646 EXPECT_EQ(s2.received_packets(), 0);
2647 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002648
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002650 EXPECT_EQ(s1.received_packets(), 1);
2651 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2652 EXPECT_EQ(s2.received_packets(), 0);
2653 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002654
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002655 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002656 EXPECT_EQ(s1.received_packets(), 1);
2657 EXPECT_EQ(s2.received_packets(), 1);
2658 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2659 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002660
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002662 EXPECT_EQ(s1.received_packets(), 1);
2663 EXPECT_EQ(s2.received_packets(), 1);
2664 EXPECT_EQ(s3.received_packets(), 1);
2665 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002666
mflodman3d7db262016-04-29 00:57:13 -07002667 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2668 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2669 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670}
2671
solenberg7e63ef02015-11-20 00:19:43 -08002672// Test that receiving on an unsignalled stream works (default channel will be
2673// created).
2674TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002675 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002676 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2677
solenberg7e63ef02015-11-20 00:19:43 -08002678 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002679
2680 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2681 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2682 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002683}
2684
2685// Test that receiving on an unsignalled stream works (default channel will be
2686// created), and that packets will be forwarded to the default channel
2687// regardless of their SSRCs.
2688TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002689 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002690 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002691 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2692
mflodman3d7db262016-04-29 00:57:13 -07002693 // Note that ssrc = 0 is not supported.
2694 uint32_t ssrc = 1;
2695 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002696 rtc::SetBE32(&packet[8], ssrc);
2697 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002698
2699 // Verify we only have one default stream.
2700 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2701 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2702 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002703 }
mflodman3d7db262016-04-29 00:57:13 -07002704
2705 // Sending the same ssrc again should not create a new stream.
2706 --ssrc;
2707 DeliverPacket(packet, sizeof(packet));
2708 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2709 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2710 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002711}
2712
2713// Test that a default channel is created even after a signalled stream has been
2714// added, and that this stream will get any packets for unknown SSRCs.
2715TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002716 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002717 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002718 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2719
2720 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002721 const uint32_t signaled_ssrc = 1;
2722 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002723 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002724 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002725 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2726 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002727
2728 // Note that the first unknown SSRC cannot be 0, because we only support
2729 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002730 const uint32_t unsignaled_ssrc = 7011;
2731 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002732 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002733 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2734 packet, sizeof(packet)));
2735 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2736
2737 DeliverPacket(packet, sizeof(packet));
2738 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2739
2740 rtc::SetBE32(&packet[8], signaled_ssrc);
2741 DeliverPacket(packet, sizeof(packet));
2742 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2743 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002744}
2745
solenberg0a617e22015-10-20 15:49:38 -07002746// Test that we properly handle failures to add a receive stream.
2747TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002748 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002749 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002750 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002751}
2752
solenberg0a617e22015-10-20 15:49:38 -07002753// Test that we properly handle failures to add a send stream.
2754TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002755 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002756 voe_.set_fail_create_channel(true);
2757 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2758}
2759
solenberg1ac56142015-10-13 03:58:19 -07002760// Test that AddRecvStream creates new stream.
2761TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002762 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002763 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002764 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002765 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766}
2767
2768// Test that after adding a recv stream, we do not decode more codecs than
2769// those previously passed into SetRecvCodecs.
2770TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002771 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002772 cricket::AudioRecvParameters parameters;
2773 parameters.codecs.push_back(kIsacCodec);
2774 parameters.codecs.push_back(kPcmuCodec);
2775 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002776 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777 int channel_num2 = voe_.GetLastChannel();
2778 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002779 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002780 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002781 gcodec.channels = 2;
2782 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2783}
2784
2785// Test that we properly clean up any streams that were added, even if
2786// not explicitly removed.
2787TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002788 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002789 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002790 EXPECT_TRUE(AddRecvStream(1));
2791 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002792 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2793 delete channel_;
2794 channel_ = NULL;
2795 EXPECT_EQ(0, voe_.GetNumChannels());
2796}
2797
wu@webrtc.org78187522013-10-07 23:32:02 +00002798TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002799 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002800 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002801}
2802
2803TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002804 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002805 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002806 // Manually delete channel to simulate a failure.
2807 int channel = voe_.GetLastChannel();
2808 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2809 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002810 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002811 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002812 EXPECT_NE(channel, new_channel);
2813 // The last created channel is deleted too.
2814 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002815}
2816
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002817// Test the InsertDtmf on default send stream as caller.
2818TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002819 TestInsertDtmf(0, true, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002820}
2821
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002822// Test the InsertDtmf on default send stream as callee
2823TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002824 TestInsertDtmf(0, false, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002825}
2826
2827// Test the InsertDtmf on specified send stream as caller.
2828TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002829 TestInsertDtmf(kSsrc1, true, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002830}
2831
2832// Test the InsertDtmf on specified send stream as callee.
2833TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002834 TestInsertDtmf(kSsrc1, false, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002835}
2836
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002837TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002838 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002839 EXPECT_CALL(adm_,
2840 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2841 EXPECT_CALL(adm_,
2842 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2843 EXPECT_CALL(adm_,
2844 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845 bool ec_enabled;
2846 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 webrtc::AecmModes aecm_mode;
2848 bool cng_enabled;
2849 bool agc_enabled;
2850 webrtc::AgcModes agc_mode;
2851 webrtc::AgcConfig agc_config;
2852 bool ns_enabled;
2853 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002854 bool stereo_swapping_enabled;
2855 bool typing_detection_enabled;
2856 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002857 voe_.GetAecmMode(aecm_mode, cng_enabled);
2858 voe_.GetAgcStatus(agc_enabled, agc_mode);
2859 voe_.GetAgcConfig(agc_config);
2860 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2862 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2863 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002864 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002865 EXPECT_FALSE(cng_enabled);
2866 EXPECT_TRUE(agc_enabled);
2867 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2868 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002869 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002870 EXPECT_FALSE(stereo_swapping_enabled);
2871 EXPECT_TRUE(typing_detection_enabled);
2872 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2873 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002874 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2875 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002876
solenberg246b8172015-12-08 09:50:23 -08002877 // Nothing set in AudioOptions, so everything should be as default.
2878 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002879 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002880 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002881 voe_.GetAecmMode(aecm_mode, cng_enabled);
2882 voe_.GetAgcStatus(agc_enabled, agc_mode);
2883 voe_.GetAgcConfig(agc_config);
2884 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2886 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2887 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002888 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002889 EXPECT_FALSE(cng_enabled);
2890 EXPECT_TRUE(agc_enabled);
2891 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2892 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002893 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002894 EXPECT_FALSE(stereo_swapping_enabled);
2895 EXPECT_TRUE(typing_detection_enabled);
2896 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2897 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002898 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2899 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002900
2901 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002902 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002903 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002904 voe_.GetEcStatus(ec_enabled, ec_mode);
2905 EXPECT_FALSE(ec_enabled);
2906
2907 // Turn echo cancellation back on, with settings, and make sure
2908 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002909 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002910 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002912 voe_.GetAecmMode(aecm_mode, cng_enabled);
2913 voe_.GetAgcStatus(agc_enabled, agc_mode);
2914 voe_.GetAgcConfig(agc_config);
2915 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002916 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2917 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2918 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002919 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002920 EXPECT_TRUE(agc_enabled);
2921 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2922 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002923 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002924 EXPECT_FALSE(stereo_swapping_enabled);
2925 EXPECT_TRUE(typing_detection_enabled);
2926 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2927 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2928
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002929 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2930 // control.
solenberg246b8172015-12-08 09:50:23 -08002931 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002932 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002933 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002934 voe_.GetAecmMode(aecm_mode, cng_enabled);
2935 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002936 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002937 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2938
2939 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002940 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2941 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2942 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002943 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002944 voe_.GetEcStatus(ec_enabled, ec_mode);
2945 EXPECT_FALSE(ec_enabled);
2946 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002947 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002948 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002949 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002950 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002951 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002952 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2953
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002954 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002955 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002956 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002957 voe_.GetAgcStatus(agc_enabled, agc_mode);
2958 EXPECT_FALSE(agc_enabled);
2959
2960 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002961 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2962 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07002963 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002964 voe_.GetAgcStatus(agc_enabled, agc_mode);
2965 EXPECT_TRUE(agc_enabled);
2966 voe_.GetAgcConfig(agc_config);
2967 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2968
2969 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002970 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2971 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2972 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2973 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002974 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002975 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002976 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2977 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2978 EXPECT_FALSE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002979 EXPECT_FALSE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002980 EXPECT_FALSE(typing_detection_enabled);
2981 EXPECT_TRUE(stereo_swapping_enabled);
2982
solenberg1ac56142015-10-13 03:58:19 -07002983 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07002984 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002985 voe_.GetEcStatus(ec_enabled, ec_mode);
2986 voe_.GetNsStatus(ns_enabled, ns_mode);
2987 EXPECT_TRUE(ec_enabled);
2988 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2989 EXPECT_FALSE(ns_enabled);
2990 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2991}
2992
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002993TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002994 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995
2996 bool ec_enabled;
2997 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998 bool agc_enabled;
2999 webrtc::AgcModes agc_mode;
3000 bool ns_enabled;
3001 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003002 bool stereo_swapping_enabled;
3003 bool typing_detection_enabled;
3004
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003005 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003006 voe_.GetAgcStatus(agc_enabled, agc_mode);
3007 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003008 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3009 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3010 EXPECT_TRUE(ec_enabled);
3011 EXPECT_TRUE(agc_enabled);
3012 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08003013 EXPECT_TRUE(IsHighPassFilterEnabled());
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003014 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003015 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003016}
3017
3018TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3019 webrtc::AgcConfig set_config = {0};
3020 set_config.targetLeveldBOv = 3;
3021 set_config.digitalCompressionGaindB = 9;
3022 set_config.limiterEnable = true;
3023 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003024
3025 webrtc::AgcConfig config = {0};
3026 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3027 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3028 EXPECT_EQ(set_config.digitalCompressionGaindB,
3029 config.digitalCompressionGaindB);
3030 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3031}
3032
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003033TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003034 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003035 EXPECT_CALL(adm_,
3036 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3037 EXPECT_CALL(adm_,
3038 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3039 EXPECT_CALL(adm_,
3040 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07003041 EXPECT_CALL(adm_,
3042 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
3043 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
3044 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
3045 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
3046 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07003047
kwiberg686a8ef2016-02-26 03:00:35 -08003048 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003049 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003050 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003051 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003052 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003053 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003054
3055 // Have to add a stream to make SetSend work.
3056 cricket::StreamParams stream1;
3057 stream1.ssrcs.push_back(1);
3058 channel1->AddSendStream(stream1);
3059 cricket::StreamParams stream2;
3060 stream2.ssrcs.push_back(2);
3061 channel2->AddSendStream(stream2);
3062
3063 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003064 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003065 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3066 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3067 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003068 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003069 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07003070 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003071 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003072
3073 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003074 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003075 parameters_options_no_ns.options.noise_suppression =
3076 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003077 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003078 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003079 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3080 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3081 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003082 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003083
3084 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003085 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003086 parameters_options_no_agc.options.auto_gain_control =
3087 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003088 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003089 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3090 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3091 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003092 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003093
solenberg059fb442016-10-26 05:12:24 -07003094 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003095 bool ec_enabled;
3096 webrtc::EcModes ec_mode;
3097 bool agc_enabled;
3098 webrtc::AgcModes agc_mode;
3099 bool ns_enabled;
3100 webrtc::NsModes ns_mode;
3101 voe_.GetEcStatus(ec_enabled, ec_mode);
3102 voe_.GetAgcStatus(agc_enabled, agc_mode);
3103 voe_.GetNsStatus(ns_enabled, ns_mode);
3104 EXPECT_TRUE(ec_enabled);
3105 EXPECT_TRUE(agc_enabled);
3106 EXPECT_TRUE(ns_enabled);
3107
solenberg059fb442016-10-26 05:12:24 -07003108 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003109 voe_.GetEcStatus(ec_enabled, ec_mode);
3110 voe_.GetAgcStatus(agc_enabled, agc_mode);
3111 voe_.GetNsStatus(ns_enabled, ns_mode);
3112 EXPECT_TRUE(ec_enabled);
3113 EXPECT_TRUE(agc_enabled);
3114 EXPECT_FALSE(ns_enabled);
3115
solenberg059fb442016-10-26 05:12:24 -07003116 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003117 voe_.GetEcStatus(ec_enabled, ec_mode);
3118 voe_.GetAgcStatus(agc_enabled, agc_mode);
3119 voe_.GetNsStatus(ns_enabled, ns_mode);
3120 EXPECT_TRUE(ec_enabled);
3121 EXPECT_FALSE(agc_enabled);
3122 EXPECT_TRUE(ns_enabled);
3123
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003124 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003125 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3126 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3127 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003128 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3129 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003130 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003131 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003132 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003133 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003134 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003135 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01003136 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3137 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3138 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003139 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003140 voe_.GetEcStatus(ec_enabled, ec_mode);
3141 voe_.GetAgcStatus(agc_enabled, agc_mode);
3142 voe_.GetNsStatus(ns_enabled, ns_mode);
3143 EXPECT_TRUE(ec_enabled);
3144 EXPECT_FALSE(agc_enabled);
3145 EXPECT_FALSE(ns_enabled);
3146}
3147
wu@webrtc.orgde305012013-10-31 15:40:38 +00003148// This test verifies DSCP settings are properly applied on voice media channel.
3149TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003150 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003151 cricket::FakeNetworkInterface network_interface;
3152 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003153 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003154
solenberg059fb442016-10-26 05:12:24 -07003155 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3156 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3157
solenbergbc37fc82016-04-04 09:54:44 -07003158 channel.reset(
3159 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003160 channel->SetInterface(&network_interface);
3161 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3162 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3163
3164 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003165 channel.reset(
3166 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003167 channel->SetInterface(&network_interface);
3168 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3169
3170 // Verify that setting the option to false resets the
3171 // DiffServCodePoint.
3172 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003173 channel.reset(
3174 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003175 channel->SetInterface(&network_interface);
3176 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3177 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3178
3179 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003180}
3181
solenberg1ac56142015-10-13 03:58:19 -07003182TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003183 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003184 cricket::WebRtcVoiceMediaChannel* media_channel =
3185 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003186 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003187 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003188 int channel_id = voe_.GetLastChannel();
3189 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3190 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003191 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003192 int channel_id2 = voe_.GetLastChannel();
3193 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003194}
3195
solenberg1ac56142015-10-13 03:58:19 -07003196TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003197 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003198 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003199 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3200 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3201 EXPECT_TRUE(channel_->AddSendStream(
3202 cricket::StreamParams::CreateLegacy(kSsrc1)));
3203 int channel_id = voe_.GetLastChannel();
3204 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3205 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3206 EXPECT_TRUE(channel_->AddSendStream(
3207 cricket::StreamParams::CreateLegacy(kSsrc2)));
3208 int channel_id2 = voe_.GetLastChannel();
3209 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003210}
3211
solenberg4bac9c52015-10-09 02:32:53 -07003212TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003213 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003214 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003215 cricket::StreamParams stream;
3216 stream.ssrcs.push_back(kSsrc2);
3217 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003218 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003219 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003220 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003221}
3222
3223TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003224 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003225 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3226 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003227 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003228 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003229 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3230 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3231 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003232}
3233
pbos8fc7fa72015-07-15 08:02:58 -07003234TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003235 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003236 const std::string kSyncLabel = "AvSyncLabel";
3237
solenbergff976312016-03-30 23:28:51 -07003238 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003239 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3240 sp.sync_label = kSyncLabel;
3241 // Creating two channels to make sure that sync label is set properly for both
3242 // the default voice channel and following ones.
3243 EXPECT_TRUE(channel_->AddRecvStream(sp));
3244 sp.ssrcs[0] += 1;
3245 EXPECT_TRUE(channel_->AddRecvStream(sp));
3246
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003247 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003248 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003249 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003250 << "SyncGroup should be set based on sync_label";
3251 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003252 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003253 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003254}
3255
solenberg3a941542015-11-16 07:34:50 -08003256// TODO(solenberg): Remove, once recv streams are configured through Call.
3257// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003258TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003259 // Test that setting the header extensions results in the expected state
3260 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003261 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003262 ssrcs.push_back(223);
3263 ssrcs.push_back(224);
3264
solenbergff976312016-03-30 23:28:51 -07003265 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003266 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003267 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003268 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003269 cricket::StreamParams::CreateLegacy(ssrc)));
3270 }
3271
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003272 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003273 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003274 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003275 EXPECT_NE(nullptr, s);
3276 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3277 }
3278
3279 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003280 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003281 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003282 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003283 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003284 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003285 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003286 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003287 EXPECT_NE(nullptr, s);
3288 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003289 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3290 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003291 for (const auto& s_ext : s_exts) {
3292 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003293 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003294 }
3295 }
3296 }
3297 }
3298
3299 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003300 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003301 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003302 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003303 EXPECT_NE(nullptr, s);
3304 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3305 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003306}
3307
3308TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3309 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003310 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003311 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003312 static const unsigned char kRtcp[] = {
3313 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3314 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3317 };
jbaucheec21bd2016-03-20 06:15:43 -07003318 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003319
solenbergff976312016-03-30 23:28:51 -07003320 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003321 cricket::WebRtcVoiceMediaChannel* media_channel =
3322 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003323 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003324 EXPECT_TRUE(media_channel->AddRecvStream(
3325 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3326
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003327 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003328 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003329 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003330 EXPECT_EQ(0, s->received_packets());
3331 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3332 EXPECT_EQ(1, s->received_packets());
3333 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3334 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003335}
Minyue2013aec2015-05-13 14:14:42 +02003336
solenberg0a617e22015-10-20 15:49:38 -07003337// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003338// since they do not send RTCP SR.
solenberg7602aab2016-11-14 11:30:07 -08003339TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
solenbergff976312016-03-30 23:28:51 -07003340 EXPECT_TRUE(SetupSendStream());
solenberg7602aab2016-11-14 11:30:07 -08003341 EXPECT_TRUE(AddRecvStream(kSsrc2));
3342 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3343 EXPECT_TRUE(channel_->AddSendStream(
3344 cricket::StreamParams::CreateLegacy(kSsrc3)));
3345 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3346 EXPECT_TRUE(AddRecvStream(kSsrc4));
3347 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc4).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003348}
3349
solenberg7602aab2016-11-14 11:30:07 -08003350TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3351 EXPECT_TRUE(SetupRecvStream());
3352 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3353 EXPECT_TRUE(channel_->AddSendStream(
3354 cricket::StreamParams::CreateLegacy(kSsrc2)));
3355 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3356 EXPECT_TRUE(AddRecvStream(kSsrc3));
3357 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
3358 EXPECT_TRUE(channel_->AddSendStream(
3359 cricket::StreamParams::CreateLegacy(kSsrc4)));
3360 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3361 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003362}
stefan658910c2015-09-03 05:48:32 -07003363
deadbeef884f5852016-01-15 09:20:04 -08003364TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003365 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003366 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3367 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003368
3369 // Setting the sink before a recv stream exists should do nothing.
3370 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003371 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003372 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3373
3374 // Now try actually setting the sink.
3375 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3376 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3377
3378 // Now try resetting it.
3379 channel_->SetRawAudioSink(kSsrc1, nullptr);
3380 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3381}
3382
3383TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003384 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003385 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3386 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003387
3388 // Should be able to set a default sink even when no stream exists.
3389 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3390
3391 // Create default channel and ensure it's assigned the default sink.
3392 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3393 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3394
3395 // Try resetting the default sink.
3396 channel_->SetRawAudioSink(0, nullptr);
3397 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3398
3399 // Try setting the default sink while the default stream exists.
3400 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3401 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3402
3403 // If we remove and add a default stream, it should get the same sink.
3404 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3405 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3406 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3407}
3408
skvlad7a43d252016-03-22 15:32:27 -07003409// Test that, just like the video channel, the voice channel communicates the
3410// network state to the call.
3411TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003412 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003413
3414 EXPECT_EQ(webrtc::kNetworkUp,
3415 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3416 EXPECT_EQ(webrtc::kNetworkUp,
3417 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3418
3419 channel_->OnReadyToSend(false);
3420 EXPECT_EQ(webrtc::kNetworkDown,
3421 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3422 EXPECT_EQ(webrtc::kNetworkUp,
3423 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3424
3425 channel_->OnReadyToSend(true);
3426 EXPECT_EQ(webrtc::kNetworkUp,
3427 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3428 EXPECT_EQ(webrtc::kNetworkUp,
3429 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3430}
3431
aleloi18e0b672016-10-04 02:45:47 -07003432// Test that playout is still started after changing parameters
3433TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3434 SetupRecvStream();
3435 channel_->SetPlayout(true);
3436 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3437
3438 // Changing RTP header extensions will recreate the AudioReceiveStream.
3439 cricket::AudioRecvParameters parameters;
3440 parameters.extensions.push_back(
3441 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3442 channel_->SetRecvParameters(parameters);
3443
3444 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3445}
3446
stefan658910c2015-09-03 05:48:32 -07003447// Tests that the library initializes and shuts down properly.
3448TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003449 // If the VoiceEngine wants to gather available codecs early, that's fine but
3450 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003451 cricket::WebRtcVoiceEngine engine(
3452 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003453 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003454 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003455 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003456 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3457 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003458 EXPECT_TRUE(channel != nullptr);
3459 delete channel;
solenbergff976312016-03-30 23:28:51 -07003460}
stefan658910c2015-09-03 05:48:32 -07003461
solenbergff976312016-03-30 23:28:51 -07003462// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003463TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3464 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3465 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3466 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003467 {
ossuc54071d2016-08-17 02:45:41 -07003468 cricket::WebRtcVoiceEngine engine(
3469 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003470 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003471 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003472 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003473 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3474 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3475 EXPECT_TRUE(channel != nullptr);
3476 delete channel;
3477 }
stefan658910c2015-09-03 05:48:32 -07003478}
3479
3480// Tests that the library is configured with the codecs we want.
3481TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003482 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3483 // module.
3484
stefan658910c2015-09-03 05:48:32 -07003485 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003486 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003487 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003488 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003489 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003490 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003491 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003492 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003493 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003494 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003495 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003496 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003497 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003498 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003499 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003500 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003501 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003502 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
solenberg2779bab2016-11-17 04:45:19 -08003503 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3504 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3505 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3506 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3507 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3508 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003509 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003510 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003511 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003512 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003513 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003514 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003515 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003516 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003517 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003518 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003519 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003520 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003521 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003522 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003523 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003524 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003525 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003526 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003527 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003528 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003529 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003530 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003531 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003532
stefan658910c2015-09-03 05:48:32 -07003533 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003534 // TODO(ossu): Why are the payload types of codecs with non-static payload
3535 // type assignments checked here? It shouldn't really matter.
3536 cricket::WebRtcVoiceEngine engine(
3537 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
solenberg2779bab2016-11-17 04:45:19 -08003538 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3539 if (codec.name == "CN" && codec.clockrate == 16000) {
3540 EXPECT_EQ(105, codec.id);
3541 } else if (codec.name == "CN" && codec.clockrate == 32000) {
3542 EXPECT_EQ(106, codec.id);
3543 } else if (codec.name == "ISAC" && codec.clockrate == 16000) {
3544 EXPECT_EQ(103, codec.id);
3545 } else if (codec.name == "ISAC" && codec.clockrate == 32000) {
3546 EXPECT_EQ(104, codec.id);
3547 } else if (codec.name == "G722" && codec.clockrate == 8000) {
3548 EXPECT_EQ(9, codec.id);
3549 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) {
3550 EXPECT_EQ(126, codec.id);
3551 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3552 // Remove these checks once both send and receive side assigns payload types
3553 // dynamically.
3554 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) {
3555 EXPECT_EQ(113, codec.id);
3556 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) {
3557 EXPECT_EQ(112, codec.id);
3558 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) {
3559 EXPECT_EQ(110, codec.id);
3560 } else if (codec.name == "opus") {
3561 EXPECT_EQ(111, codec.id);
3562 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3563 EXPECT_EQ("10", codec.params.find("minptime")->second);
3564 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3565 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
stefan658910c2015-09-03 05:48:32 -07003566 }
3567 }
stefan658910c2015-09-03 05:48:32 -07003568}
3569
3570// Tests that VoE supports at least 32 channels
3571TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003572 cricket::WebRtcVoiceEngine engine(
3573 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003574 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003575 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003576 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003577
3578 cricket::VoiceMediaChannel* channels[32];
3579 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003580 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003581 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3582 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003583 if (!channel)
3584 break;
stefan658910c2015-09-03 05:48:32 -07003585 channels[num_channels++] = channel;
3586 }
3587
tfarina5237aaf2015-11-10 23:44:30 -08003588 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003589 EXPECT_EQ(expected, num_channels);
3590
3591 while (num_channels > 0) {
3592 delete channels[--num_channels];
3593 }
stefan658910c2015-09-03 05:48:32 -07003594}
3595
3596// Test that we set our preferred codecs properly.
3597TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003598 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3599 // - Check that our builtin codecs are usable by Channel.
3600 // - The codecs provided by the engine is usable by Channel.
3601 // It does not check that the codecs in the RecvParameters are actually
3602 // what we sent in - though it's probably reasonable to expect so, if
3603 // SetRecvParameters returns true.
3604 // I think it will become clear once audio decoder injection is completed.
3605 cricket::WebRtcVoiceEngine engine(
3606 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003607 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003608 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003609 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003610 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3611 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003612 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003613 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003614 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003615}