blob: 674924eda855b0bed233ef0768421a3c259d483d [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
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000359 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700360 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000361
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000362 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800363 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000364
365 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700366 send_parameters_.extensions.push_back(
367 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg059fb442016-10-26 05:12:24 -0700368 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800369 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000370
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000371 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200372 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700373 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800374 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000375
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000376 // Ensure extension is set properly.
377 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700378 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg059fb442016-10-26 05:12:24 -0700379 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800380 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700381 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800382 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000383
solenberg7add0582015-11-20 09:59:34 -0800384 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000385 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700386 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800387 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
388 call_.GetAudioSendStream(kSsrc2));
389 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700390 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800391 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000392
393 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200394 send_parameters_.codecs.push_back(kPcmuCodec);
395 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());
398 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000399 }
400
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000401 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700402 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000403
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000404 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800405 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000406
407 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700408 recv_parameters_.extensions.push_back(
409 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800410 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
411 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000412
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000413 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800414 recv_parameters_.extensions.clear();
415 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
416 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000417
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000418 // Ensure extension is set properly.
419 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700420 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800421 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
422 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700423 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800424 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000425
solenberg7add0582015-11-20 09:59:34 -0800426 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700427 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800428 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
429 call_.GetAudioReceiveStream(kSsrc2));
430 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700431 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800432 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000433
434 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800435 recv_parameters_.extensions.clear();
436 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
437 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
438 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000439 }
440
solenberg85a04962015-10-27 03:35:21 -0700441 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
442 webrtc::AudioSendStream::Stats stats;
443 stats.local_ssrc = 12;
444 stats.bytes_sent = 345;
445 stats.packets_sent = 678;
446 stats.packets_lost = 9012;
447 stats.fraction_lost = 34.56f;
448 stats.codec_name = "codec_name_send";
hbos1acfbd22016-11-17 23:43:29 -0800449 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700450 stats.ext_seqnum = 789;
451 stats.jitter_ms = 12;
452 stats.rtt_ms = 345;
453 stats.audio_level = 678;
454 stats.aec_quality_min = 9.01f;
455 stats.echo_delay_median_ms = 234;
456 stats.echo_delay_std_ms = 567;
457 stats.echo_return_loss = 890;
458 stats.echo_return_loss_enhancement = 1234;
ivoc8c63a822016-10-21 04:10:03 -0700459 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700460 stats.typing_noise_detected = true;
461 return stats;
462 }
463 void SetAudioSendStreamStats() {
464 for (auto* s : call_.GetAudioSendStreams()) {
465 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200466 }
solenberg85a04962015-10-27 03:35:21 -0700467 }
solenberg566ef242015-11-06 15:34:49 -0800468 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
469 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700470 const auto stats = GetAudioSendStreamStats();
471 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
472 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
473 EXPECT_EQ(info.packets_sent, stats.packets_sent);
474 EXPECT_EQ(info.packets_lost, stats.packets_lost);
475 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
476 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800477 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700478 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
479 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
480 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
481 EXPECT_EQ(info.audio_level, stats.audio_level);
482 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
483 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
484 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
485 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
486 EXPECT_EQ(info.echo_return_loss_enhancement,
487 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700488 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800489 EXPECT_EQ(info.typing_noise_detected,
490 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700491 }
492
493 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
494 webrtc::AudioReceiveStream::Stats stats;
495 stats.remote_ssrc = 123;
496 stats.bytes_rcvd = 456;
497 stats.packets_rcvd = 768;
498 stats.packets_lost = 101;
499 stats.fraction_lost = 23.45f;
500 stats.codec_name = "codec_name_recv";
hbos1acfbd22016-11-17 23:43:29 -0800501 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700502 stats.ext_seqnum = 678;
503 stats.jitter_ms = 901;
504 stats.jitter_buffer_ms = 234;
505 stats.jitter_buffer_preferred_ms = 567;
506 stats.delay_estimate_ms = 890;
507 stats.audio_level = 1234;
508 stats.expand_rate = 5.67f;
509 stats.speech_expand_rate = 8.90f;
510 stats.secondary_decoded_rate = 1.23f;
511 stats.accelerate_rate = 4.56f;
512 stats.preemptive_expand_rate = 7.89f;
513 stats.decoding_calls_to_silence_generator = 12;
514 stats.decoding_calls_to_neteq = 345;
515 stats.decoding_normal = 67890;
516 stats.decoding_plc = 1234;
517 stats.decoding_cng = 5678;
518 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700519 stats.decoding_muted_output = 3456;
520 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200521 return stats;
522 }
523 void SetAudioReceiveStreamStats() {
524 for (auto* s : call_.GetAudioReceiveStreams()) {
525 s->SetStats(GetAudioReceiveStreamStats());
526 }
527 }
528 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700529 const auto stats = GetAudioReceiveStreamStats();
530 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
531 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
532 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
533 EXPECT_EQ(info.packets_lost, stats.packets_lost);
534 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
535 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800536 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700537 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
538 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
539 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200540 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700541 stats.jitter_buffer_preferred_ms);
542 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
543 EXPECT_EQ(info.audio_level, stats.audio_level);
544 EXPECT_EQ(info.expand_rate, stats.expand_rate);
545 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
546 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
547 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
548 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200549 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700550 stats.decoding_calls_to_silence_generator);
551 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
552 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
553 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
554 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
555 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700556 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700557 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200558 }
hbos1acfbd22016-11-17 23:43:29 -0800559 void VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo& info) const {
560 EXPECT_EQ(send_parameters_.codecs.size(), info.send_codecs.size());
561 for (const cricket::AudioCodec& codec : send_parameters_.codecs) {
562 ASSERT_EQ(info.send_codecs.count(codec.id), 1U);
563 EXPECT_EQ(info.send_codecs.find(codec.id)->second,
564 codec.ToCodecParameters());
565 }
566 EXPECT_EQ(recv_parameters_.codecs.size(), info.receive_codecs.size());
567 for (const cricket::AudioCodec& codec : recv_parameters_.codecs) {
568 ASSERT_EQ(info.receive_codecs.count(codec.id), 1U);
569 EXPECT_EQ(info.receive_codecs.find(codec.id)->second,
570 codec.ToCodecParameters());
571 }
572 }
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200573
peah8271d042016-11-22 07:24:52 -0800574 bool IsHighPassFilterEnabled() {
575 return engine_->GetApmConfigForTest().high_pass_filter.enabled;
576 }
577
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700579 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700580 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700581 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200582 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700584 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700585 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200586 cricket::AudioSendParameters send_parameters_;
587 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800588 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800589 private:
590 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591};
592
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000593// Tests that we can create and destroy a channel.
594TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700595 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596}
597
solenberg31fec402016-05-06 02:13:12 -0700598// Test that we can add a send stream and that it has the correct defaults.
599TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
600 EXPECT_TRUE(SetupChannel());
601 EXPECT_TRUE(
602 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
603 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
604 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
605 EXPECT_EQ("", config.rtp.c_name);
606 EXPECT_EQ(0u, config.rtp.extensions.size());
607 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
608 config.send_transport);
609}
610
611// Test that we can add a receive stream and that it has the correct defaults.
612TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
613 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700614 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700615 const webrtc::AudioReceiveStream::Config& config =
616 GetRecvStreamConfig(kSsrc1);
617 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
618 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
619 EXPECT_FALSE(config.rtp.transport_cc);
620 EXPECT_EQ(0u, config.rtp.extensions.size());
621 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
622 config.rtcp_send_transport);
623 EXPECT_EQ("", config.sync_group);
624}
625
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700627// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700628// TODO(ossu): This test should move into a separate builtin audio codecs
629// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700630TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700631 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632 ASSERT_FALSE(codecs.empty());
633 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
634 EXPECT_EQ(48000, codecs[0].clockrate);
635 EXPECT_EQ(2, codecs[0].channels);
636 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637}
638
stefanba4c0e42016-02-04 04:12:24 -0800639TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700640 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800641 bool opus_found = false;
642 for (cricket::AudioCodec codec : codecs) {
643 if (codec.name == "opus") {
644 EXPECT_TRUE(HasTransportCc(codec));
645 opus_found = true;
646 }
647 }
648 EXPECT_TRUE(opus_found);
649}
650
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651// Tests that we can find codecs by name or id, and that we interpret the
652// clockrate and bitrate fields properly.
653TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
654 cricket::AudioCodec codec;
655 webrtc::CodecInst codec_inst;
656 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800657 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800659 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg2779bab2016-11-17 04:45:19 -0800661 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec1,
662 &codec_inst));
663 // Find telephone-event with explicit clockrate and 0 bitrate.
664 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec2,
solenberg26c8c912015-11-27 04:00:25 -0800665 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 // Find ISAC with a different payload id.
667 codec = kIsacCodec;
668 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800669 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670 EXPECT_EQ(codec.id, codec_inst.pltype);
671 // Find PCMU with a 0 clockrate.
672 codec = kPcmuCodec;
673 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800674 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 EXPECT_EQ(codec.id, codec_inst.pltype);
676 EXPECT_EQ(8000, codec_inst.plfreq);
677 // Find PCMU with a 0 bitrate.
678 codec = kPcmuCodec;
679 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800680 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 EXPECT_EQ(codec.id, codec_inst.pltype);
682 EXPECT_EQ(64000, codec_inst.rate);
683 // Find ISAC with an explicit bitrate.
684 codec = kIsacCodec;
685 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800686 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_EQ(codec.id, codec_inst.pltype);
688 EXPECT_EQ(32000, codec_inst.rate);
689}
690
691// Test that we set our inbound codecs properly, including changing PT.
692TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700693 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200694 cricket::AudioRecvParameters parameters;
695 parameters.codecs.push_back(kIsacCodec);
696 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800697 parameters.codecs.push_back(kTelephoneEventCodec1);
698 parameters.codecs.push_back(kTelephoneEventCodec2);
699 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200700 parameters.codecs[2].id = 126;
701 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700702 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700703 int channel_num = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800704
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800706 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 gcodec.plfreq = 16000;
708 gcodec.channels = 1;
709 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
710 EXPECT_EQ(106, gcodec.pltype);
711 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800712
tfarina5237aaf2015-11-10 23:44:30 -0800713 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714 gcodec.plfreq = 8000;
715 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
716 EXPECT_EQ(126, gcodec.pltype);
717 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800718
719 gcodec.plfreq = 32000;
720 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
721 EXPECT_EQ(107, gcodec.pltype);
722 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723}
724
725// Test that we fail to set an unknown inbound codec.
726TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700727 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200728 cricket::AudioRecvParameters parameters;
729 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700730 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200731 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000732}
733
734// Test that we fail if we have duplicate types in the inbound list.
735TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700736 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200737 cricket::AudioRecvParameters parameters;
738 parameters.codecs.push_back(kIsacCodec);
739 parameters.codecs.push_back(kCn16000Codec);
740 parameters.codecs[1].id = kIsacCodec.id;
741 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000742}
743
744// Test that we can decode OPUS without stereo parameters.
745TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700746 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200747 cricket::AudioRecvParameters parameters;
748 parameters.codecs.push_back(kIsacCodec);
749 parameters.codecs.push_back(kPcmuCodec);
750 parameters.codecs.push_back(kOpusCodec);
751 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700752 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700753 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800755 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756 // Even without stereo parameters, recv codecs still specify channels = 2.
757 EXPECT_EQ(2, opus.channels);
758 EXPECT_EQ(111, opus.pltype);
759 EXPECT_STREQ("opus", opus.plname);
760 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700761 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762 EXPECT_EQ(111, opus.pltype);
763}
764
765// Test that we can decode OPUS with stereo = 0.
766TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700767 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200768 cricket::AudioRecvParameters parameters;
769 parameters.codecs.push_back(kIsacCodec);
770 parameters.codecs.push_back(kPcmuCodec);
771 parameters.codecs.push_back(kOpusCodec);
772 parameters.codecs[2].params["stereo"] = "0";
773 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700774 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 int channel_num2 = voe_.GetLastChannel();
776 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800777 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778 // Even when stereo is off, recv codecs still specify channels = 2.
779 EXPECT_EQ(2, opus.channels);
780 EXPECT_EQ(111, opus.pltype);
781 EXPECT_STREQ("opus", opus.plname);
782 opus.pltype = 0;
783 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
784 EXPECT_EQ(111, opus.pltype);
785}
786
787// Test that we can decode OPUS with stereo = 1.
788TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700789 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200790 cricket::AudioRecvParameters parameters;
791 parameters.codecs.push_back(kIsacCodec);
792 parameters.codecs.push_back(kPcmuCodec);
793 parameters.codecs.push_back(kOpusCodec);
794 parameters.codecs[2].params["stereo"] = "1";
795 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700796 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797 int channel_num2 = voe_.GetLastChannel();
798 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800799 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800 EXPECT_EQ(2, opus.channels);
801 EXPECT_EQ(111, opus.pltype);
802 EXPECT_STREQ("opus", opus.plname);
803 opus.pltype = 0;
804 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
805 EXPECT_EQ(111, opus.pltype);
806}
807
808// Test that changes to recv codecs are applied to all streams.
809TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700810 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200811 cricket::AudioRecvParameters parameters;
812 parameters.codecs.push_back(kIsacCodec);
813 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800814 parameters.codecs.push_back(kTelephoneEventCodec1);
815 parameters.codecs.push_back(kTelephoneEventCodec2);
816 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200817 parameters.codecs[2].id = 126;
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();
solenberg2779bab2016-11-17 04:45:19 -0800821
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000822 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800823 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824 gcodec.plfreq = 16000;
825 gcodec.channels = 1;
826 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
827 EXPECT_EQ(106, gcodec.pltype);
828 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800829
tfarina5237aaf2015-11-10 23:44:30 -0800830 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831 gcodec.plfreq = 8000;
832 gcodec.channels = 1;
833 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
834 EXPECT_EQ(126, gcodec.pltype);
835 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800836
837 gcodec.plfreq = 32000;
838 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
839 EXPECT_EQ(107, gcodec.pltype);
840 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841}
842
843TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700844 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200845 cricket::AudioRecvParameters parameters;
846 parameters.codecs.push_back(kIsacCodec);
solenberg2779bab2016-11-17 04:45:19 -0800847 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200848 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849
850 int channel_num2 = voe_.GetLastChannel();
851 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800852 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000853 gcodec.plfreq = 16000;
854 gcodec.channels = 1;
855 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
856 EXPECT_EQ(106, gcodec.pltype);
857 EXPECT_STREQ("ISAC", gcodec.plname);
858}
859
860// Test that we can apply the same set of codecs again while playing.
861TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700862 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200863 cricket::AudioRecvParameters parameters;
864 parameters.codecs.push_back(kIsacCodec);
865 parameters.codecs.push_back(kCn16000Codec);
866 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700867 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200868 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869
870 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200871 parameters.codecs[0].id = 127;
872 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700873 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000874}
875
876// Test that we can add a codec while playing.
877TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700878 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200879 cricket::AudioRecvParameters parameters;
880 parameters.codecs.push_back(kIsacCodec);
881 parameters.codecs.push_back(kCn16000Codec);
882 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700883 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200885 parameters.codecs.push_back(kOpusCodec);
886 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700887 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800889 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
891}
892
893TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700894 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000896 // Test that when autobw is enabled, bitrate is kept as the default
897 // value. autobw is enabled for the following tests because the target
898 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899
900 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700901 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000902
903 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700904 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700907 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000908}
909
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000910TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700911 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000912
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000913 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914
915 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700916 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
917 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
918 // Rates above the max (56000) should be capped.
919 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000920
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700922 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
923 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
924 // Rates above the max (510000) should be capped.
925 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926}
927
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000928TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700929 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000930
931 // Test that we can only set a maximum bitrate for a fixed-rate codec
932 // if it's bigger than the fixed rate.
933
934 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700935 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
936 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
937 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
938 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
939 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
940 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
941 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000942}
943
944TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700945 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200946 const int kDesiredBitrate = 128000;
947 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700948 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200949 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700950 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000951
952 EXPECT_TRUE(channel_->AddSendStream(
953 cricket::StreamParams::CreateLegacy(kSsrc1)));
954
minyue7a973442016-10-20 03:27:12 -0700955 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000956}
957
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000958// Test that bitrate cannot be set for CBR codecs.
959// Bitrate is ignored if it is higher than the fixed bitrate.
960// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000961TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700962 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000963
964 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700965 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700966 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200967
968 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700969 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700970 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200971
972 send_parameters_.max_bandwidth_bps = 128;
973 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700974 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975}
976
skvlade0d46372016-04-07 22:59:22 -0700977// Test that the per-stream bitrate limit and the global
978// bitrate limit both apply.
979TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
980 EXPECT_TRUE(SetupSendStream());
981
982 // opus, default bitrate == 64000.
983 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
984 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
985 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
986 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
987
988 // CBR codecs allow both maximums to exceed the bitrate.
989 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
990 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
991 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
992 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
993
994 // CBR codecs don't allow per stream maximums to be too low.
995 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
996 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
997}
998
999// Test that an attempt to set RtpParameters for a stream that does not exist
1000// fails.
1001TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
1002 EXPECT_TRUE(SetupChannel());
1003 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001004 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -07001005 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
1006
1007 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001008 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -07001009}
1010
1011TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001012 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -07001013 // This test verifies that setting RtpParameters succeeds only if
1014 // the structure contains exactly one encoding.
1015 // TODO(skvlad): Update this test when we start supporting setting parameters
1016 // for each encoding individually.
1017
1018 EXPECT_TRUE(SetupSendStream());
1019 // Setting RtpParameters with no encoding is expected to fail.
1020 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001021 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001022 // Setting RtpParameters with exactly one encoding should succeed.
1023 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001024 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001025 // Two or more encodings should result in failure.
1026 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001027 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001028}
1029
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001030// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001031// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001032TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1033 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07001034 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001035 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1036 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001037 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001038 ASSERT_EQ(1u, parameters.encodings.size());
1039 ASSERT_TRUE(parameters.encodings[0].active);
1040 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001041 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001042 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
1043
1044 // Now change it back to active and verify we resume sending.
1045 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001046 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001047 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1048}
1049
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001050// Test that SetRtpSendParameters configures the correct encoding channel for
1051// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001052TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1053 SetupForMultiSendStream();
1054 // Create send streams.
1055 for (uint32_t ssrc : kSsrcs4) {
1056 EXPECT_TRUE(
1057 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1058 }
1059 // Configure one stream to be limited by the stream config, another to be
1060 // limited by the global max, and the third one with no per-stream limit
1061 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001062 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001063 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1064 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1065 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1066
1067 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1068 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1069 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1070
1071 // Remove the global cap; the streams should switch to their respective
1072 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001073 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001074 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1075 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1076 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1077}
1078
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001079// Test that GetRtpSendParameters returns the currently configured codecs.
1080TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001081 EXPECT_TRUE(SetupSendStream());
1082 cricket::AudioSendParameters parameters;
1083 parameters.codecs.push_back(kIsacCodec);
1084 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001085 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001086
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001087 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001088 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001089 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1090 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001091}
1092
1093// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001094TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001095 EXPECT_TRUE(SetupSendStream());
1096 cricket::AudioSendParameters parameters;
1097 parameters.codecs.push_back(kIsacCodec);
1098 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001099 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001100
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001101 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001102
1103 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001104 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001105
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001106 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1107 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1108 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1109}
1110
1111// Test that GetRtpReceiveParameters returns the currently configured codecs.
1112TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1113 EXPECT_TRUE(SetupRecvStream());
1114 cricket::AudioRecvParameters parameters;
1115 parameters.codecs.push_back(kIsacCodec);
1116 parameters.codecs.push_back(kPcmuCodec);
1117 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1118
1119 webrtc::RtpParameters rtp_parameters =
1120 channel_->GetRtpReceiveParameters(kSsrc1);
1121 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1122 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1123 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1124}
1125
1126// Test that if we set/get parameters multiple times, we get the same results.
1127TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1128 EXPECT_TRUE(SetupRecvStream());
1129 cricket::AudioRecvParameters parameters;
1130 parameters.codecs.push_back(kIsacCodec);
1131 parameters.codecs.push_back(kPcmuCodec);
1132 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1133
1134 webrtc::RtpParameters initial_params =
1135 channel_->GetRtpReceiveParameters(kSsrc1);
1136
1137 // We should be able to set the params we just got.
1138 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1139
1140 // ... And this shouldn't change the params returned by
1141 // GetRtpReceiveParameters.
1142 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1143 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001144}
1145
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146// Test that we apply codecs properly.
1147TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001148 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001149 cricket::AudioSendParameters parameters;
1150 parameters.codecs.push_back(kIsacCodec);
1151 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001152 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001153 parameters.codecs[0].id = 96;
1154 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001155 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001156 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001157 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1158 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1159 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1160 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1161 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1162 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1163 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1164 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001165 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166}
1167
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001168// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1169// to apply.
1170TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
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());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001181 // Calling SetSendCodec again with same codec which is already set.
1182 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001183 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001184 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001185}
1186
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001187// Verify that G722 is set with 16000 samples per second to WebRTC.
1188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001189 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001190 cricket::AudioSendParameters parameters;
1191 parameters.codecs.push_back(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001192 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001193 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001194 EXPECT_STREQ("G722", gcodec.plname);
1195 EXPECT_EQ(1, gcodec.channels);
1196 EXPECT_EQ(16000, gcodec.plfreq);
1197}
1198
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001199// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001200TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001201 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001202 cricket::AudioSendParameters parameters;
1203 parameters.codecs.push_back(kOpusCodec);
1204 parameters.codecs[0].bitrate = 0;
1205 parameters.codecs[0].clockrate = 50000;
1206 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001207}
1208
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001209// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001210TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001211 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001212 cricket::AudioSendParameters parameters;
1213 parameters.codecs.push_back(kOpusCodec);
1214 parameters.codecs[0].bitrate = 0;
1215 parameters.codecs[0].channels = 0;
1216 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001217}
1218
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001219// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001220TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001221 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001222 cricket::AudioSendParameters parameters;
1223 parameters.codecs.push_back(kOpusCodec);
1224 parameters.codecs[0].bitrate = 0;
1225 parameters.codecs[0].channels = 0;
1226 parameters.codecs[0].params["stereo"] = "1";
1227 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228}
1229
1230// Test that if channel is 1 for opus and there's no stereo, we fail.
1231TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001232 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001233 cricket::AudioSendParameters parameters;
1234 parameters.codecs.push_back(kOpusCodec);
1235 parameters.codecs[0].bitrate = 0;
1236 parameters.codecs[0].channels = 1;
1237 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238}
1239
1240// Test that if channel is 1 for opus and stereo=0, we fail.
1241TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001242 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001243 cricket::AudioSendParameters parameters;
1244 parameters.codecs.push_back(kOpusCodec);
1245 parameters.codecs[0].bitrate = 0;
1246 parameters.codecs[0].channels = 1;
1247 parameters.codecs[0].params["stereo"] = "0";
1248 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001249}
1250
1251// Test that if channel is 1 for opus and stereo=1, we fail.
1252TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001253 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001254 cricket::AudioSendParameters parameters;
1255 parameters.codecs.push_back(kOpusCodec);
1256 parameters.codecs[0].bitrate = 0;
1257 parameters.codecs[0].channels = 1;
1258 parameters.codecs[0].params["stereo"] = "1";
1259 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001260}
1261
1262// Test that with bitrate=0 and no stereo,
1263// channels and bitrate are 1 and 32000.
1264TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
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;
solenberg059fb442016-10-26 05:12:24 -07001269 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001270 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001271}
1272
1273// Test that with bitrate=0 and stereo=0,
1274// channels and bitrate are 1 and 32000.
1275TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
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].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001281 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001282 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001283}
1284
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001285// Test that with bitrate=invalid and stereo=0,
1286// channels and bitrate are 1 and 32000.
1287TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
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].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001292 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001293 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001294 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001295 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001296
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001297 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001298 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001299 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001300}
1301
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001302// Test that with bitrate=0 and stereo=1,
1303// channels and bitrate are 2 and 64000.
1304TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001305 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001306 cricket::AudioSendParameters parameters;
1307 parameters.codecs.push_back(kOpusCodec);
1308 parameters.codecs[0].bitrate = 0;
1309 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001310 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001311 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001312}
1313
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001314// Test that with bitrate=invalid and stereo=1,
1315// channels and bitrate are 2 and 64000.
1316TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001317 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001318 cricket::AudioSendParameters parameters;
1319 parameters.codecs.push_back(kOpusCodec);
1320 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001321 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001322 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001323 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001324 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001325
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001326 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001327 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001328 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001329}
1330
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001331// Test that with bitrate=N and stereo unset,
1332// channels and bitrate are 1 and N.
1333TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001334 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 cricket::AudioSendParameters parameters;
1336 parameters.codecs.push_back(kOpusCodec);
1337 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001338 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001339 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001340 EXPECT_EQ(111, gcodec.pltype);
1341 EXPECT_EQ(96000, gcodec.rate);
1342 EXPECT_STREQ("opus", gcodec.plname);
1343 EXPECT_EQ(1, gcodec.channels);
1344 EXPECT_EQ(48000, gcodec.plfreq);
1345}
1346
1347// Test that with bitrate=N and stereo=0,
1348// channels and bitrate are 1 and N.
1349TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001350 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001351 cricket::AudioSendParameters parameters;
1352 parameters.codecs.push_back(kOpusCodec);
1353 parameters.codecs[0].bitrate = 30000;
1354 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001355 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001356 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001357}
1358
1359// Test that with bitrate=N and without any parameters,
1360// channels and bitrate are 1 and N.
1361TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001362 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 cricket::AudioSendParameters parameters;
1364 parameters.codecs.push_back(kOpusCodec);
1365 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001366 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001367 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001368}
1369
1370// Test that with bitrate=N and stereo=1,
1371// channels and bitrate are 2 and N.
1372TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
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"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001378 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001379 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001380}
1381
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001382// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1383// Also test that the "maxaveragebitrate" can't be set to values outside the
1384// range of 6000 and 510000
1385TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001386 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001387 cricket::AudioSendParameters parameters;
1388 parameters.codecs.push_back(kOpusCodec);
1389 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001390 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001391 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001392 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001393 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001394
1395 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001396 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001397 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001398 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001399
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001400 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001401 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001402 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001403}
1404
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001405// Test that we can enable NACK with opus as caller.
1406TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001407 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001408 cricket::AudioSendParameters parameters;
1409 parameters.codecs.push_back(kOpusCodec);
1410 parameters.codecs[0].AddFeedbackParam(
1411 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1412 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001413 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001414 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001415 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416}
1417
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001418// Test that we can enable NACK with opus as callee.
1419TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001420 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001421 cricket::AudioSendParameters parameters;
1422 parameters.codecs.push_back(kOpusCodec);
1423 parameters.codecs[0].AddFeedbackParam(
1424 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1425 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001426 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001427 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001428 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001429 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001430
1431 EXPECT_TRUE(channel_->AddSendStream(
1432 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001433 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001434}
1435
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001436// Test that we can enable NACK on receive streams.
1437TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001438 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001439 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001440 cricket::AudioSendParameters parameters;
1441 parameters.codecs.push_back(kOpusCodec);
1442 parameters.codecs[0].AddFeedbackParam(
1443 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1444 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001445 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001446 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001447 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001448 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001449 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450}
1451
1452// Test that we can disable NACK.
1453TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001454 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001455 cricket::AudioSendParameters parameters;
1456 parameters.codecs.push_back(kOpusCodec);
1457 parameters.codecs[0].AddFeedbackParam(
1458 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1459 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001460 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001461 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001463 parameters.codecs.clear();
1464 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001465 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001466 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001467}
1468
1469// Test that we can disable NACK on receive streams.
1470TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001471 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001472 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001473 cricket::AudioSendParameters parameters;
1474 parameters.codecs.push_back(kOpusCodec);
1475 parameters.codecs[0].AddFeedbackParam(
1476 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1477 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001478 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001479 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001480 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001481
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001482 parameters.codecs.clear();
1483 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001484 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001485 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001486 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487}
1488
1489// Test that NACK is enabled on a new receive stream.
1490TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001491 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001492 cricket::AudioSendParameters parameters;
1493 parameters.codecs.push_back(kIsacCodec);
1494 parameters.codecs.push_back(kCn16000Codec);
1495 parameters.codecs[0].AddFeedbackParam(
1496 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1497 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001498 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001499 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001500
solenberg8189b022016-06-14 12:13:00 -07001501 EXPECT_TRUE(AddRecvStream(kSsrc2));
1502 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1503 EXPECT_TRUE(AddRecvStream(kSsrc3));
1504 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505}
1506
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001507// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001508TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001509 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001510 cricket::AudioSendParameters parameters;
1511 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001512 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001513 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001514}
1515
1516// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001517TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001518 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001519 cricket::AudioSendParameters parameters;
1520 parameters.codecs.push_back(kOpusCodec);
1521 parameters.codecs[0].bitrate = 0;
1522 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001523 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001524 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001525}
1526
1527// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001528TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001529 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001530 cricket::AudioSendParameters parameters;
1531 parameters.codecs.push_back(kOpusCodec);
1532 parameters.codecs[0].bitrate = 0;
1533 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001534 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001535 EXPECT_TRUE(GetCodecFec(kSsrc1));
1536 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001537}
1538
1539// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001540TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001541 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001542 cricket::AudioSendParameters parameters;
1543 parameters.codecs.push_back(kOpusCodec);
1544 parameters.codecs[0].bitrate = 0;
1545 parameters.codecs[0].params["stereo"] = "1";
1546 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001547 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001548 EXPECT_TRUE(GetCodecFec(kSsrc1));
1549 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001550}
1551
1552// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001553TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001554 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001555 cricket::AudioSendParameters parameters;
1556 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001557 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001558 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001559}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001560
1561// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1562TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
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(kIsacCodec);
1566 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001567 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001568 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001569}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001570
1571// Test that Opus FEC status can be changed.
1572TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001573 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001574 cricket::AudioSendParameters parameters;
1575 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001576 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001577 EXPECT_FALSE(GetCodecFec(kSsrc1));
1578
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001579 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001580 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001581 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001582}
1583
stefanba4c0e42016-02-04 04:12:24 -08001584TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001585 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001586 cricket::AudioSendParameters send_parameters;
1587 send_parameters.codecs.push_back(kOpusCodec);
1588 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001589 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001590
1591 cricket::AudioRecvParameters recv_parameters;
1592 recv_parameters.codecs.push_back(kIsacCodec);
1593 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001594 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001595 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1596 EXPECT_FALSE(
1597 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1598
ossudedfd282016-06-14 07:12:39 -07001599 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001600 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001601 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1602 EXPECT_TRUE(
1603 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1604}
1605
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001606// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1607TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
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(kOpusCodec);
1611 parameters.codecs[0].bitrate = 0;
1612 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001613 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001614 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1615 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001616
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001617 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001618 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001619 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001620}
1621
1622// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1623TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001624 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001625 cricket::AudioSendParameters parameters;
1626 parameters.codecs.push_back(kOpusCodec);
1627 parameters.codecs[0].bitrate = 0;
1628 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001629 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001630 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1631 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001632
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001633 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001634 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001635 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001636}
1637
1638// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1639TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001640 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 cricket::AudioSendParameters parameters;
1642 parameters.codecs.push_back(kOpusCodec);
1643 parameters.codecs[0].bitrate = 0;
1644 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001645 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001646 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1647 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001648
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001650 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001651 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001652}
1653
1654// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1655TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001656 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001657 cricket::AudioSendParameters parameters;
1658 parameters.codecs.push_back(kOpusCodec);
1659 parameters.codecs[0].bitrate = 0;
1660 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001661 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001662 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1663 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001664
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001665 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001666 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001667 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001668}
1669
1670// Test 24000 < maxplaybackrate triggers Opus full band mode.
1671TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001672 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001673 cricket::AudioSendParameters parameters;
1674 parameters.codecs.push_back(kOpusCodec);
1675 parameters.codecs[0].bitrate = 0;
1676 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001677 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001678 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1679 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001680
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001682 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001683 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001684}
1685
1686// Test Opus that without maxplaybackrate, default playback rate is used.
1687TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001688 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001689 cricket::AudioSendParameters parameters;
1690 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001691 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001692 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001693}
1694
1695// Test the with non-Opus, maxplaybackrate has no effect.
1696TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001697 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001698 cricket::AudioSendParameters parameters;
1699 parameters.codecs.push_back(kIsacCodec);
1700 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001701 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001702 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001703}
1704
1705// Test maxplaybackrate can be set on two streams.
1706TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001707 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001708 cricket::AudioSendParameters parameters;
1709 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001710 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001711 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001712
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001713 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001714 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001715 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001716
1717 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001718 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001719}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001720
Minyue Li7100dcd2015-03-27 05:05:59 +01001721// Test that with usedtx=0, Opus DTX is off.
1722TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001723 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001724 cricket::AudioSendParameters parameters;
1725 parameters.codecs.push_back(kOpusCodec);
1726 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001727 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001728 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001729}
1730
1731// Test that with usedtx=1, Opus DTX is on.
1732TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001733 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001734 cricket::AudioSendParameters parameters;
1735 parameters.codecs.push_back(kOpusCodec);
1736 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001737 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001738 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001739}
1740
1741// Test that usedtx=1 works with stereo Opus.
1742TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001743 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001744 cricket::AudioSendParameters parameters;
1745 parameters.codecs.push_back(kOpusCodec);
1746 parameters.codecs[0].params["usedtx"] = "1";
1747 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001748 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001749 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001750}
1751
1752// Test that usedtx=1 does not work with non Opus.
1753TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001754 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001755 cricket::AudioSendParameters parameters;
1756 parameters.codecs.push_back(kIsacCodec);
1757 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001758 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001759 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001760}
1761
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001762// Test that we can switch back and forth between Opus and ISAC with CN.
1763TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001764 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001765
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001766 cricket::AudioSendParameters opus_parameters;
1767 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001768 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001769 {
1770 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1771 EXPECT_EQ(111, gcodec.pltype);
1772 EXPECT_STREQ("opus", gcodec.plname);
1773 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001775 cricket::AudioSendParameters isac_parameters;
1776 isac_parameters.codecs.push_back(kIsacCodec);
1777 isac_parameters.codecs.push_back(kCn16000Codec);
1778 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001779 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001780 {
1781 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1782 EXPECT_EQ(103, gcodec.pltype);
1783 EXPECT_STREQ("ISAC", gcodec.plname);
1784 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785
solenberg059fb442016-10-26 05:12:24 -07001786 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001787 {
1788 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1789 EXPECT_EQ(111, gcodec.pltype);
1790 EXPECT_STREQ("opus", gcodec.plname);
1791 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792}
1793
1794// Test that we handle various ways of specifying bitrate.
1795TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001796 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001797 cricket::AudioSendParameters parameters;
1798 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001799 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001800 {
1801 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1802 EXPECT_EQ(103, gcodec.pltype);
1803 EXPECT_STREQ("ISAC", gcodec.plname);
1804 EXPECT_EQ(32000, gcodec.rate);
1805 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001806
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001807 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001808 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001809 {
1810 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1811 EXPECT_EQ(103, gcodec.pltype);
1812 EXPECT_STREQ("ISAC", gcodec.plname);
1813 EXPECT_EQ(-1, gcodec.rate);
1814 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001815 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001816 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001817 {
1818 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1819 EXPECT_EQ(103, gcodec.pltype);
1820 EXPECT_STREQ("ISAC", gcodec.plname);
1821 EXPECT_EQ(28000, gcodec.rate);
1822 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001823
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001824 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001825 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001826 {
1827 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1828 EXPECT_EQ(0, gcodec.pltype);
1829 EXPECT_STREQ("PCMU", gcodec.plname);
1830 EXPECT_EQ(64000, gcodec.rate);
1831 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001833 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001834 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001835 {
1836 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1837 EXPECT_EQ(0, gcodec.pltype);
1838 EXPECT_STREQ("PCMU", gcodec.plname);
1839 EXPECT_EQ(64000, gcodec.rate);
1840 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001841
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001842 parameters.codecs[0] = kOpusCodec;
1843 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001844 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001845 {
1846 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1847 EXPECT_EQ(111, gcodec.pltype);
1848 EXPECT_STREQ("opus", gcodec.plname);
1849 EXPECT_EQ(32000, gcodec.rate);
1850 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851}
1852
Brave Yao5225dd82015-03-26 07:39:19 +08001853// Test that we could set packet size specified in kCodecParamPTime.
1854TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001855 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001856 cricket::AudioSendParameters parameters;
1857 parameters.codecs.push_back(kOpusCodec);
1858 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001859 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001860 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001861
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001862 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001863 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001864 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001865
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001866 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001867 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001868 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001869
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001870 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1871 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001872 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001873 EXPECT_EQ(480, GetCodecPacSize(
1874 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001875
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001876 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1877 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001878 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001879 EXPECT_EQ(640, GetCodecPacSize(
1880 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001881}
1882
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001883// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001885 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001886 cricket::AudioSendParameters parameters;
1887 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001888}
1889
1890// Test that we can set send codecs even with telephone-event codec as the first
1891// one on the list.
1892TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001893 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001894 cricket::AudioSendParameters parameters;
solenberg2779bab2016-11-17 04:45:19 -08001895 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 parameters.codecs.push_back(kIsacCodec);
1897 parameters.codecs.push_back(kPcmuCodec);
1898 parameters.codecs[0].id = 98; // DTMF
1899 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001900 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001901 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001902 EXPECT_EQ(96, gcodec.pltype);
1903 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001904 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001905}
1906
solenberg31642aa2016-03-14 08:00:37 -07001907// Test that payload type range is limited for telephone-event codec.
1908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001909 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001910 cricket::AudioSendParameters parameters;
solenbergffbbcac2016-11-17 05:25:37 -08001911 parameters.codecs.push_back(kTelephoneEventCodec2);
solenberg31642aa2016-03-14 08:00:37 -07001912 parameters.codecs.push_back(kIsacCodec);
1913 parameters.codecs[0].id = 0; // DTMF
1914 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001915 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001916 EXPECT_TRUE(channel_->CanInsertDtmf());
1917 parameters.codecs[0].id = 128; // DTMF
1918 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1919 EXPECT_FALSE(channel_->CanInsertDtmf());
1920 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001921 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001922 EXPECT_TRUE(channel_->CanInsertDtmf());
1923 parameters.codecs[0].id = -1; // DTMF
1924 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1925 EXPECT_FALSE(channel_->CanInsertDtmf());
1926}
1927
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001928// Test that we can set send codecs even with CN codec as the first
1929// one on the list.
1930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001931 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001932 cricket::AudioSendParameters parameters;
1933 parameters.codecs.push_back(kCn16000Codec);
1934 parameters.codecs.push_back(kIsacCodec);
1935 parameters.codecs.push_back(kPcmuCodec);
1936 parameters.codecs[0].id = 98; // wideband CN
1937 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001938 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001939 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1940 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1941 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1942 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1943 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944}
1945
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001946// Test that we set VAD and DTMF types correctly as caller.
1947TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001948 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001949 cricket::AudioSendParameters parameters;
1950 parameters.codecs.push_back(kIsacCodec);
1951 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001953 parameters.codecs.push_back(kCn16000Codec);
1954 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08001955 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001956 parameters.codecs[0].id = 96;
1957 parameters.codecs[2].id = 97; // wideband CN
1958 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001959 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001960 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1961 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1962 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1963 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1964 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1965 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1966 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001967 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968}
1969
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001970// Test that we set VAD and DTMF types correctly as callee.
1971TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001972 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 cricket::AudioSendParameters parameters;
1974 parameters.codecs.push_back(kIsacCodec);
1975 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001976 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001977 parameters.codecs.push_back(kCn16000Codec);
1978 parameters.codecs.push_back(kCn8000Codec);
solenbergffbbcac2016-11-17 05:25:37 -08001979 parameters.codecs.push_back(kTelephoneEventCodec2);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001980 parameters.codecs[0].id = 96;
1981 parameters.codecs[2].id = 97; // wideband CN
1982 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001983 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001984 EXPECT_TRUE(channel_->AddSendStream(
1985 cricket::StreamParams::CreateLegacy(kSsrc1)));
1986
minyue7a973442016-10-20 03:27:12 -07001987 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1988 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1989 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1990 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1991 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1992 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1993 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001994 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001995}
1996
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997// Test that we only apply VAD if we have a CN codec that matches the
1998// send codec clockrate.
1999TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002000 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002001 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002002 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002003 parameters.codecs.push_back(kIsacCodec);
2004 parameters.codecs.push_back(kCn16000Codec);
2005 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002006 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002007 {
2008 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2009 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2010 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2011 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2012 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2013 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2014 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002016 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002017 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002018 {
2019 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2020 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2021 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2022 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002023 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002024 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07002025 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002026 {
2027 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2028 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2029 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2030 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2031 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2032 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2033 }
Brave Yao5225dd82015-03-26 07:39:19 +08002034 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002035 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07002036 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002037 {
2038 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2039 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2040 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2041 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002042}
2043
2044// Test that we perform case-insensitive matching of codec names.
2045TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002046 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002047 cricket::AudioSendParameters parameters;
2048 parameters.codecs.push_back(kIsacCodec);
2049 parameters.codecs.push_back(kPcmuCodec);
2050 parameters.codecs.push_back(kCn16000Codec);
2051 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002052 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002053 parameters.codecs[0].name = "iSaC";
2054 parameters.codecs[0].id = 96;
2055 parameters.codecs[2].id = 97; // wideband CN
2056 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002057 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002058 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2059 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2060 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2061 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2062 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2063 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2064 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002065 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002066}
2067
stefanba4c0e42016-02-04 04:12:24 -08002068class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2069 public:
2070 WebRtcVoiceEngineWithSendSideBweTest()
2071 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2072};
2073
2074TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2075 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002076 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002077 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002078 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2079 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2080 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002081 extension.id);
2082 return;
2083 }
2084 }
2085 FAIL() << "Transport sequence number extension not in header-extension list.";
2086}
2087
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002088// Test support for audio level header extension.
2089TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002090 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002091}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002092TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002093 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002094}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002095
solenbergd4adce42016-11-17 06:26:52 -08002096// Test support for transport sequence number header extension.
2097TEST_F(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
2098 TestSetSendRtpHeaderExtensions(
2099 webrtc::RtpExtension::kTransportSequenceNumberUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002100}
solenbergd4adce42016-11-17 06:26:52 -08002101TEST_F(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
2102 TestSetRecvRtpHeaderExtensions(
2103 webrtc::RtpExtension::kTransportSequenceNumberUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104}
2105
solenberg1ac56142015-10-13 03:58:19 -07002106// Test that we can create a channel and start sending on it.
2107TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002108 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002109 SetSendParameters(send_parameters_);
2110 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002111 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002112 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002113 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2114}
2115
2116// Test that a channel will send if and only if it has a source and is enabled
2117// for sending.
2118TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002119 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002120 SetSendParameters(send_parameters_);
2121 SetAudioSend(kSsrc1, true, nullptr);
2122 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002123 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002124 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002125 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002126 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002127 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002128}
2129
solenberg94218532016-06-16 10:53:22 -07002130// Test that a channel is muted/unmuted.
2131TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2132 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002133 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002134 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002135 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002136 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002137 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002138 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2139}
2140
solenberg6d6e7c52016-04-13 09:07:30 -07002141// Test that SetSendParameters() does not alter a stream's send state.
2142TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2143 EXPECT_TRUE(SetupSendStream());
2144 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2145
2146 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002147 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002148 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2149
2150 // Changing RTP header extensions will recreate the AudioSendStream.
2151 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002152 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002153 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002154 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2155
2156 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002157 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002158 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2159
2160 // Changing RTP header extensions will recreate the AudioSendStream.
2161 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002162 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002163 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2164}
2165
solenberg1ac56142015-10-13 03:58:19 -07002166// Test that we can create a channel and start playing out on it.
2167TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002168 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002169 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002170 channel_->SetPlayout(true);
2171 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2172 channel_->SetPlayout(false);
2173 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174}
2175
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002176// Test that we can add and remove send streams.
2177TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2178 SetupForMultiSendStream();
2179
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002180 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002181 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002182
solenbergc96df772015-10-21 13:01:53 -07002183 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002184 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002185 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002186 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002187 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002188 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002189 }
tfarina5237aaf2015-11-10 23:44:30 -08002190 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002191
solenbergc96df772015-10-21 13:01:53 -07002192 // Delete the send streams.
2193 for (uint32_t ssrc : kSsrcs4) {
2194 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002195 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002196 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002197 }
solenbergc96df772015-10-21 13:01:53 -07002198 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002199}
2200
2201// Test SetSendCodecs correctly configure the codecs in all send streams.
2202TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2203 SetupForMultiSendStream();
2204
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002205 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002206 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002207 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002208 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002209 }
2210
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002211 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002212 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002213 parameters.codecs.push_back(kIsacCodec);
2214 parameters.codecs.push_back(kCn16000Codec);
2215 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002216 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002217
2218 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002219 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002220 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2221 const auto& send_codec_spec =
2222 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2223 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2224 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2225 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2226 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2227 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002228 }
2229
minyue7a973442016-10-20 03:27:12 -07002230 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002231 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002232 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002233 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002234 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2235 const auto& send_codec_spec =
2236 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2237 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2238 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2239 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2240 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002241 }
2242}
2243
2244// Test we can SetSend on all send streams correctly.
2245TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2246 SetupForMultiSendStream();
2247
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002248 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002249 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002250 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002251 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002252 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002253 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002254 }
2255
2256 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002257 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002258 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002260 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002261 }
2262
2263 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002264 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002265 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002266 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002267 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002268 }
2269}
2270
2271// Test we can set the correct statistics on all send streams.
2272TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2273 SetupForMultiSendStream();
2274
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002275 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002276 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002277 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002278 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002279 }
solenberg85a04962015-10-27 03:35:21 -07002280
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002281 // Create a receive stream to check that none of the send streams end up in
2282 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002283 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002284
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002285 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002286 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002287 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002288 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002289
solenberg85a04962015-10-27 03:35:21 -07002290 // Check stats for the added streams.
2291 {
2292 cricket::VoiceMediaInfo info;
2293 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002294
solenberg85a04962015-10-27 03:35:21 -07002295 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002296 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002297 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002298 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002299 }
hbos1acfbd22016-11-17 23:43:29 -08002300 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002301
2302 // We have added one receive stream. We should see empty stats.
2303 EXPECT_EQ(info.receivers.size(), 1u);
2304 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002305 }
solenberg1ac56142015-10-13 03:58:19 -07002306
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002307 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002308 {
2309 cricket::VoiceMediaInfo info;
2310 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2311 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002312 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002313 EXPECT_EQ(0u, info.receivers.size());
2314 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002315
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002316 // Deliver a new packet - a default receive stream should be created and we
2317 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002318 {
2319 cricket::VoiceMediaInfo info;
2320 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2321 SetAudioReceiveStreamStats();
2322 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002323 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002324 EXPECT_EQ(1u, info.receivers.size());
2325 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002326 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002327 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002328}
2329
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002330// Test that we can add and remove receive streams, and do proper send/playout.
2331// We can receive on multiple streams while sending one stream.
2332TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002333 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334
solenberg1ac56142015-10-13 03:58:19 -07002335 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002336 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002337 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338
solenberg1ac56142015-10-13 03:58:19 -07002339 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002340 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002341 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002342 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002343
solenberg1ac56142015-10-13 03:58:19 -07002344 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002345 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002346
2347 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002348 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002349 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2350 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351
2352 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002353 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002354 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355
2356 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002357 channel_->SetPlayout(false);
2358 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2359 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360
aleloi84ef6152016-08-04 05:28:21 -07002361 // Restart playout and make sure recv streams are played out.
2362 channel_->SetPlayout(true);
2363 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2364 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365
aleloi84ef6152016-08-04 05:28:21 -07002366 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2368 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369}
2370
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002371// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002372// and start sending on it.
2373TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002374 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002375 cricket::AudioOptions options_adjust_agc;
2376 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377 webrtc::AgcConfig agc_config;
2378 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2379 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002380 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002381 SetSendParameters(send_parameters_);
2382 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002383 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2385 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002386 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002387 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002388 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389}
2390
wu@webrtc.org97077a32013-10-25 21:18:33 +00002391TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002392 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002393 EXPECT_CALL(adm_,
2394 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002395 webrtc::AgcConfig agc_config;
2396 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2397 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002398 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2399 send_parameters_.options.tx_agc_digital_compression_gain =
2400 rtc::Optional<uint16_t>(9);
2401 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2402 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002403 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002404 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2405 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2406 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2407 EXPECT_TRUE(agc_config.limiterEnable);
2408
2409 // Check interaction with adjust_agc_delta. Both should be respected, for
2410 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002411 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002412 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002413 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2414 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2415}
2416
wu@webrtc.org97077a32013-10-25 21:18:33 +00002417TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002418 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002419 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2420 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002421 send_parameters_.options.recording_sample_rate =
2422 rtc::Optional<uint32_t>(48000);
2423 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002424 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002425}
2426
minyue6b825df2016-10-31 04:08:32 -07002427TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2428 EXPECT_TRUE(SetupSendStream());
2429 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2430 send_parameters_.options.audio_network_adaptor_config =
2431 rtc::Optional<std::string>("1234");
2432 SetSendParameters(send_parameters_);
2433 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2434 GetAudioNetworkAdaptorConfig(kSsrc1));
2435}
2436
2437TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2438 EXPECT_TRUE(SetupSendStream());
2439 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2440 send_parameters_.options.audio_network_adaptor_config =
2441 rtc::Optional<std::string>("1234");
2442 SetSendParameters(send_parameters_);
2443 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2444 GetAudioNetworkAdaptorConfig(kSsrc1));
2445 const int initial_num = call_.GetNumCreatedSendStreams();
2446 cricket::AudioOptions options;
2447 options.audio_network_adaptor = rtc::Optional<bool>(false);
2448 SetAudioSend(kSsrc1, true, nullptr, &options);
2449 // AudioSendStream expected to be recreated.
2450 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2451 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2452}
2453
2454TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2455 EXPECT_TRUE(SetupSendStream());
2456 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2457 send_parameters_.options.audio_network_adaptor_config =
2458 rtc::Optional<std::string>("1234");
2459 SetSendParameters(send_parameters_);
2460 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2461 GetAudioNetworkAdaptorConfig(kSsrc1));
2462 const int initial_num = call_.GetNumCreatedSendStreams();
2463 cricket::AudioOptions options;
2464 options.audio_network_adaptor = rtc::Optional<bool>();
2465 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2466 // adaptor.
2467 SetAudioSend(kSsrc1, true, nullptr, &options);
2468 // AudioSendStream not expected to be recreated.
2469 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2470 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2471 GetAudioNetworkAdaptorConfig(kSsrc1));
2472}
2473
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002474// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002475// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002476TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002477 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002478 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479}
2480
2481TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2482 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002483 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002484 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002485 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002486 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002487 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002488 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002489 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002490
solenberg85a04962015-10-27 03:35:21 -07002491 // Check stats for the added streams.
2492 {
2493 cricket::VoiceMediaInfo info;
2494 EXPECT_EQ(true, channel_->GetStats(&info));
2495
2496 // We have added one send stream. We should see the stats we've set.
2497 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002498 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002499 // We have added one receive stream. We should see empty stats.
2500 EXPECT_EQ(info.receivers.size(), 1u);
2501 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2502 }
solenberg1ac56142015-10-13 03:58:19 -07002503
solenberg566ef242015-11-06 15:34:49 -08002504 // Start sending - this affects some reported stats.
2505 {
2506 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002507 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002508 EXPECT_EQ(true, channel_->GetStats(&info));
2509 VerifyVoiceSenderInfo(info.senders[0], true);
hbos1acfbd22016-11-17 23:43:29 -08002510 VerifyVoiceSendRecvCodecs(info);
solenberg566ef242015-11-06 15:34:49 -08002511 }
2512
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002513 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002514 {
2515 cricket::VoiceMediaInfo info;
2516 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2517 EXPECT_EQ(true, channel_->GetStats(&info));
2518 EXPECT_EQ(1u, info.senders.size());
2519 EXPECT_EQ(0u, info.receivers.size());
2520 }
solenberg1ac56142015-10-13 03:58:19 -07002521
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002522 // Deliver a new packet - a default receive stream should be created and we
2523 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002524 {
2525 cricket::VoiceMediaInfo info;
2526 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2527 SetAudioReceiveStreamStats();
2528 EXPECT_EQ(true, channel_->GetStats(&info));
2529 EXPECT_EQ(1u, info.senders.size());
2530 EXPECT_EQ(1u, info.receivers.size());
2531 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002532 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002533 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002534}
2535
2536// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002537// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002538TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002539 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002540 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002541 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002542 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002543}
2544
2545// Test that the local SSRC is the same on sending and receiving channels if the
2546// receive channel is created before the send channel.
2547TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002548 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002549 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002551 cricket::StreamParams::CreateLegacy(kSsrc1)));
2552 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2553 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002554}
2555
2556// Test that we can properly receive packets.
2557TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002558 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002559 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002561
2562 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2563 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002564}
2565
2566// Test that we can properly receive packets on multiple streams.
2567TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002568 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002569 const uint32_t ssrc1 = 1;
2570 const uint32_t ssrc2 = 2;
2571 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002572 EXPECT_TRUE(AddRecvStream(ssrc1));
2573 EXPECT_TRUE(AddRecvStream(ssrc2));
2574 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002575 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002576 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002577 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002578 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002579 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580 }
mflodman3d7db262016-04-29 00:57:13 -07002581
2582 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2583 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2584 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2585
2586 EXPECT_EQ(s1.received_packets(), 0);
2587 EXPECT_EQ(s2.received_packets(), 0);
2588 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002589
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002590 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002591 EXPECT_EQ(s1.received_packets(), 0);
2592 EXPECT_EQ(s2.received_packets(), 0);
2593 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002594
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002596 EXPECT_EQ(s1.received_packets(), 1);
2597 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2598 EXPECT_EQ(s2.received_packets(), 0);
2599 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002600
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002601 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002602 EXPECT_EQ(s1.received_packets(), 1);
2603 EXPECT_EQ(s2.received_packets(), 1);
2604 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2605 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002606
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002607 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002608 EXPECT_EQ(s1.received_packets(), 1);
2609 EXPECT_EQ(s2.received_packets(), 1);
2610 EXPECT_EQ(s3.received_packets(), 1);
2611 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002612
mflodman3d7db262016-04-29 00:57:13 -07002613 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2614 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2615 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002616}
2617
solenberg7e63ef02015-11-20 00:19:43 -08002618// Test that receiving on an unsignalled stream works (default channel will be
2619// created).
2620TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002621 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002622 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2623
solenberg7e63ef02015-11-20 00:19:43 -08002624 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002625
2626 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2627 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2628 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002629}
2630
2631// Test that receiving on an unsignalled stream works (default channel will be
2632// created), and that packets will be forwarded to the default channel
2633// regardless of their SSRCs.
2634TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002635 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002636 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002637 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2638
mflodman3d7db262016-04-29 00:57:13 -07002639 // Note that ssrc = 0 is not supported.
2640 uint32_t ssrc = 1;
2641 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002642 rtc::SetBE32(&packet[8], ssrc);
2643 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002644
2645 // Verify we only have one default stream.
2646 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2647 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2648 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002649 }
mflodman3d7db262016-04-29 00:57:13 -07002650
2651 // Sending the same ssrc again should not create a new stream.
2652 --ssrc;
2653 DeliverPacket(packet, sizeof(packet));
2654 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2655 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2656 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002657}
2658
2659// Test that a default channel is created even after a signalled stream has been
2660// added, and that this stream will get any packets for unknown SSRCs.
2661TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002662 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002663 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002664 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2665
2666 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002667 const uint32_t signaled_ssrc = 1;
2668 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002669 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002670 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002671 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2672 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002673
2674 // Note that the first unknown SSRC cannot be 0, because we only support
2675 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002676 const uint32_t unsignaled_ssrc = 7011;
2677 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002678 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002679 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2680 packet, sizeof(packet)));
2681 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2682
2683 DeliverPacket(packet, sizeof(packet));
2684 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2685
2686 rtc::SetBE32(&packet[8], signaled_ssrc);
2687 DeliverPacket(packet, sizeof(packet));
2688 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2689 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002690}
2691
solenberg0a617e22015-10-20 15:49:38 -07002692// Test that we properly handle failures to add a receive stream.
2693TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002694 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002695 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002696 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002697}
2698
solenberg0a617e22015-10-20 15:49:38 -07002699// Test that we properly handle failures to add a send stream.
2700TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002701 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002702 voe_.set_fail_create_channel(true);
2703 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2704}
2705
solenberg1ac56142015-10-13 03:58:19 -07002706// Test that AddRecvStream creates new stream.
2707TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002708 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002709 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002710 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002711 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002712}
2713
2714// Test that after adding a recv stream, we do not decode more codecs than
2715// those previously passed into SetRecvCodecs.
2716TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002717 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002718 cricket::AudioRecvParameters parameters;
2719 parameters.codecs.push_back(kIsacCodec);
2720 parameters.codecs.push_back(kPcmuCodec);
2721 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002722 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723 int channel_num2 = voe_.GetLastChannel();
2724 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002725 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002726 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002727 gcodec.channels = 2;
2728 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2729}
2730
2731// Test that we properly clean up any streams that were added, even if
2732// not explicitly removed.
2733TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002734 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002735 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002736 EXPECT_TRUE(AddRecvStream(1));
2737 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002738 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2739 delete channel_;
2740 channel_ = NULL;
2741 EXPECT_EQ(0, voe_.GetNumChannels());
2742}
2743
wu@webrtc.org78187522013-10-07 23:32:02 +00002744TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002745 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002746 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002747}
2748
2749TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002750 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002751 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002752 // Manually delete channel to simulate a failure.
2753 int channel = voe_.GetLastChannel();
2754 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2755 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002756 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002757 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002758 EXPECT_NE(channel, new_channel);
2759 // The last created channel is deleted too.
2760 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002761}
2762
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002763// Test the InsertDtmf on default send stream as caller.
2764TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002765 TestInsertDtmf(0, true, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766}
2767
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002768// Test the InsertDtmf on default send stream as callee
2769TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002770 TestInsertDtmf(0, false, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002771}
2772
2773// Test the InsertDtmf on specified send stream as caller.
2774TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002775 TestInsertDtmf(kSsrc1, true, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002776}
2777
2778// Test the InsertDtmf on specified send stream as callee.
2779TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002780 TestInsertDtmf(kSsrc1, false, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002781}
2782
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002783TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002784 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002785 EXPECT_CALL(adm_,
2786 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2787 EXPECT_CALL(adm_,
2788 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2789 EXPECT_CALL(adm_,
2790 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002791 bool ec_enabled;
2792 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002793 webrtc::AecmModes aecm_mode;
2794 bool cng_enabled;
2795 bool agc_enabled;
2796 webrtc::AgcModes agc_mode;
2797 webrtc::AgcConfig agc_config;
2798 bool ns_enabled;
2799 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800 bool stereo_swapping_enabled;
2801 bool typing_detection_enabled;
2802 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002803 voe_.GetAecmMode(aecm_mode, cng_enabled);
2804 voe_.GetAgcStatus(agc_enabled, agc_mode);
2805 voe_.GetAgcConfig(agc_config);
2806 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2808 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2809 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002810 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811 EXPECT_FALSE(cng_enabled);
2812 EXPECT_TRUE(agc_enabled);
2813 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2814 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002815 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002816 EXPECT_FALSE(stereo_swapping_enabled);
2817 EXPECT_TRUE(typing_detection_enabled);
2818 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2819 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002820 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2821 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822
solenberg246b8172015-12-08 09:50:23 -08002823 // Nothing set in AudioOptions, so everything should be as default.
2824 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002825 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002826 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827 voe_.GetAecmMode(aecm_mode, cng_enabled);
2828 voe_.GetAgcStatus(agc_enabled, agc_mode);
2829 voe_.GetAgcConfig(agc_config);
2830 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002831 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2832 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2833 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002834 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002835 EXPECT_FALSE(cng_enabled);
2836 EXPECT_TRUE(agc_enabled);
2837 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2838 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002839 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002840 EXPECT_FALSE(stereo_swapping_enabled);
2841 EXPECT_TRUE(typing_detection_enabled);
2842 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2843 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002844 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2845 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002846
2847 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002848 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002849 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002850 voe_.GetEcStatus(ec_enabled, ec_mode);
2851 EXPECT_FALSE(ec_enabled);
2852
2853 // Turn echo cancellation back on, with settings, and make sure
2854 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002855 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002856 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002857 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002858 voe_.GetAecmMode(aecm_mode, cng_enabled);
2859 voe_.GetAgcStatus(agc_enabled, agc_mode);
2860 voe_.GetAgcConfig(agc_config);
2861 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002862 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2863 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2864 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002865 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002866 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);
2874
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002875 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2876 // control.
solenberg246b8172015-12-08 09:50:23 -08002877 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002878 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002879 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002880 voe_.GetAecmMode(aecm_mode, cng_enabled);
2881 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002882 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002883 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2884
2885 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002886 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2887 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2888 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002889 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002890 voe_.GetEcStatus(ec_enabled, ec_mode);
2891 EXPECT_FALSE(ec_enabled);
2892 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002893 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002894 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002895 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002896 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002897 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002898 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2899
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002900 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002901 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002902 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903 voe_.GetAgcStatus(agc_enabled, agc_mode);
2904 EXPECT_FALSE(agc_enabled);
2905
2906 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002907 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2908 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07002909 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002910 voe_.GetAgcStatus(agc_enabled, agc_mode);
2911 EXPECT_TRUE(agc_enabled);
2912 voe_.GetAgcConfig(agc_config);
2913 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2914
2915 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002916 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2917 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2918 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2919 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002920 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002921 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002922 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2923 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2924 EXPECT_FALSE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002925 EXPECT_FALSE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926 EXPECT_FALSE(typing_detection_enabled);
2927 EXPECT_TRUE(stereo_swapping_enabled);
2928
solenberg1ac56142015-10-13 03:58:19 -07002929 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07002930 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002931 voe_.GetEcStatus(ec_enabled, ec_mode);
2932 voe_.GetNsStatus(ns_enabled, ns_mode);
2933 EXPECT_TRUE(ec_enabled);
2934 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2935 EXPECT_FALSE(ns_enabled);
2936 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2937}
2938
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002939TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002940 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941
2942 bool ec_enabled;
2943 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 bool agc_enabled;
2945 webrtc::AgcModes agc_mode;
2946 bool ns_enabled;
2947 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002948 bool stereo_swapping_enabled;
2949 bool typing_detection_enabled;
2950
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002951 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002952 voe_.GetAgcStatus(agc_enabled, agc_mode);
2953 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002954 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2955 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2956 EXPECT_TRUE(ec_enabled);
2957 EXPECT_TRUE(agc_enabled);
2958 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002959 EXPECT_TRUE(IsHighPassFilterEnabled());
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002960 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002961 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002962}
2963
2964TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2965 webrtc::AgcConfig set_config = {0};
2966 set_config.targetLeveldBOv = 3;
2967 set_config.digitalCompressionGaindB = 9;
2968 set_config.limiterEnable = true;
2969 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002970
2971 webrtc::AgcConfig config = {0};
2972 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2973 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2974 EXPECT_EQ(set_config.digitalCompressionGaindB,
2975 config.digitalCompressionGaindB);
2976 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2977}
2978
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002979TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002980 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002981 EXPECT_CALL(adm_,
2982 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2983 EXPECT_CALL(adm_,
2984 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2985 EXPECT_CALL(adm_,
2986 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07002987 EXPECT_CALL(adm_,
2988 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
2989 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
2990 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
2991 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
2992 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07002993
kwiberg686a8ef2016-02-26 03:00:35 -08002994 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002995 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002996 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002997 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002998 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002999 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003000
3001 // Have to add a stream to make SetSend work.
3002 cricket::StreamParams stream1;
3003 stream1.ssrcs.push_back(1);
3004 channel1->AddSendStream(stream1);
3005 cricket::StreamParams stream2;
3006 stream2.ssrcs.push_back(2);
3007 channel2->AddSendStream(stream2);
3008
3009 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003010 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003011 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3012 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3013 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003014 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003015 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07003016 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003017 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018
3019 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003020 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003021 parameters_options_no_ns.options.noise_suppression =
3022 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003023 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003024 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003025 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3026 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3027 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003028 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003029
3030 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003031 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003032 parameters_options_no_agc.options.auto_gain_control =
3033 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003034 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003035 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3036 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3037 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003038 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003039
solenberg059fb442016-10-26 05:12:24 -07003040 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003041 bool ec_enabled;
3042 webrtc::EcModes ec_mode;
3043 bool agc_enabled;
3044 webrtc::AgcModes agc_mode;
3045 bool ns_enabled;
3046 webrtc::NsModes ns_mode;
3047 voe_.GetEcStatus(ec_enabled, ec_mode);
3048 voe_.GetAgcStatus(agc_enabled, agc_mode);
3049 voe_.GetNsStatus(ns_enabled, ns_mode);
3050 EXPECT_TRUE(ec_enabled);
3051 EXPECT_TRUE(agc_enabled);
3052 EXPECT_TRUE(ns_enabled);
3053
solenberg059fb442016-10-26 05:12:24 -07003054 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003055 voe_.GetEcStatus(ec_enabled, ec_mode);
3056 voe_.GetAgcStatus(agc_enabled, agc_mode);
3057 voe_.GetNsStatus(ns_enabled, ns_mode);
3058 EXPECT_TRUE(ec_enabled);
3059 EXPECT_TRUE(agc_enabled);
3060 EXPECT_FALSE(ns_enabled);
3061
solenberg059fb442016-10-26 05:12:24 -07003062 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003063 voe_.GetEcStatus(ec_enabled, ec_mode);
3064 voe_.GetAgcStatus(agc_enabled, agc_mode);
3065 voe_.GetNsStatus(ns_enabled, ns_mode);
3066 EXPECT_TRUE(ec_enabled);
3067 EXPECT_FALSE(agc_enabled);
3068 EXPECT_TRUE(ns_enabled);
3069
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003070 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003071 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3072 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3073 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003074 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3075 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003076 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003077 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003078 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003079 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003080 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003081 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01003082 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3083 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3084 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003085 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003086 voe_.GetEcStatus(ec_enabled, ec_mode);
3087 voe_.GetAgcStatus(agc_enabled, agc_mode);
3088 voe_.GetNsStatus(ns_enabled, ns_mode);
3089 EXPECT_TRUE(ec_enabled);
3090 EXPECT_FALSE(agc_enabled);
3091 EXPECT_FALSE(ns_enabled);
3092}
3093
wu@webrtc.orgde305012013-10-31 15:40:38 +00003094// This test verifies DSCP settings are properly applied on voice media channel.
3095TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003096 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003097 cricket::FakeNetworkInterface network_interface;
3098 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003099 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003100
solenberg059fb442016-10-26 05:12:24 -07003101 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3102 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3103
solenbergbc37fc82016-04-04 09:54:44 -07003104 channel.reset(
3105 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003106 channel->SetInterface(&network_interface);
3107 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3108 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3109
3110 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003111 channel.reset(
3112 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003113 channel->SetInterface(&network_interface);
3114 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3115
3116 // Verify that setting the option to false resets the
3117 // DiffServCodePoint.
3118 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003119 channel.reset(
3120 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003121 channel->SetInterface(&network_interface);
3122 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3123 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3124
3125 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003126}
3127
solenberg1ac56142015-10-13 03:58:19 -07003128TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003129 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003130 cricket::WebRtcVoiceMediaChannel* media_channel =
3131 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003132 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003133 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003134 int channel_id = voe_.GetLastChannel();
3135 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3136 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003137 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003138 int channel_id2 = voe_.GetLastChannel();
3139 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003140}
3141
solenberg1ac56142015-10-13 03:58:19 -07003142TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003143 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003144 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003145 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3146 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3147 EXPECT_TRUE(channel_->AddSendStream(
3148 cricket::StreamParams::CreateLegacy(kSsrc1)));
3149 int channel_id = voe_.GetLastChannel();
3150 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3151 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3152 EXPECT_TRUE(channel_->AddSendStream(
3153 cricket::StreamParams::CreateLegacy(kSsrc2)));
3154 int channel_id2 = voe_.GetLastChannel();
3155 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003156}
3157
solenberg4bac9c52015-10-09 02:32:53 -07003158TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003159 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003160 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003161 cricket::StreamParams stream;
3162 stream.ssrcs.push_back(kSsrc2);
3163 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003164 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003165 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003166 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003167}
3168
3169TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003170 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003171 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3172 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003173 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003174 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003175 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3176 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3177 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003178}
3179
pbos8fc7fa72015-07-15 08:02:58 -07003180TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003181 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003182 const std::string kSyncLabel = "AvSyncLabel";
3183
solenbergff976312016-03-30 23:28:51 -07003184 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003185 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3186 sp.sync_label = kSyncLabel;
3187 // Creating two channels to make sure that sync label is set properly for both
3188 // the default voice channel and following ones.
3189 EXPECT_TRUE(channel_->AddRecvStream(sp));
3190 sp.ssrcs[0] += 1;
3191 EXPECT_TRUE(channel_->AddRecvStream(sp));
3192
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003193 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003194 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003195 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003196 << "SyncGroup should be set based on sync_label";
3197 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003198 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003199 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003200}
3201
solenberg3a941542015-11-16 07:34:50 -08003202// TODO(solenberg): Remove, once recv streams are configured through Call.
3203// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003204TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003205 // Test that setting the header extensions results in the expected state
3206 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003207 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003208 ssrcs.push_back(223);
3209 ssrcs.push_back(224);
3210
solenbergff976312016-03-30 23:28:51 -07003211 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003212 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003213 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003214 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003215 cricket::StreamParams::CreateLegacy(ssrc)));
3216 }
3217
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003218 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003219 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003220 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003221 EXPECT_NE(nullptr, s);
3222 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3223 }
3224
3225 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003226 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003227 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003228 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003229 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003230 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003231 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003232 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003233 EXPECT_NE(nullptr, s);
3234 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003235 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3236 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003237 for (const auto& s_ext : s_exts) {
3238 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003239 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003240 }
3241 }
3242 }
3243 }
3244
3245 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003246 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003247 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003248 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003249 EXPECT_NE(nullptr, s);
3250 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3251 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003252}
3253
3254TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3255 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003256 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003257 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003258 static const unsigned char kRtcp[] = {
3259 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3260 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3263 };
jbaucheec21bd2016-03-20 06:15:43 -07003264 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003265
solenbergff976312016-03-30 23:28:51 -07003266 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003267 cricket::WebRtcVoiceMediaChannel* media_channel =
3268 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003269 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003270 EXPECT_TRUE(media_channel->AddRecvStream(
3271 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3272
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003273 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003274 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003275 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003276 EXPECT_EQ(0, s->received_packets());
3277 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3278 EXPECT_EQ(1, s->received_packets());
3279 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3280 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003281}
Minyue2013aec2015-05-13 14:14:42 +02003282
solenberg0a617e22015-10-20 15:49:38 -07003283// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003284// since they do not send RTCP SR.
solenberg7602aab2016-11-14 11:30:07 -08003285TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
solenbergff976312016-03-30 23:28:51 -07003286 EXPECT_TRUE(SetupSendStream());
solenberg7602aab2016-11-14 11:30:07 -08003287 EXPECT_TRUE(AddRecvStream(kSsrc2));
3288 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3289 EXPECT_TRUE(channel_->AddSendStream(
3290 cricket::StreamParams::CreateLegacy(kSsrc3)));
3291 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3292 EXPECT_TRUE(AddRecvStream(kSsrc4));
3293 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc4).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003294}
3295
solenberg7602aab2016-11-14 11:30:07 -08003296TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3297 EXPECT_TRUE(SetupRecvStream());
3298 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3299 EXPECT_TRUE(channel_->AddSendStream(
3300 cricket::StreamParams::CreateLegacy(kSsrc2)));
3301 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3302 EXPECT_TRUE(AddRecvStream(kSsrc3));
3303 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
3304 EXPECT_TRUE(channel_->AddSendStream(
3305 cricket::StreamParams::CreateLegacy(kSsrc4)));
3306 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3307 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003308}
stefan658910c2015-09-03 05:48:32 -07003309
deadbeef884f5852016-01-15 09:20:04 -08003310TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003311 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003312 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3313 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003314
3315 // Setting the sink before a recv stream exists should do nothing.
3316 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003317 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003318 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3319
3320 // Now try actually setting the sink.
3321 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3322 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3323
3324 // Now try resetting it.
3325 channel_->SetRawAudioSink(kSsrc1, nullptr);
3326 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3327}
3328
3329TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003330 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003331 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3332 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003333
3334 // Should be able to set a default sink even when no stream exists.
3335 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3336
3337 // Create default channel and ensure it's assigned the default sink.
3338 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3339 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3340
3341 // Try resetting the default sink.
3342 channel_->SetRawAudioSink(0, nullptr);
3343 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3344
3345 // Try setting the default sink while the default stream exists.
3346 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3347 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3348
3349 // If we remove and add a default stream, it should get the same sink.
3350 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3351 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3352 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3353}
3354
skvlad7a43d252016-03-22 15:32:27 -07003355// Test that, just like the video channel, the voice channel communicates the
3356// network state to the call.
3357TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003358 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003359
3360 EXPECT_EQ(webrtc::kNetworkUp,
3361 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3362 EXPECT_EQ(webrtc::kNetworkUp,
3363 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3364
3365 channel_->OnReadyToSend(false);
3366 EXPECT_EQ(webrtc::kNetworkDown,
3367 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3368 EXPECT_EQ(webrtc::kNetworkUp,
3369 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3370
3371 channel_->OnReadyToSend(true);
3372 EXPECT_EQ(webrtc::kNetworkUp,
3373 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3374 EXPECT_EQ(webrtc::kNetworkUp,
3375 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3376}
3377
aleloi18e0b672016-10-04 02:45:47 -07003378// Test that playout is still started after changing parameters
3379TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3380 SetupRecvStream();
3381 channel_->SetPlayout(true);
3382 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3383
3384 // Changing RTP header extensions will recreate the AudioReceiveStream.
3385 cricket::AudioRecvParameters parameters;
3386 parameters.extensions.push_back(
3387 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3388 channel_->SetRecvParameters(parameters);
3389
3390 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3391}
3392
stefan658910c2015-09-03 05:48:32 -07003393// Tests that the library initializes and shuts down properly.
3394TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003395 // If the VoiceEngine wants to gather available codecs early, that's fine but
3396 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003397 cricket::WebRtcVoiceEngine engine(
3398 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003399 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003400 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003401 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003402 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3403 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003404 EXPECT_TRUE(channel != nullptr);
3405 delete channel;
solenbergff976312016-03-30 23:28:51 -07003406}
stefan658910c2015-09-03 05:48:32 -07003407
solenbergff976312016-03-30 23:28:51 -07003408// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003409TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3410 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3411 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3412 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003413 {
ossuc54071d2016-08-17 02:45:41 -07003414 cricket::WebRtcVoiceEngine engine(
3415 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003416 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003417 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003418 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003419 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3420 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3421 EXPECT_TRUE(channel != nullptr);
3422 delete channel;
3423 }
stefan658910c2015-09-03 05:48:32 -07003424}
3425
3426// Tests that the library is configured with the codecs we want.
3427TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003428 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3429 // module.
3430
stefan658910c2015-09-03 05:48:32 -07003431 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003432 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003433 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003434 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003435 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003436 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003437 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003438 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003439 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003440 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003441 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003442 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003443 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003444 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003445 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003446 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003447 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003448 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
solenberg2779bab2016-11-17 04:45:19 -08003449 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3450 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3451 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3452 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3453 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3454 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003455 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003456 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003457 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003458 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003459 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003460 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003461 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003462 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003463 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003464 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003465 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003466 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003467 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003468 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003469 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003470 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003471 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003472 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003473 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003474 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003475 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003476 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003477 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003478
stefan658910c2015-09-03 05:48:32 -07003479 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003480 // TODO(ossu): Why are the payload types of codecs with non-static payload
3481 // type assignments checked here? It shouldn't really matter.
3482 cricket::WebRtcVoiceEngine engine(
3483 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
solenberg2779bab2016-11-17 04:45:19 -08003484 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3485 if (codec.name == "CN" && codec.clockrate == 16000) {
3486 EXPECT_EQ(105, codec.id);
3487 } else if (codec.name == "CN" && codec.clockrate == 32000) {
3488 EXPECT_EQ(106, codec.id);
3489 } else if (codec.name == "ISAC" && codec.clockrate == 16000) {
3490 EXPECT_EQ(103, codec.id);
3491 } else if (codec.name == "ISAC" && codec.clockrate == 32000) {
3492 EXPECT_EQ(104, codec.id);
3493 } else if (codec.name == "G722" && codec.clockrate == 8000) {
3494 EXPECT_EQ(9, codec.id);
3495 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) {
3496 EXPECT_EQ(126, codec.id);
3497 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3498 // Remove these checks once both send and receive side assigns payload types
3499 // dynamically.
3500 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) {
3501 EXPECT_EQ(113, codec.id);
3502 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) {
3503 EXPECT_EQ(112, codec.id);
3504 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) {
3505 EXPECT_EQ(110, codec.id);
3506 } else if (codec.name == "opus") {
3507 EXPECT_EQ(111, codec.id);
3508 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3509 EXPECT_EQ("10", codec.params.find("minptime")->second);
3510 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3511 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
stefan658910c2015-09-03 05:48:32 -07003512 }
3513 }
stefan658910c2015-09-03 05:48:32 -07003514}
3515
3516// Tests that VoE supports at least 32 channels
3517TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003518 cricket::WebRtcVoiceEngine engine(
3519 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003520 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003521 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003522 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003523
3524 cricket::VoiceMediaChannel* channels[32];
3525 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003526 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003527 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3528 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003529 if (!channel)
3530 break;
stefan658910c2015-09-03 05:48:32 -07003531 channels[num_channels++] = channel;
3532 }
3533
tfarina5237aaf2015-11-10 23:44:30 -08003534 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003535 EXPECT_EQ(expected, num_channels);
3536
3537 while (num_channels > 0) {
3538 delete channels[--num_channels];
3539 }
stefan658910c2015-09-03 05:48:32 -07003540}
3541
3542// Test that we set our preferred codecs properly.
3543TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003544 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3545 // - Check that our builtin codecs are usable by Channel.
3546 // - The codecs provided by the engine is usable by Channel.
3547 // It does not check that the codecs in the RecvParameters are actually
3548 // what we sent in - though it's probably reasonable to expect so, if
3549 // SetRecvParameters returns true.
3550 // I think it will become clear once audio decoder injection is completed.
3551 cricket::WebRtcVoiceEngine engine(
3552 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003553 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003554 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003555 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003556 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3557 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003558 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003559 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003560 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003561}